ROS-rosserial概述(5)

rosserial概述官网链接-Logging
rosserial概述官网链接-Limitations

1. 消息的记录(Logging)

与任何ROS节点一样,可以用合适的信息级别(verbosity level)记录消息。

rosserial将字符串转发到标准ROS网络并输出到rosout和其日志文件。

发送
字符串
标准ROS网络
日志
rosout

请注意,如果在设备连接到ROS之前记录信息,则记录的信息将丢失。

  • 请记住,对于低内存系统,这种日志记录代价非常大。
    • 在发送之前,需要将字符串存储在内存中。
    • 要获得更多节省内存的日志记录,请尝试定义一个自定义消息类型,其中包含需要发送的信息。然后,可以使用rostopic echo观察程序的状态。
//create your node
ros::NodeHandle nh;

//wait until you are actually connected
while (!nh.connected() ){
    nh.spinOnce();
}

//Now you can send all of the statements you want
//to be logged at the appropriate verbosity level
  nh.logdebug("Debug Statement");
  nh.loginfo("Program info");
  nh.logwarn("Warnings.");
  nh.logerror("Errors..");
  nh.logfatal("Fatalities!");

2. 限制

2.1 消息的大小,最大发布者/订阅者数

序列化和反序列化缓冲区的大小都有限。
0.2.0版本 :以前,两个缓冲区都限制为512字节,但这比一些较小的AVR(例如ATMEGA168)上可用的1k RAM大。 rosserial_arduino现在根据使用的芯片改变缓冲区大小:

AVR Model输入/输出缓冲区大小最大发布者/订阅者数
ATMEGA168150/150 bytes6/6
ATMEGA328P280/280 bytes25/25
All others512/512 bytes25/25

我们可以在ros.h中更改这些缓冲区大小

  • 方法是更改适合板子类型的typdef NodeHandle_的尖括号内的最后两个参数
    typedef中使用的模板参数可以在node_handle.h中找到。
  • 请注意,不要消耗过多的Arduino中有限的SRAM。

0.3.0版本 :不会传输大于缓冲区大小的消息。将传递ROS错误消息,告知消息是来自还是去往设备。

2.2 Float64

Arduino不支持64位浮点数据类型(有的板子会支持)。make_library生成的序列化/反序列化代码将自动把64位浮点数转换为32位数据类型,注意,可能会出现精度损失!

2.3 字符串

为了节省宝贵的AVR内存,字符串不会存储在消息实例中,而是存储为unsigned char *。 这有两个影响:

  1. 发布时,必须将字符串数据存储在别处设置指针:
std_msgs::String str_msg;
unsigned char hello[13] = "hello world!";

str_msg.data = hello;
  1. 订阅包含字符串数据类型的消息时,不会从反序列化缓冲区复制字符串。
    所以它在回调函数期间有效,但在反序列化其他消息时它会消失。
    如果需要将字符串的值保留在回调之外,则必须手动将字符串复制到其他位置。
发送
callback
想保存
包含字符串数据类型的消息
序列化
缓冲区
反序列化
缓冲区
字符串不自动保存
复制
其他位置

2.4 数组

数组与字符串有类似的限制,因为没有简单的方法来查找数组的终止(类似于在字符串末尾找到的\ 0),我们需要指定数组的大小。将一个额外的变量添加到类定义中以实现此目的。例如,geometry_msgs / PoseArray声明为:

Header header
geometry_msgs/Pose[] poses

在Arduino上,这将转换为一个类:

class PoseArray
{
  Header header;
  int poses_length;
  Pose * poses;
}

可以看出,要发送数组消息,必须设置长度和指针。

  • 反序列化时,不能像字符串那样直接地反序列化(因为序列化消息的字节实际是打包的,不像以普通形式传递的字符串)。
    因此,反序列化功能将使用realloc()自动分配足够的存储空间,尝试尽可能重用存储器位置,并且只在接收到的新消息大于先前最大的消息时才扩展它。

  • 某些包含其他数组类型的数组类型(二维数组)不会正确反序列化,因为子类型的所有元素都将指向相同的内存。 将来可能会解决此限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值