侵删
机器人开发中一个很常见的故事是这样的:有一天,一名学生/工程师开始了一个新的很酷的机器人项目。她开始计划并从事该项目。很快,她就发现事情没那么简单。机器人学很难学,为机器人开发一个好的软件需要时间。因此,她开始花时间研究如何在所有程序之间进行通信,如何实现机器人的 3D 模拟等。
该项目即将结束。没有取得真正的进展,开发人员开始失去信心。她将所有时间都花在编写机器人框架上,但在实际项目中只做了一点工作。很快这个项目就被放弃了,或者她可能设法用一些被黑的代码完成了一些事情。几周后,另一个人开始了另一个很酷的机器人项目。
他想:如果我找到一些可以直接使用的框架怎么办?他在互联网上找到了她的代码,但该代码似乎真的不能重用于他自己的应用程序。于是,他从头开始写一切。等等等等。许多从事机器人软件开发的人实际上并没有开发机器人应用程序。他们开发的机器人框架最终是不可重用的、不受支持的、不为人知的,并且很快就会被遗忘。这种情况经常发生在攻读博士学位的人身上,项目的时间框架为 2-3 年。
这是拖慢机器人研发的主要因素之一,ROS 正试图解决这个问题。
ROS 允许您停止重新发明轮子。重新发明轮子是新的创新应用的主要杀手之一。
我们从上面机器人开发的例子中就可以看出ROS的主要优势就是开源、共享,这让我想到了GitHub的模式与之类似。
具体到我的自身就是,我常常思考一个问题,在电脑中的人工智能算法的参数调整,以及类似均方差的这样的指标表现极好是不是真的代表这个算法找到了接近最优的解呢?
源于这个问题,我想尝试着通过学习ROS,来达到用实际的一些项目比如SLAM来检验人工智能算法的优越性。
恰好遇到Geek组的例会,我就顺便将ROS的核心的消息通信机制拿出来讲一讲,也帮助自己理解。
上面说到,我想实现一个SLAM(即时建图同步定位与地图构建),我就需要一个机器人小车,但是我没有任何机器人的相关知识,我就首先需要考虑下面的问题:
这个过程是极其耗时间与拖慢的我进度的,需要学习大量的硬件知识,还需要有一些工程经验。
那有没有快速的方法呢?
答案就是ROS
这里有一个官方的视频
ROS介绍
这里不详述,自行搜索,建议阅读
斯坦福大学的人工智能机器人项目
自 1956 年诞生以来,人工智能的梦想一直是构建具有广谱能力和智能的系统。在 STAIR(斯坦福人工智能机器人)项目中,我们正在构建一个机器人,它可以在家庭和办公环境中导航,拾取物体和工具并与之交互,并在这些环境中与人们进行智能对话和帮助。
我们的单一机器人平台将整合来自人工智能所有领域的方法,包括机器学习、视觉、导航、操纵、规划、推理和语音/自然语言处理。这与 30 年来在分散的人工智能子领域工作的趋势形成鲜明对比,并将成为推动真正集成人工智能研究的工具。
从长远来看,我们设想单个机器人可以执行以下任务:
- 在家里或办公室取货或送货。
- 整理房间,包括捡起和扔掉垃圾,以及使用洗碗机。
- 使用普通厨房准备饭菜。
- 使用工具组装书架。
能够完成这些任务的机器人将彻底改变家庭和办公自动化,并具有从家庭助理到老人护理的重要应用。然而,执行这些任务需要在整合学习、操作、感知、口语对话和推理方面取得重大进展。
更多:
百度无人车-Apollo ROS原理和实践-背景介绍之ROS史话
斯坦福机器人制造者吴恩达:生活中的机器人,将是专用机器人
直接来看ROSwiki的定义
The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications.
可以理解为ROS是用来搭建机器人的软件工具平台
和所有的定义一样,我们抱着弄懂它的心里去看,但是还是不够清楚。
所以又我通过一些搜索看了不同的文章,一些人把ROS称做系统、一些人把ROS称做中间件,可他们说的是同一个东西。
在我的理解里,他们确实都说的是一样的东西,只不过看到层面不同。这就像是一个箱子的不同面,看到的角度就不相同。
我们把箱子打开,就可以看到ROS的不同层次的内容:
当然这并不是全部。
这张图以及有点老了,但是也可以看到ROS正在快速的发展。
分为三个层次
单个机器人,我们只考虑机器人内部各个节点之间的关系。
ROS1是最初的版本,但是由于其开发时并没有考虑工业的实用性,有很多地方需要优化,这就促进了ROS2的诞生。从这张图就表现为,由分布式松耦合的节点消息通讯到ROS2的DDS消息通信。
这个情况就更复杂,比如说无人机表演,如果要达到那样的承度,框架分析起来更困难。但是我们依然可以看到这张图中他们的关系,最为明显的就是不同机器人之间使用WIFI通讯的。
本讲我主要关注的是ROS的计算图层
耦合
耦合是一个通用的概念,分别在通信工程、软件工程、机械工程等都有涉及。
这里对应的就是软件工程中的耦合,也就是一种程序思想,甚至你编程时的代码就能体现耦合承度,我通常认为,对于一个函数如果调用了过多的全局变量或者对其他函数的依赖较多,那么就是一个紧耦合,反之就是松耦合。
进程
进程通常指的就是一个正在利用计算和内存资源等的程序,我看到有人把进程比做房子,线程就是住在房子里的人,线程运用进程中的资源运行。当然这个比喻可能不那么恰当,但是可以有大概的了解。详细的可以查看我链接的别人的文章。
这里主要介绍在ROS的层级结构中,处于核心地位的这一层,就是计算图层。计算图对于看了前置的知识的同学就会有大概的了解,我们这里的计算图跟多的应该表示的是体系中节点与节点之间的联系。
我们把每一个方格可以看作一个进程或者节点,那么节点当中就有对应执行的程序,他们之间这种传递消息的联系就形成了这样计算图,后面讲到节点之间的通信就会有更深刻的认识。
Node和Master
在将具体的消息通信机制之前,需要了解一些最基本的知识。下面的图有些复杂是我做的ppt,这里说的是我先抽象的看什么是master和node以及他们的关系,然后我在Ubuntu系统中运行他们再阐述他们的关系,详细我就不赘述。执行roscore相当于运行了master,然后在top中可以看到进程的情况,根据pid对比。
Node 节点是执行计算的进程
master 完成节点的名称注册和查找
消息 message
一句话总结就是,消息就是一个有数据结构的数据文件,对应不同的语言有不同的写法。
由于过程较复杂,我只探究了话题消息的从建立连接到实现话题消息这样一个通信的全过程。通信过程包含了大量的基础知识,所以建议慢慢的细细的领会,如有不对的地方欢迎留言批评。
具体的实现过程