Skip to content

Commit f4c903f

Browse files
committed
Acceleration and AngularVelocity telemetry working
1 parent 8e30497 commit f4c903f

File tree

3 files changed

+62
-16
lines changed

3 files changed

+62
-16
lines changed

FprimeZephyrReference/Components/Imu/Imu.cpp

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,18 @@ namespace Components {
1515
// ----------------------------------------------------------------------
1616

1717
Imu ::Imu(const char* const compName) : ImuComponentBase(compName) {
18+
// Initialize the LIS2MDL sensor
1819
lis2mdl = device_get_binding("LIS2MDL");
19-
FW_ASSERT(lis2mdl != nullptr);
2020
FW_ASSERT(device_is_ready(lis2mdl));
21+
22+
// Initialize the LSM6DSO sensor
23+
lsm6dso = DEVICE_DT_GET_ONE(st_lsm6dso);
24+
FW_ASSERT(device_is_ready(lsm6dso));
25+
26+
// Configure the LSM6DSO sensor
27+
struct sensor_value odr = {.val1 = 12, .val2 = 500000}; // 12.5 Hz
28+
FW_ASSERT(sensor_attr_set(lsm6dso, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0);
29+
FW_ASSERT(sensor_attr_set(lsm6dso, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0);
2130
}
2231

2332
Imu ::~Imu() {}
@@ -28,24 +37,54 @@ Imu ::~Imu() {}
2837

2938
void Imu ::run_handler(FwIndexType portNum, U32 context) {
3039
// Fetch new data sample
40+
sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ);
41+
sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ);
3142
sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ);
3243

33-
// Extract the data from the sample
34-
struct sensor_value magnetic_data_x;
35-
struct sensor_value magnetic_data_y;
36-
struct sensor_value magnetic_data_z;
37-
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_data_x);
38-
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_data_y);
39-
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_data_z);
44+
// Output the magnetic field values via telemetry
45+
this->tlmWrite_Acceleration(this->get_acceleration());
46+
this->tlmWrite_AngularVelocity(this->get_angular_velocity());
47+
this->tlmWrite_MagneticField(this->get_magnetic_field());
48+
}
4049

41-
// Convert to float values in gauss
42-
float magnetic_field_x = magnetic_data_x.val1 + magnetic_data_x.val2 / 1000000.0f;
43-
float magnetic_field_y = magnetic_data_y.val1 + magnetic_data_y.val2 / 1000000.0f;
44-
float magnetic_field_z = magnetic_data_z.val1 + magnetic_data_z.val2 / 1000000.0f;
50+
F64 Imu ::sensor_value_to_f64(const struct sensor_value& val) {
51+
return val.val1 + val.val2 / 1000000.0f;
52+
}
4553

46-
// Output the magnetic field values via telemetry
47-
this->tlmWrite_MagneticField(Components::Imu_MagneticField(
48-
static_cast<F64>(magnetic_field_x), static_cast<F64>(magnetic_field_y), static_cast<F64>(magnetic_field_z)));
54+
Components::Imu_Acceleration Imu ::get_acceleration() {
55+
struct sensor_value x;
56+
struct sensor_value y;
57+
struct sensor_value z;
58+
sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x);
59+
sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y);
60+
sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z);
61+
62+
return Components::Imu_Acceleration(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y),
63+
this->sensor_value_to_f64(z));
64+
}
65+
66+
Components::Imu_AngularVelocity Imu ::get_angular_velocity() {
67+
struct sensor_value x;
68+
struct sensor_value y;
69+
struct sensor_value z;
70+
sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x);
71+
sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y);
72+
sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z);
73+
74+
return Components::Imu_AngularVelocity(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y),
75+
this->sensor_value_to_f64(z));
76+
}
77+
78+
Components::Imu_MagneticField Imu ::get_magnetic_field() {
79+
struct sensor_value x;
80+
struct sensor_value y;
81+
struct sensor_value z;
82+
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x);
83+
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y);
84+
sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z);
85+
86+
return Components::Imu_MagneticField(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y),
87+
this->sensor_value_to_f64(z));
4988
}
5089

5190
} // namespace Components

FprimeZephyrReference/Components/Imu/Imu.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,14 @@ class Imu final : public ImuComponentBase {
4040
U32 context //!< The call order
4141
) override;
4242

43+
F64 sensor_value_to_f64(const struct sensor_value& val);
44+
45+
Components::Imu_Acceleration get_acceleration();
46+
Components::Imu_AngularVelocity get_angular_velocity();
47+
Components::Imu_MagneticField get_magnetic_field();
48+
4349
const struct device* lis2mdl;
50+
const struct device* lsm6dso;
4451
};
4552

4653
} // namespace Components

FprimeZephyrReference/Components/Imu/docs/sdd.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,4 @@ Add requirements in the chart below
6363
## Change Log
6464
| Date | Description |
6565
|---|---|
66-
|---| Initial Draft |
66+
|---| Initial Draft |

0 commit comments

Comments
 (0)