【深度好文】MicroROS on RT-Thread

文章较长,建议同步加入收藏夹

点击可回看作者简介

ROS 简介

最初 2007 年左右,斯坦福机器人实验室的两个博士生,Eric Berger 和 Keenan Wyrobek 发现身边的同学们对机器人开发有一种望而却步的感觉。因为机器人本身是一个跨专业的学科,做软件的同学们不太了解机械结构,不熟悉机器人的设计装配流程;做算法的同学们又不太了解嵌入式,不太清楚底层传感器驱动的工作原理,于是合作起来会碰到很多障碍。为了解决这个问题,他们设计了最初的 Robot Operating System (ROS),极大地提高了团队合作效率。

由于 ROS 简单好用上手快,从 2007 年 ROS 发布第一版并举行第一届全球 ROS Conf,到 2012 年底第五届会议,使用 ROS 的实验室已经遍布全球了。2013 年 ROS 就由 Open Source Robotics Foundation (OSRF) 接手维护了。另一方面,2005 年斯坦福拿下 DARPA 无人驾驶挑战赛冠军一举成名,随后 ROS 也诞生在斯坦福,很快在无人驾驶领域 ROS 也得到了广泛应用,并且 2018 DARPA 无人驾驶挑战赛专门设置了 ROS 赛道,参赛队伍需要在 ROS Gazebo 模拟环境下测试自己的无人车并得到评分。

虽然 Robot Operating System (ROS) 取名为机器人操作系统,但其实它并不是一个操作系统,而是在 Linux 之上开发的一系列软件包。为了说明 ROS 开发的简单,高效和稳定,这里简单介绍一下 ROS 很重要的4个设计:

  • Message (消息):有的时候可能会苦恼传感器的信息应该以什么样的数据结构发送出去,于是 ROS 定义好了各种常见传感器的数据格式,有了模板只需要填充内容就可以了,这样节省了自定义数据结构的时间。另一方面,也可以自己写一个 .msg 文件定义新的数据结构,ROS 就可以自动生成对应的头文件。这和 Google 的 protobuf 非常相似,定义数据结构,就可以自动生成源码。总而言之,ROS 的一个消息 (message) 也就是想要发送出去的一个数据包。

  • Topic (话题):定义好了数据结构,如何把数据稳定的发送出去,稳定接收也是个问题。一对一的发送可能比较简单,但是如果多个算法需要同一个传感器输入,同一个算法又需要不同传感器输入,很快数据同步就变得棘手了。于是 ROS 采用了发布 (publish) - 订阅 (subscribe) 的模式,比如用 ROS 预先定义好的数据结构发送图像数据,发布出去的图像信息就可以在 /camera 这个话题下找到,所有订阅了这个话题的节点都会收到消息。相当于我们把消息发给报社,所有订了报纸的人就会收到消息,这样我们只管发消息就是了,剩下的 ROS 会保证所有节点都收到同步的消息。

  • Node (节点):像前面说的那样,消息发布出去后,ROS会保证所有订阅了这个话题的节点都会收到同步的消息。于是一个节点的作用通常就是收一些消息,做一些处理,可能再发布一些新的消息。比如人脸检测的节点,可能会订阅图像相关的话题,识别完再告诉其他节点自己识别的结果。通常,一个节点只完成一件事情,例如人脸识别的节点就只做人脸识别,不会同时又做摔倒检测。这样一个节点只处理一个比较小的任务,再合作实现更大的目标。顺便一提,一个节点不等于一台电脑,因为一台电脑如果性能比较强,完全可以部署好几个节点,这样也充分利用资源。

  • Service (服务):一方面节点可以通过订阅消息获得需要的信息,另一方面节点之间也可以通讯。例如目标追踪的节点,可能先需要调用目标检测节点的服务,知道目标在哪再去追踪。所以服务就是字面上的意思,每个节点可以提供一些服务供其他节点调用。

于是有了 ROS 之后,做嵌入式的同学只需要把传感器信息 (message) 发布出去,做算法的同学订阅自己需要的话题 (topic),作为算法输入,再发布对应的输出。这样每个同学只用专心维护自己的节点,确保自己节点的输入输出正确,整个系统就能正常运作了。


除了软件设计,前面提到的 ROS Gazebo 仿真环境也极大地加快了迭代过程,在真正的机械臂加工装配之前,先在模拟环境确保可以实现预期的运动,也避免了不必要的试错过程。

当然,Gazebo 也可以和实际的机器人连接进行联合调试 [1]:

RT-Thread 与 ROS

那么问题来了,前面提到 ROS 是在 Linux 上运行的一套软件框架,Linux 本身并不是实时系统,机器人一些对实时性要求比较高的任务并不太适合用 Linux,而 RT-Thread 虽然是实时操作系统(RTOS),但毕竟 MCU 的资源有限,并不能直接运行完整的 ROS。

于是,通常的做法是利用 Linux 丰富的软件包实现一些顶层算法,而 RT-Thread 则负责实时控制相关的任务,它们之间的通信就是后面会介绍到的 rosserial 和 micro_ros。

rosserial 和 micro_ros 的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值