Skip to content

Commit 8d23f6c

Browse files
authored
Merge pull request #41 from arduino/fix_quaternion
Fix quaternion data parsing
2 parents a656f7a + 817a51e commit 8d23f6c

File tree

4 files changed

+36
-23
lines changed

4 files changed

+36
-23
lines changed

examples/Standalone/Standalone.ino

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ SensorXYZ accel(SENSOR_ID_ACC);
1212
SensorXYZ gyro(SENSOR_ID_GYRO);
1313
Sensor temp(SENSOR_ID_TEMP);
1414
Sensor gas(SENSOR_ID_GAS);
15+
SensorQuaternion rotation(SENSOR_ID_RV);
1516

1617
void setup()
1718
{
@@ -24,6 +25,7 @@ void setup()
2425
gyro.begin();
2526
temp.begin();
2627
gas.begin();
28+
rotation.begin();
2729
}
2830

2931
void loop()
@@ -40,5 +42,6 @@ void loop()
4042
Serial.println(String("gyroscope: ") + gyro.toString());
4143
Serial.println(String("temperature: ") + String(temp.value(),3));
4244
Serial.println(String("gas: ") + String(gas.value(),3));
45+
Serial.println(String("rotation: ") + rotation.toString());
4346
}
4447
}

src/sensors/DataParser.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ void DataParser::parseEuler(SensorDataPacket& data, DataOrientation& vector) {
1616
parseEuler(data, vector, 1.f);
1717
}
1818

19-
void DataParser::parseQuaternion(SensorDataPacket& data, DataQuaternion& vector) {
20-
vector.x = data.getInt16(0);
21-
vector.y = data.getInt16(2);
22-
vector.z = data.getInt16(4);
23-
vector.w = data.getInt16(6);
24-
vector.accuracy = data.getUint16(8);
19+
void DataParser::parseQuaternion(SensorDataPacket& data, DataQuaternion& vector, float scaleFactor) {
20+
vector.x = data.getInt16(0) * scaleFactor;
21+
vector.y = data.getInt16(2) * scaleFactor;
22+
vector.z = data.getInt16(4) * scaleFactor;
23+
vector.w = data.getInt16(6) * scaleFactor;
24+
vector.accuracy = data.getUint16(8) * scaleFactor;
2525
}
2626

2727
void DataParser::parseBSEC(SensorDataPacket& data, DataBSEC& vector) {

src/sensors/DataParser.h

+11-11
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@ struct DataOrientation {
3030
};
3131

3232
struct DataQuaternion {
33-
int16_t x;
34-
int16_t y;
35-
int16_t z;
36-
int16_t w;
37-
uint16_t accuracy;
33+
float x;
34+
float y;
35+
float z;
36+
float w;
37+
float accuracy;
3838

3939
String toString() {
40-
return (String)("Quaternion values - X: " + String(x)
41-
+ " Y: " + String(y)
42-
+ " Z: " + String(z)
43-
+ " W: " + String(w)
44-
+ " Accuracy: " + String(accuracy)
40+
return (String)("Quaternion values - X: " + String(x, 3)
41+
+ " Y: " + String(y, 3)
42+
+ " Z: " + String(z, 3)
43+
+ " W: " + String(w, 3)
44+
+ " Accuracy: " + String(accuracy, 3)
4545
+ "\n");
4646
}
4747
};
@@ -75,7 +75,7 @@ class DataParser {
7575
static void parse3DVector(SensorDataPacket& data, DataXYZ& vector);
7676
static void parseEuler(SensorDataPacket& data, DataOrientation& vector);
7777
static void parseEuler(SensorDataPacket& data, DataOrientation& vector, float scaleFactor);
78-
static void parseQuaternion(SensorDataPacket& data, DataQuaternion& vector);
78+
static void parseQuaternion(SensorDataPacket& data, DataQuaternion& vector, float scaleFactor);
7979
static void parseBSEC(SensorDataPacket& data, DataBSEC& vector);
8080
static void parseBSECLegacy(SensorDataPacket& data, DataBSEC& vector);
8181
static void parseData(SensorDataPacket& data, float& value, float scaleFactor, SensorPayload format);

src/sensors/SensorQuaternion.h

+16-6
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,37 @@
66
class SensorQuaternion : public SensorClass {
77
public:
88
SensorQuaternion() {}
9-
SensorQuaternion(uint8_t id) : SensorClass(id), _data() {}
9+
SensorQuaternion(uint8_t id) : SensorClass(id), _data(), _factor(0.000061035) {}
1010

11-
int16_t x()
11+
float x()
1212
{
1313
return _data.x;
1414
}
15-
int16_t y()
15+
float y()
1616
{
1717
return _data.y;
1818
}
19-
int16_t z()
19+
float z()
2020
{
2121
return _data.z;
2222
}
23-
int16_t w()
23+
float w()
2424
{
2525
return _data.w;
2626
}
27+
float accuracy()
28+
{
29+
return _data.accuracy;
30+
}
31+
32+
float getFactor()
33+
{
34+
return _factor;
35+
}
2736

2837
void setData(SensorDataPacket &data)
2938
{
30-
DataParser::parseQuaternion(data, _data);
39+
DataParser::parseQuaternion(data, _data, _factor);
3140
}
3241

3342
String toString()
@@ -36,6 +45,7 @@ class SensorQuaternion : public SensorClass {
3645
}
3746

3847
private:
48+
float _factor;
3949
DataQuaternion _data;
4050
};
4151

0 commit comments

Comments
 (0)