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); }
已尝试操作
- 运行上述代码后,输出结果:
[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
- 将数据类型改为
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
- 单独测试Arduino发送
std_msgs/Int32MultiArray数据,主机可正常接收;但单独主机发送该类型数据时,Arduino回调未触发,LED未点亮。
提前致谢
感谢各位的帮助!任何建议都将不胜感激。问题解决后我会更新内容,供他人参考。
内容的提问来源于stack exchange,提问作者weidong bu
相关产品推荐
相关产品推荐

