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

rosserial Arduino端MultiArray订阅回调无法触发问题求助

环境
  • ROS发行版:Noetic
  • Arduino开发板:Arduino Mega2560
问题描述

使用rosserial库进行串口通信时,std_msgs/Int32、std_msgs/Int16等基础数据类型通信正常,回调函数可正常触发。但发送std_msgs/Int16MultiArray和std_msgs/Int32MultiArray类型数据时,Arduino端订阅节点的回调函数无法触发。

代码

ROS端int32MultiArrayTest.cpp

#include <ros/ros.h>
#include <std_msgs/Int32MultiArray.h>

void sub_cb(const std_msgs::Int32MultiArray::ConstPtr &msg) {
  ROS_INFO("Result: %d %d %d %d", msg->data[0], msg->data[1], msg->data[2],
           msg->data[3]);
  //   ROS_INFO("Steps: %d", msg->data);
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "/int32_node");
  ros::NodeHandle nh;
  ros::Publisher pub =
      nh.advertise<std_msgs::Int32MultiArray>("/int32_topic", 5);
  ros::Subscriber sub =
      nh.subscribe<std_msgs::Int32MultiArray>("/arduino_add", 5, sub_cb);
  ros::Rate loop_rate(1);
  std_msgs::Int32MultiArray msg;
  msg.data = {1, 2, 3, 4};
  msg.layout.dim.push_back(std_msgs::MultiArrayDimension());
  msg.layout.dim[0].size = 4;
  msg.layout.dim[0].label="Steps";
  msg.layout.dim[0].stride=1;
  while (ros::ok()) {
    pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

launch文件run_int32test.launch

<launch>
    <node pkg="rosserial_arduino" type="serial_node.py" name="serial_interface" respawn="true"
        output="screen">
        <param name="port" value="/dev/ttyACM0" />
        <param name="baud" value="9600" />
    </node>
    <node pkg="scara_control" type="int32test" name="test_int32_arduino" respawn="true"
        output="screen">
    </node>
</launch>

Arduino端rosSerialTest.ino

#include <Arduino.h>
#include <ros.h>
#include <std_msgs/Int32MultiArray.h>

#define LED_PIN 9

std_msgs::Int32MultiArray sum_msg;

ros::NodeHandle nh;

ros::Publisher pub("/arduino_add", &sum_msg);

long steps[4] = {0, 0, 0, 0};

void messageCb(const std_msgs::Int32MultiArray &msg) {
  digitalWrite(LED_PIN, HIGH);
  for (size_t i = 0; i < 4; i++)
    steps[i] = msg.data[i];
}

ros::Subscriber<std_msgs::Int32MultiArray> sub("/int32_topic", &messageCb);

void setup() {
  pinMode(LED_PIN, LOW);
  digitalWrite(LED_PIN, LOW);
  nh.getHardware()->setBaud(9600);
  nh.initNode();
  nh.advertise(pub);
  nh.subscribe(sub);
  nh.spinOnce();
  delay(1);
}

void loop() {
  sum_msg.data = steps;
  sum_msg.data_length = 4;
  pub.publish(&sum_msg);
  nh.spinOnce();
  delay(1);
}
已尝试操作
  1. 运行上述代码后,输出结果:
[INFO][1716035508.688977485]: Result: 0 0 0 0
[INFO][1716035508.688985089]: Result: 0 0 0 0
[INFO][1716035508.689395577]: Result: 0 0 0 0
[INFO][1716035508.689496259]: Result: 0 0 0 0
  1. 将数据类型改为std_msgs/Int16MultiArray编译运行,初始输出同上;等待至少2分钟后,Arduino端回调触发,输出:
[INFO][1716035508.688977485]: Result: 1 2 3 4
[INFO][1716035508.688985089]: Result: 1 2 3 4
[INFO][1716035508.689395577]: Result: 1 2 3 4
[INFO][1716035508.689496259]: Result: 1 2 3 4
  1. 单独测试Arduino发送std_msgs/Int32MultiArray数据,主机可正常接收;但单独主机发送该类型数据时,Arduino回调未触发,LED未点亮。
提前致谢

感谢各位的帮助!任何建议都将不胜感激。问题解决后我会更新内容,供他人参考。

内容的提问来源于stack exchange,提问作者weidong bu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:17:32