GR-Sensor
1. 概述
GR-Sensor 是传感器数据发布层。运行时服务 fouriersensor 从机身 IMU 读取姿态、角速度和线加速度,也可从头部 Orbbec Gemini 335L 获取 RGB 图像、深度图像及相机内参,并通过 DDS 发布。本页描述 GRW 当前可用的 IMU 与相机 topic 协议。
| 元素 | 数值 |
|---|---|
| Domain ID | 123 |
| 硬件访问 | fouriersensor 运行时以 root 访问设备文件;订阅端普通用户即可 |
| 当前支持 | IMU、头部 RGB-D 相机 |
| IMU Topic | Imu_state |
| 相机 Topic 前缀 | /camera/head_downward |
运行环境
fouriersensor 在机器人上以系统用户运行。二开订阅脚本以普通用户运行即可,无需 root/sudo;但必须在创建任何 DDS participant 前设置:
Bash
export FASTDDS_BUILTIN_TRANSPORTS=UDPv4
否则 Fast DDS 可能选择同机共享内存传输,出现端点已匹配但收不到数 据(或间歇性收不到)的情况。下文 Python 示例已内置该设置。
2. DDS 接口
2.1 Topics
IMU
| Topic | 消息类型 | 说明 |
|---|---|---|
Imu_state | fourier_msgs_pod/msg/Imu | 机身 IMU,默认 topic |
头部 RGB-D 相机
| Topic | 消息类型 | 说明 |
|---|---|---|
/camera/head_downward/rgb/image_compressed | sensor_msgs_pod/msg/ImagePod3m | RGB JPEG 图像,默认发布 |
/camera/head_downward/depth/image_raw | sensor_msgs_pod/msg/ImagePod3m | 对齐到 RGB 坐标系的深度图,默认编码为 16UC1,单位为毫米 |
/camera/head_downward/rgb/camera_info | sensor_msgs/msg/CameraInfo | RGB 相机内参及畸变参数 |
/camera/head_downward/depth/camera_info | sensor_msgs/msg/CameraInfo | 深度相机内参;启用深度到 RGB 对齐后与 RGB 图像使用相同坐标系 |
/camera/head_downward/rgb/image_raw | sensor_msgs_pod/msg/ImagePod3m | 未压缩 RGB 图像,仅在 publish_rgb_raw 启用时发布 |
相机图像是大数据量实时流,订阅端应使用 Best Effort QoS;大数据流在 Best Effort 下的接收速率会低于发布速率(例如 10 Hz 发布的深度流接收约 4 Hz),属正常现象,不要用接收计数当作发布频率判据。ImagePod3m.data 是固定容量数组,实际有效长度以 data_size 为准;Python 绑定不支持对 data 做部分切片(只能整段切片或按索引逐元素读取),处理像素时应按 data_size 用索引访问。
2.2 IDL 定义
Imu
Idl
// fourier_msgs_pod/msg/Imu —— 机身 IMU
struct Imu {
HeaderPod header;
TracePointList trace_points;
Quaternion orientation; // x, y, z, w
double orientation_covariance[9];
Vector3 angular_velocity; // rad/s
double angular_velocity_covariance[9];
Vector3 linear_acceleration; // m/s^2
double linear_acceleration_covariance[9];
Vector3 bias_vector; // 机器人 yaw 方向偏置向量
};
ImagePod3m
Idl
// sensor_msgs_pod/msg/ImagePod3m —— RGB 或深度图像
typedef uint8 ImagePod3mData__3145728[3145728];
struct ImagePod3m {
HeaderPod header;
uint32 height;
uint32 width;
ShortString encoding; // 例如 jpeg、bgr8、16UC1
boolean is_bigendian;
uint32 step; // 每行字节数
ImagePod3mData__3145728 data;
uint32 data_size; // data 中的实际有效字节数
};
CameraInfo
Idl
// sensor_msgs/msg/CameraInfo —— 下列为各版本共有字段
struct CameraInfo {
Header header;
uint32 height;
uint32 width;
string distortion_model;
sequence<double> d; // 畸变参数
double k[9]; // 3x3 内参矩阵
double r[9]; // 3x3 校正矩阵
double p[12]; // 3x4 投影矩阵
uint32 binning_x;
uint32 binning_y;
RegionOfInterest roi;
};
部分较新的消息版本还包含相机型号、序列号和固件版本字段。为了兼容不同软件版本,下面的示例只访问共有字段。