ROS消息-数组(固定长度与可变长度)及结构体实例

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;//fixed length array, need to use boost::array
  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;//fixed length array, need to use boost::array
  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/

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值