ROS-rosserial概述(5)
Logging and Limitations
rosserial概述官网链接-Logging
rosserial概述官网链接-Limitations
1. 消息的记录(Logging)
与任何ROS节点一样,可以用合适的信息级别(verbosity level)记录消息。
rosserial将字符串转发到标准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 *
。 这有两个影响:
- 发布时,必须将字符串数据存储在别处并设置指针:
std_msgs::String str_msg;
unsigned char hello[13] = "hello world!";
str_msg.data = hello;
- 订阅包含字符串数据类型的消息时,不会从反序列化缓冲区复制字符串。
所以它在回调函数期间有效,但在反序列化其他消息时它会消失。
如果需要将字符串的值保留在回调之外,则必须手动将字符串复制到其他位置。
2.4 数组
数组与字符串有类似的限制,因为没有简单的方法来查找数组的终止(类似于在字符串末尾找到的\ 0),我们需要指定数组的大小。将一个额外的变量添加到类定义中以实现此目的。例如,geometry_msgs / PoseArray
声明为:
Header header
geometry_msgs/Pose[] poses
在Arduino上,这将转换为一个类:
class PoseArray
{
Header header;
int poses_length;
Pose * poses;
}
可以看出,要发送数组消息,必须设置长度和指针。
-
反序列化时,不能像字符串那样直接地反序列化(因为序列化
消息的字节实际是打包的
,不像以普通形式传递的字符串)。
因此,反序列化功能将使用realloc()
自动分配足够的存储空间,尝试尽可能重用存储器位置,并且只在接收到的新消息大于先前最大的消息时才扩展它。 -
某些包含其他数组类型的数组类型(二维数组)不会正确反序列化,因为子类型的所有元素都将指向相同的内存。 将来可能会解决此限制。
上一篇: ROS-rosserial概述(3)
下一篇: ROS 相关问题记录