15 float yaw, pitch, roll, yaw_v, pitch_v, roll_v;
18inline std::optional<serial_imu_packet> decode_serial_imu(std::span<const std::byte> bytes) {
19 if (bytes.size() != 24)
return std::nullopt;
21 for (std::size_t i = 0; i < 6; ++i) {
23 for (std::size_t j = 0; j < 4; ++j)
24 bits |= std::uint32_t(std::to_integer<unsigned char>(bytes[4 * i + j])) << (8 * j);
25 values[i] = std::bit_cast<float>(bits);
26 if (!std::isfinite(values[i]))
return std::nullopt;
28 return serial_imu_packet{values[0], values[1], values[2], values[3], values[4], values[5]};
40 constexpr float radians_per_degree =
Pi_f / 180.0f;
41 const float roll = packet.roll * radians_per_degree * angle_sign.x;
42 const float pitch = packet.pitch * radians_per_degree * angle_sign.y;
43 const float yaw = packet.yaw * radians_per_degree * angle_sign.z;
45 packet.roll_v * gyro_scale * rate_sign.x,
46 packet.pitch_v * gyro_scale * rate_sign.y,
47 packet.yaw_v * gyro_scale * rate_sign.z};
48 if (!std::isfinite(roll) || !std::isfinite(pitch) || !std::isfinite(yaw) ||
49 !std::isfinite(gyro.x) || !std::isfinite(gyro.y) || !std::isfinite(gyro.z))
std::optional< serial_imu_sample > convert_serial_imu(const serial_imu_packet &packet, three_axis angle_sign, three_axis rate_sign, float gyro_scale)
constexpr fp32 rad_format(fp32 ang)
将角度限制到[-Pi,Pi]范围内
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。