原作者:Michael Ferguson 文章来源:The Robot Report 编译:沈永强
图源:The Construct
过去的几个月里我一直在使用ROS 2。正如我之前所提到的,目前似乎并没有太多机器人是运行ROS 2的。目前所面临的有点像是鸡和蛋的问题,现在ROS 2还没有完全准备好在机器人上进行实际应用,但如果不去大规模实际使用,那就没人能知道真正的痛点是什么。 ROS 2实际上是大有可为的,但是现在时间尚短,还不足以让它完全施展开来——因此我们应该先重点关注那些能让机器人和开发人员“继续活下去”的功能。 我经常被问到ROS 2是不是已经准备好大展手脚了,之前我的回答一直都是“还没有”。但是现在我的回答也变了,我会告诉他“这取决你是做什么的”。对于大多数机器人专家来说,我认为如果是从事下面这五个方面,那么答案就绝对是“准备好了!”。实际上,我很希望这篇帖子赶紧过时,因为这意味着ROS 2的全部功能都已经实现了!
RVIZ中的自动QoS,rcl2cli
服务质量(QoS)可能是ROS 1和ROS 2之间最大的变化了,据我所知那些最让人头疼的问题也是因它而起。ROS2 Foxy版本在ROS2 topic info命令中增加了一个-verbose选项,这一步走的非常正确,这能让你在发布者和订阅者使用不兼容的QoS时进行快速诊断。 rosbag2在ROS2 Foxy中得到了重大升级:它能够自动设定QoS的正确配置,以便它能始终与你要记录的发布者保持连接。(注:如果多个发布者用不同的QoS发布到同一个topic上的话,它可能就不起作用了——但是老实说,谁会这么干?) 现在,我们需要的是RVIZ 2和命令行实用程序(CLI)中的功能。这些只是调试工具,所以他们只需要保证在大多数情况下能“正常工作”即可。 因为大多数情况下你都是使用RVIZ 2连接到传感器数据,这些数据通常以非默认QoS发布,因此,如果让RVIZ在所有和传感器文件不相容的内容上都使用默认QoS就很愚蠢了。在默认QoS下,即便是像锁定topic这样简单的事情也做不到。 这不是个简单的问题。它将涉及到对RVIZ的重大改动,以及对诸如massage_fliters之类掉低级软件包的升级。但是我也很确定这是最有价值的升级之处了,它能让ROS2在机器人开发人员手中变得更加顺手。
ROS2的使用说明
我知道我说这个会让人觉得是老生常谈,但是这个非常重要。 我想要谈的不只是缺少使用说明这一个问题。在2011到2014年间,社区经历了迅速增长,与此同时,维基百科上一个精美且不断更新的页面给了ROS的新开发者们巨大的帮助。如果你想要查看软件包的具体信息,你可以去访问wiki.ros.org/package_name,使用说明也在里面(如果没有的话,那就意味着这个软件包暂时还没有完全准备好)。而到了ROS 2, 我们目前还没有一个集中的地方用来存储使用说明,我认为这阻碍了ROS 2的社区发展。 还有一个关于“用户文档”的问题。ROS 2的几乎所有内容都是在具有专业编程背景的前提下编写的(甚至比ROS 1的文档要更加专业)。但是,阅读源码的过程应该要简单点,而不是像学习怎么在激光扫描仪上运行ROS驱动程序那样复杂。 建立社区非常重要。修复bug的最佳方式就是找到需要修复的开发人员。我只使用了ROS 2几个月的时间,就已经修复了六个bug,甚至还维护了一下urg_node端口和相应的包。
订阅者连接回调
现在我们要讨论的是一个技术难题,它的影响是巨大的,尤其是对那些研究感知的人来说,你是知道的,感知是机器人学当中很重要的一部分。当你在ROS 1中创建一个发布者时,你可以注册一个回调,只要订阅者连接或者断开连接,这个回调函数就会被调用。目前ROS 2中还没有这个功能,但我认为这个功能对机器人系统至关重要,下面是我给出的理由。 机器人会生成大量的传感器数据,尤其是当你增加了处理管道时数据量更大。有时候你可能需要具有颜色和深度信息的高分辨率点云,有的时候你需要的是低分辨率的点云。当机器人系统执行多任务的时候,尤其如此。例如,假设有一个可移动且可抓取的机器人,为了能够实现在环境中导航,它需要高帧速、低分辨率的点云来避免碰撞,当移动操作器到达目的地时,它就需要高分辨率的点云来决定要抓取什么。 有时候,你可能没办法发布所有的数据流,因为它会让硬件过载(例如,如果要同时从RGBD传感器中提取深度、颜色和IR数据,就会让USB总线过饱和)。 在ROS 1中,你可以创建“惰性发布者”,这样可以让那些密集数据型的创建者只有在有人监听的时候才会创建和发布数据。在各种驱动程序以及image_proc和depth_image_proc软件包中缺少惰性发布者,对于构建一个高性能感知系统来说是个艰巨的挑战。这些天,当人们问我ROS 2是否已经准备就绪的时候,我会先问他们,“你是做什么样的感知和视觉系统呢?” 需要明确的是,在某些情况下有些变通方案,如果你要自己创建发布者,你可以:
- 创建一个循环,以轮询是否有订阅者(使用get_subscription_count),我现在在openni2_camera中也是这么做的。
- 使用参数来动态地重新配置正在运行的内容。尽管这么做在某些情况下是行得通的(甚至说,这是某些情况的首选解决方案),但是它可能会导致系统变得更脆弱。
- 通过对给定机器人的需求进行硬编码,重新构造你的系统,这样就不再需要惰性发布者。尽管其中一些可能会出现在更高的生产环境中,但是它并不适用于代码重复使用以及共享,这曾是ROS 1的主要卖点。
请注意我所说的是“如果你要自己创建发布者”。由于缺少订阅者连接回调,ROS 1中许多被广泛使用的包的ROS 2端口都是不可使用的,例如:message_filters、image_transport、image_proc、depth_image_proc…… 相关问题可以浏览这篇帖子:订阅匹配中的ROS 2的发布者回调 (https://answers.ros.org/question/351827/ros2-publisher-callback-on-subscription-match)
开发人员的参与
在我写上面那篇帖子的那个月里,很多问题已经得到了答复,所以我们也已经取得了很大的进展! 我记得人们开玩笑说ROS Answer这个名字取错了,因为里面根本就没有答案,全都是提问。实际上这么说是不对的,因为如果你用ROS 2这个标签来搜索的话,也只能搜到很少的答案。 那里面有很多非常好的问题,例如一些使用文档中没有的但又和大量用户息息相关的东西,下面我举几个例子:
- rmw_serialize和反序列化线程安全吗?
- 如何取消订阅topic?
- 为什么要在Python中使用destory_node?
- set(node_plugins)到底是做什么的?
ROS 2的开发人员们,请注意:在这个系统里有很多出色的功能,请帮助你们的用户们去学习如何使用这些功能。也许用户的反馈会帮助到你们!
你在ROS2上的机器人
在各种各样的机器人应用中,可能还藏有很多其他的错误或者问题。你的机器人应该和我的是不一样的,因此你的情况也会不同于我的。所以我们需要更多运行ROS 2的机器人去发现问题。好消息是,你可以在同一个系统上同时安装ROS 1和ROS 2,并且很轻松的在两者之间切换。
关于作者
Michael Ferguson是 Cobalt Robotics的研发总监,Cobalt Robotics一家行业领先的机器人安全服务供应商,总部位于加利福尼亚州圣马特奥。在此之前,他曾是Robotics的CTO,负责Fetch和Freight机器人的软件与电子组件的开发。 同时他还是Willow Garage的衍生公司Unbounded Robotics的联合创始人。2010年起他就在Willow Garage担任软件工程师,与ROS项目合作。
本文系古月居编译作品,如需转载请注明出处。