如何通过rosserial在Arduino(Teensy 4.1)上发布Int16MultiArray消息
问题根源
rosserial_arduino框架中,std_msgs::Int16MultiArray类型包含两个核心成员:
data:short*类型,指向数组存储的内存地址data_length:uint32_t类型,标识数组的有效长度
你所有报错和异常都是因为没有正确初始化这两个成员导致的:
- 直接赋值局部数组指针:未设置
data_length,rosserial默认按长度0发送,因此rostopic无数据 - 直接对
data[0]赋值:data指针未指向合法内存,野指针访问触发内存越界,导致Teensy串口崩溃 - 初始化列表赋值:C++语法不支持将brace列表直接赋值给指针变量,因此编译报错
解决代码
使用静态数组预分配内存,避免嵌入式环境动态内存风险,完整可运行代码如下:
#include <std_msgs/Int16MultiArray.h> ros::NodeHandle nh; std_msgs::Int16MultiArray wheel_ticks; ros::Publisher wheel_ticks_pub("wheel_ticks", &wheel_ticks); // 预分配固定大小的数组存储轮速数据 short wheel_tick_buf[4]; void setup() { nh.getHardware()->setBaud(115200); nh.initNode(); nh.advertise(wheel_ticks_pub); // 初始化MultiArray的数组指针和长度 wheel_ticks.data = wheel_tick_buf; wheel_ticks.data_length = 4; // 如果接收端需要校验MultiArray布局,可添加如下配置,不需要可省略 wheel_ticks.layout.dim_length = 1; wheel_ticks.layout.dim[0].size = 4; wheel_ticks.layout.dim[0].stride = 4; wheel_ticks.layout.dim[0].label = "wheel_ticks"; } void loop() { // 直接给预分配的数组赋值即可 wheel_tick_buf[0] = 0; wheel_tick_buf[1] = 100; wheel_tick_buf[2] = 0; wheel_tick_buf[3] = 0; wheel_ticks_pub.publish(&wheel_ticks); nh.spinOnce(); delay(10); // 按需调整发布频率,避免总线拥堵 }
验证方法
烧录完成后,运行rosserial节点,执行rostopic echo /wheel_ticks即可看到正确的数组数据。
内容的提问来源于stack exchange,提问作者nbaddorf
相关产品推荐
相关产品推荐

