欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ROS-rosserial概述(5)

程序员文章站 2022-07-12 09:42:59
...

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 输入/输出缓冲区大小 最大发布者/订阅者数
ATMEGA168 150/150 bytes 6/6
ATMEGA328P 280/280 bytes 25/25
All others 512/512 bytes 25/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()自动分配足够的存储空间,尝试尽可能重用存储器位置,并且只在接收到的新消息大于先前最大的消息时才扩展它。

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

相关标签: ros