You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:09:02