ROS消息-数组(固定长度与可变长度)及结构体实例
说明
当利用ROS创建节点进行CAN通信时,单个can报文的消息格式通常为:
candata.msg
uint32 id
uint8[8] data//这里采用固定长度数组
由于CAN通信同时需要收发多条can报文,需要采用结构体数组的消息格式,可以定义为:
candata_multi.msg
candata[] frame//这里采用固定长度数组
单消息报文的发布和订阅
Publisher:
#include "ros/ros.h"
#include <canbus/candata.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "cansend");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<canbus::candata>("chatter", 2000);
uint8_t i=0;
uint8_t j=0;
ros::Rate loop_rate(1);
while (ros::ok())
{
canbus::candata msg;
for(i=0;i<8;i++)
msg.data[i]=i;
msg.id =i++;
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
Subscriber:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <canbus/candata.h>
void chatterCallback(const canbus::candata::ConstPtr& msg)
{
boost::array<uint8_t, 8> arr=msg->data;
ROS_INFO("I heard: %d", arr[0]);
ROS_INFO("I heard: %x", msg->id);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "test");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 2000, chatterCallback);
ros::spin();
return 0;
}
显示结果:
结构体数组消息报文的发布和订阅
Publisher:
#include "ros/ros.h"
#include <canbus/candata.h>
#include <canbus/candata_multi.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "cansend");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<canbus::candata_multi>("chatter", 2000);
uint8_t j=0;
ros::Rate loop_rate(1);
while (ros::ok())
{
canbus::candata msg;
canbus::candata_multi msg_multi;
for(uint8_t i=0;i<8;i++)
msg.data[i]=i;
msg.id =j++;
msg_multi.frame.push_back(msg);
msg.id =j++;
msg_multi.frame.push_back(msg);
msg.id =j++;
msg_multi.frame.push_back(msg);
chatter_pub.publish(msg_multi);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
Subscriber:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <canbus/candata.h>
#include <canbus/candata_multi.h>
void chatterCallback(const canbus::candata_multi::ConstPtr& msg)
{
for(uint8_t i=0;i<msg->frame.size();i++){
boost::array<uint8_t, 8> arr=msg->frame[i].data;
ROS_INFO("I heard: %d", arr[0]);
ROS_INFO("I heard: %x", msg->frame[i].id);
}
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "test");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 2000, chatterCallback);
ros::spin();
return 0;
}
显示结果:
总结
1.固定长度数组,可以直接对元素进行赋值;订阅时,需要利用boost::array来进行接收,否则会报segmentation fault(段错误);
2.可利用消息嵌套定义实现结构体数组形式的消息;
3.对于可变长度数组,需要利用push_back函数实现赋值,接收时需要判断可变数组的size大小.
参考
1.https://answers.ros.org/question/60614/how-to-publish-a-vector-of-unknown-length-of-structs-in-ros/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)