GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
serial_imu_codec.hpp
1#pragma once
2
3#include <bit>
4#include <cmath>
5#include <cstdint>
6#include <optional>
7#include <span>
8
9#include "device/imu/base.hpp"
10
11namespace roboctrl::device {
12
15 float yaw, pitch, roll, yaw_v, pitch_v, roll_v;
16};
17
18inline std::optional<serial_imu_packet> decode_serial_imu(std::span<const std::byte> bytes) {
19 if (bytes.size() != 24) return std::nullopt;
20 float values[6]{};
21 for (std::size_t i = 0; i < 6; ++i) {
22 std::uint32_t bits{};
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;
27 }
28 return serial_imu_packet{values[0], values[1], values[2], values[3], values[4], values[5]};
29}
30
32 euler_angle angle;
33 three_axis gyro;
34};
35
37inline std::optional<serial_imu_sample> convert_serial_imu(
38 const serial_imu_packet& packet, three_axis angle_sign,
39 three_axis rate_sign, float gyro_scale) {
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;
44 const three_axis gyro{
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))
50 return std::nullopt;
51 return serial_imu_sample{
52 .angle = {utils::rad_format(roll), utils::rad_format(pitch), utils::rad_format(yaw)},
53 .gyro = gyro};
54}
55
56}
IMU 抽象基类。
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]范围内
Definition utils.hpp:99
以弧度表示的欧拉角快照。
Definition base.hpp:15
三轴物理量快照。
Definition base.hpp:17
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。
Definition utils.hpp:34