打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ROS探索总结(四十四)~(五十四)(转)

近几年,机器人和人工智能繁荣发展,曾经运行在实验室的机器人已经逐渐走入千家万户的生活。作为机器人开发利器的ROS也得到了非常广泛的应用,成为机器人领域的普遍标准。

ROS原本针对科研领域的PR2机器人开发,这种大繁荣的景象远远超过ROS的最初目标,也使得ROS的缺陷在广泛应用的同时暴露无遗:

1. 缺乏构建多机器人系统的标准方法;
2. 在Windows、MacOS、RTOS等系统上无法应用或者功能有限;
3. 缺少实时性方面的设计;
4. 需要良好的网络环境保证数据的完整性,而且网络没有数据加密、安全防护等功能;
5. ROS 1的稳定性欠佳,研究开发与上市产品之间的过渡艰难;

正是由于ROS1存在种种问题,才促使ROS2.0的出现。ROS2.0虽然从根本上解决了ROS1.0的许多问题,但是却无法短时间替代ROS1.0在庞大生态系统中的关键位置,只能借助越来越多的关键开发者逐渐推进。所以从目前ROS2.0的情况来看,近几年ROS1.0的应用还会是主流。

 

ROS1.0能否产品化?

 

那么目前的ROS1.0到底能不能在机器人的产品化过程中应用?如果可以,又该如何应用于机器人产品的开发?

笔者不才,使用ROS进行了两年的机器人产品开发,过程当中也总结了一些经验,就简单谈一谈对于这个问题的看法。

在谈ROS的产品化前,我们需要明确一个问题,ROS到底是什么,可以参考我之前的文章:

"Powering the world’s robots" 的ROS是什么?

 

ROS的核心虽然是通信机制,但是如今的ROS已经远远超过通信机制的范畴。总体来讲,ROS包含四个部分:通信机制、开发工具、应用功能、生态系统。

所以在说ROS产品化的时候,我们需要针对这四个方面进行讨论。由于内容较多,这个主题会分为几篇文章分别讨论。

首先来看第一个部分:

 

通信机制

 

点对点的分布式通信机制是ROS的核心,使用了基于TCP/IP的通信方式,实现模块间点对点的松耦合连接,可以执行若干种类型的通信,包括基于话题(Topic)的异步数据流通信,基于服务(Service)的同步数据流通信,还有参数服务器上的数据存储等。

 

但是这种通信机制的实时性和稳定性不好,而且强依赖于中心节点ROS Master。比如我们在机器人产品开发的过程中,就遇到无数类似下边的问题:

1. 在进行压力测试时,系统连续运行一周时间,运行到第四天时(时间不确定),ROS Master莫名宕机,整个系统不再受控,某个节点突然失效也是时有发生的。。。
2. 系统存在大量话题和数据时,本地传输的数据延时大而不确定,远程传输的数据更是经常受到带宽和处理性能的影响。。。
3. 在系统中频繁创建话题时(比如连续创建几百个话题),某些话题的数据莫名就消失了。。。
4. 通信的实时性较差,没办法实现毫秒级的机器人控制。。。
5. 通信数据是开放式的,没有加密,只要在网络中的节点都可以轻松获取。。。
6. 核心机制的性能没有优化,运行在配置较低的ARM上会占用过多资源。。。

这样看来,好像ROS的核心部分在机器人产品中完全没有可用性呀!如何去突破这个瓶颈呢?先来看看部分开发者的改良方法。

首先聊聊百度。

 

自从百度All in人工智能之后,无人驾驶汽车平台Apollo就被推上了风口浪尖,甚至还登上了2018春晚的舞台。在这个吸睛无数的Apollo平台背后,就隐藏着ROS的身影。

Apollo平台基于ROS开发,但是对通信机制部分进行了众多改变,有兴趣的小伙伴可以看Apollo改良之后的ROS:

https://github.com/ApolloAuto/apollo-platform

或者参考这篇解读:

干货曝光(二)|资深架构师首次解密Apollo ROS有何不同!

总结而言,百度对ROS的优化有以下三点:(咋看上去,这些优化有点像ROS 2.0干的那些事儿)

 

1. 去中心话,也就是干掉ROS Master,这部分使用了DDS技术;

DDS虽然提供的也是发布/订阅模型的通信机制,但商用版本可以达到军工标准,国际上有几家大公司也在推进DDS在ROS 2.0中的应用。

 

2. 使用共享内存的方法,优化大数据传输的瓶颈;

共享内存也是ROS2.0中时间敏感型数据通信的方法,吞吐量和传输速度肯定可以得到很大程度的优化,同时占用的CPU资源也比较少。

 

3. 使用Protobuf优化数据格式的兼容性。

Protobuf是google开源的一种结构化数据存储格式,百度拿它取代了ROS中的Message,可以向后兼容数据协议的扩展。

无人驾驶汽车的稳定性是一个性命攸关的问题,百度敢对ROS进行大刀阔斧的优化,也正说明了ROS的行业认可度和强大生命力。

再来聊聊研究者对ROS中Master宕机、安全性和实时性问题的解决方案。

在ROScon2017上,来自USA Northeastern University的研究者介绍了一个名为“DMCTP”的包,当ROS Master崩溃时,DMCTP会缓存所有状态和数据,并且重启Master完成系统恢复。

 

同在ROScon2017上,另一群研究者提出了“SROS”的概念,也就是为ROS附加一系列安全增强策略:安全传输层、访问控制层、进程配置层等。

 

在ROScon2016上,针对实时性问题,还有研究者为ROS增加了实时性扩展,称为——RTROS。

对这几个研究感兴趣的小伙伴可以直接看ROScon历届的分享视频和ppt资料:

https://roscon.ros.org/

基于ROS的机器人产品有不少已经投入使用,除上边提到的百度无人驾驶汽车,还有另外一个开源无人驾驶汽车平台Autoware、NASA部署在国际空间站的Robonaut 2机器人等,目前很多大公司的开源部门也在推进ROS的产品化应用。

综观这些机器人产品和平台,都可以说是基于ROS开发的,但是在ROS通信机制部分,也都进行大量的优化和改良。

这种做法对于创业型的公司来讲,如果不是以ROS的改良作为产品的话,往往都不愿意去干这件事情,费时费力。那么对于小公司来讲,如果不想去动ROS的核心通信部分,应该怎么做呢?

这就要说回笔者在创业过程中的实践了。大概有两种方法:

 

第一种:自己不愿意做,就用别人做好的呗;

ROS是一个庞大的开源社区,上边提到的那些ROS优化,基本上都可以在社区中找到开源实现,或是找其他公司做好的成熟产品,站在别人的肩膀上继续前进。

但是这样也有问题,一方面,别人实现的功能不一定完全符合自己的需求,另外一方面,这些实现的相关文档不多,有问题还得从源码上解决。

那就请使用第二种方法!

 

第二种:自己不愿意做,也不想基于其他平台做,那就别强求了。

这就是笔者创业公司采用的策略——放弃ROS的核心通信机制部分。这句话说来容易,做起来难!毕竟机器人系统还是需要通信功能的,于是我们重新设计了一个。。。


(四十五)—— ROS产品化探索之开发工具篇

上篇讲到,在通信机制部分,我们完全舍弃了ROS基于话题和服务的通信机制,自己又实现了一套通信系统,具体的实现主要基于Linux系统的各种通信方式,此处暂且不表,这篇我们来看下ROS另外一个重要部分——开发工具,如何在机器人产品化过程中应用。

ROS相关的开发工具有很多,大致可以分为以下几种类型:

1.ROS原生工具,比如rviz、qt工具箱、命令行工具等;

2.编译和测试工具,基于已有工具进一步的包装;

3.第三方工具,基于成熟工具,使用一些插件或接口和ROS系统兼容。

就这三种类型的工具,我们来具体分析。

 

一、ROS原生工具

ROS的原生工具非常丰富,可以参考wiki上的说明:

http://wiki.ros.org/Tools

无论是可视化的qt工具还是命令行工具,都频繁用于ROS开发,这些工具和ROS系统的依赖性最强,想要实现产品化并不容易。

 

▼ rviz

首先来看最重要的一个工具——rviz。

rviz是ROS中的一个三维可视化平台。为什么说它是ROS最重要的一个工具呢?因为rviz可以把不直观的数据统统可视化地显示出来,比如图像、地图、模型、路径等等,这些还只是rviz官方提供的显示插件。

rviz最厉害的地方是它的扩展性,可以通过插件的形式无限扩展,打造自己的人机交互界面。比如上图是ROScon2017开场演讲的Autoware项目,他们将rviz用于无人驾驶汽车的上位机平台。

 

上图是我们自己项目开发中设计的rviz插件,作为机器人控制的上位机。

rviz原生的显示组件配合定制化开发的插件,功能强大,开发迅速,简直不能再好用了!

OK!吹了半天rviz的强大,也得说说它的问题!

rviz最大的问题就是对ROS核心通信机制的强依赖,系统中必须要运行ROS Master,显示的数据需要通过话题发布,运行不稳定等等。。。很多时候在启动rviz的过程中,总是伴随着警告和错误,一次启动失败就再来一次,最多三四次还是可以启动成功的。。。

基于上边这些问题,rviz基本不可能直接拿来产品化,作为开发过程中的工具还是非常棒的。不过,rviz的架构设计还值得参考,我曾“企图”利用rviz的源码重新开发一个类似的界面工具,摆脱对ROS的依赖,不过最终还是因为没有时间而放弃了,有兴趣的小伙伴可以试一下,记得告诉我结果哦!

 

▼ 命令行工具和rqt工具

ROS提供的命令行工具非常丰富,比如rostopic、rosservice、rosnode、rosparam等等。虽然没有图形化工具那么直观,但是很多时候更加简洁明快。

ROS还提供了一系列轻量化的可视化工具,比如:

 

显示计算图的rqt_graph

 

显示数据包的rqt_bag

 

绘制数据曲线的rqt_plot

 

这些工具的问题和rviz类似,或者说ROS的原生工具都有这样的问题,毕竟是“直系血亲”,和ROS核心部分紧密相连,同样继承了ROS通信机制部分的问题。

所以,如果想在机器人产品中为用户提供相关的工具,需要慎重考虑一下面向的对象,和对稳定性的需求。

 

二、编译和测试工具

第二个部分是ROS提供的编译和测试工具。

▼ 编译系统——catkin

ROS的编译系统基于CMake,针对ROS本身的特点进行了包装,可以比较方便的管理包之间的依赖关系,而且ROS功能包可以实现系统模块化、松耦合的管理机制,编译开发版和发布版都没有问题。

功能包或编译系统和ROS的核心通信机制没有直接关系,所以代码里边没有任何ROS相关的代码,一样可以使用。在机器人开发过程中,我们项目中的所有代码都使用ROS包管理、catkin编译。

这种方案还有一个很大的好处,就是很容易在CMakeLists中链接ROS的库,比如tf库。tf库是坐标变换的数学处理库,而我们常用的tf功能包是在tf库的基础上加入了ROS封装,所以两者是有区别的。借助tf库可以帮助我们实现坐标变换,不需要再重复造这个轮子。

 

▼ 单元测试——gtest

ROS的单元测试系统基于谷歌的gtest,结合catkin编译系统,非常好用。我们项目所有的单元测试,都是通过这种方式完成,相关的语法和gtest一样,可以参考:

http://wiki.ros.org/gtest

可以说,ROS的编译和测试工具在产品化开发过程中可以直接使用,而且包管理机制、单元测试方法让整个软件系统的框架清晰明了、分工明确。

 

三、第三方工具

ROS的迅速崛起,也不断吸收更多第三方工具的加入,比如Gazebo、Matlab、Qt Creator、SolidWorks等。

机器人仿真是机器人开发过程中非常重要的一个环节,可以针对机器人模型、应用功能、算法处理、环境状态等方面做仿真。Gazebo是ROS中主要的仿真工具,现在已经独立维护,可以通过ROS接口接入ROS环境,所以无论我们是否使用ROS,都可以使用Gazebo,从开发到产品的过渡相对平滑。

 

Matlab是数据处理方面的强大工具,2013之后的机器人工具箱也提供了对ROS的支持,实现了ROS核心通信的大部分功能,可以运行ROS Master和节点,并且发布话题消息。这为ROS开发提供了一个强大的数据演算后台,也可以利用matlab的可视化编程功能,实现人机界面的开发。

 

Qt Creator、SolidWorks等工具,都是以插件的形式提供对ROS的支持,从而实现与ROS相关的功能。

随着ROS的发展,会有越来越多的第三方工具加入ROS的生态环境,这些“兵器”也必定会直接带来生产效率的提高,促进机器人产品化的进程!

本篇针对ROS相关的部分工具进行了分析,当然还有很多工具没有涵盖进来。工具的根本目的是提高我们的开发效率,每一种工具都有其擅长之地,也有其不足之处,所以在我们设计、开发机器人产品的过程中,可以综合考虑,发挥每一个开发工具的优势。


(四十六)—— ROS产品化探索之应用功能篇

上篇我们讲到ROS中的开发工具,可以提高我们的开发效率,每一种工具都有其擅长之地,也有其不足之处,所以在设计、开发机器人产品的过程中,可以综合考虑,发挥每一个开发工具的优势。本篇我们来分析一下ROS中丰富的应用功能。

说起ROS中的应用功能,可就非常庞杂了,涵盖各种各样的功能包,简单做一个如下的分类:

1. 底层驱动

2. 上层功能

3. 控制模块

4. 常用组件

就这几种应用功能,我们来具体分析一下:

 

一、底层驱动

机器人开发是一个软硬件结合的领域,常常需要涉及很多传感器、执行器的驱动。常用的硬件一般都可以在ROS中找到匹配的驱动功能包,例如传感器可以参考wiki上的这个列表:

http://wiki.ros.org/Sensors

针对常用的USB摄像头,ROS中有usb_cam、uvc_camera等功能类似的驱动包,运行还算比较稳定。我们用usb_cam驱动1080P的摄像头做识别,有的时候连续运行好几天都不会出问题,不过偶尔也会莫名其妙的挂掉。

一些伺服的驱动在ROS当中也可以找到,比如dynamixel的伺服,Kungfu Arm前端的灵巧手使用的就是dynamixel,相关的功能包是dynamixel_motor。用ROS驱动起来确实简单易用,但是运行时间长了,还是会有问题。有一次给Kungfu Arm录像,手就有点紧张了,手指不听使唤,把开水洒了一桌子,驱动也没有任何报错信息,重启之后再也没有重现类似的现象。

ROS支持的很多机器人(PR2、KUKA、shadow hand等)都使用到了一种实时工业以太网总线——EtherCAT。EtherCAT本身就有开源的协议实现方式,ROS将开源库集成为功能包——ethercat_soem,可以在很多机器人的软件源中看到。我们在项目的初期也使用过这种方式,驱动是没有问题,但是稳定性、实时性、功能方面,都还存在一些问题。

就个人感受而言,ROS中底层驱动相关的功能包,大部分都是对已有开源驱动的集成封装,添加统一的ROS接口,所以稳定性主要和原本的驱动相关,同时还要考虑ROS通信机制的影响。

 

二、上层功能

上层功能是ROS最为擅长的一个领域,可以提供众多机器人的应用功能:SLAM、导航、定位、图像处理、机械臂控制等等,这个部分详细展开够说三天三夜了。我就针对两个部分谈一下自己的看法。

 

1. 机器人导航

现在很多学校或者公司做机器人导航的时候,都会基于ROS开发。

ROS的这套导航框架确实好用,很快就可以在机器人上把功能跑起来,而且基本不会涉及太多编码,但是还没来得及高兴,问题就出现了:现实和理想还是有很大差距的,功能实现的效果可能远远达不到我们的需求,更别提产品化应用了。

然后就是调整功能节点的各种参数,虽然可以有所改善,但是跟最终的应用还是会有很大差距。使用ROS快速开发后的兴奋,在这个时候就被泼了一盆凉水。

ROS中的功能包一般都是一些通用的功能,不太可能完全适配我们自己的机器人,所以产生各种问题也是情理之中。解决的办法就是:我们不能太依赖ROS中的资源,核心问题还是需要自己解决,或者针对自己的机器人开发相关的功能,或者优化已有的ROS资源。

在Kungfu Arm的开发过程中,我们只用了半年时间就利用ROS把机器人功能原型搭建起来了,但是问题多多,接下来的优化开发用了一年多的时间,现在还在持续的迭代。

 

2. MoveIt机械臂控制

MoveIt是ROS当中针对机械臂控制的运动规划平台,集成了机械臂运动规划、避障规划、运动学计算等功能模块。和ROS中的导航功能差不多,用moveit搭建一个简单的机械臂控制系统不难,真的要去实现一个产品化的控制系统就复杂了。

这是我们基于ROS开发的工业机器人控制系统,不仅把ROS核心通信机制抛离了,而且还针对moveit、ompl、fastik等功能包进行了代码级的优化和修改,大家可以参考专门介绍这款机器人的文章:

功夫手:一款基于ROS的工业机器人

总而言之,ROS中丰富的上层应用资源,对机器人产品化的实现还是有很大帮助的,一方面可以利用这些功能包快速完成原型开发,另一方面也可以从这些源码资源中获得灵感。

 

三、控制模块

丰富的上层资源最终还是要落实到机器人上,在机器人控制部分,ROS提供了一个控制框架——ros_control,同时还有很多常用的控制器——ros_controllers。

ros_control是ROS为开发者提供的机器人控制中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等,可以帮助机器人应用功能包快速落地,提高开发效率。

针对不同类型的机器人(移动机器人、机械臂等),ros_control可以提供多种类型的控制器(controller),但是这些控制器的接口各不相同。

为了提高代码的复用率,ros_control还提供一个硬件抽象层,负责机器人硬件资源的管理,而controller从抽象层请求资源即可,并不直接接触硬件。

1. 控制器管理器(Controller Manager)

每个机器人可能有多个控制器(controller),所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的控制器。控制器管理器的输入就是ROS上层应用功能包的输出。

2. 控制器(Controller)

控制器可以完成每个joint的控制,读取硬件资源接口中的状态,再发布控制命令,并且提供PID控制器。

3. 硬件资源(Hardware Rescource)

为上下两层提供硬件资源的接口。

4. 机器人硬件抽象(RobotHW)

机器人硬件抽象和硬件资源直接打交道,通过write和read方法完成硬件操作,这一层也包含关节约束、力矩转换、状态转换等功能。

5. 真实机器人(Real Robot)

真实机器人上也需要有自己的嵌入式控制器,将接收到命令反映到执行器上,比如接收到旋转90度的命令后,就需要让执行器快速、稳定的旋转90度。

关于如何使用ros_control控制一款实体机器人,大家可以参考hans-robot发布的一款cute_robot:

https://github.com/hans-robot/cute_robot

应用功能中的控制模块提供了不少控制器:位置控制器、轨迹控制器、力控制器、速度控制器等等,这些控制器的框架设计和代码实现,都可以用于自己的机器人开发中。

 

四、常用组件

应用功能中还有一些常用模块,这里我把他们统称为常用组件,比如TF、URDF、Message等。

TF是ROS中非常重要的一个部分,可以根据机器人系统中的坐标系创建一棵TF树,然后帮助开发者完成坐标系之间的变换。在ROS系统中,TF是通过广播和监听的方式操作的,这种方法在复杂机器人系统中会产生很多冗余信息,效率不高。

刨除上层的广播和监听封装,TF的内核其实与ROS并没有关系,而是一个完成坐标运算的数学库。在我们的项目开发中,可以直接链接TF的底层数学库,帮助完成需要的坐标变换,Kungfu Arm的正向运动学就使用到了TF数学库。

URDF是ROS中实现机器人建模的重要工具,很多上层功能的算法实现,都依赖于机器人的URDF模型,所以如果直接移植ROS中的功能包源码,URDF模型部分还是需要维护的。

ROS为机器人提供了一个统一的平台,很重要的一个部分就是定义了一系列标准的接口,这些接口的定义与ROS系统的通信机制没有关系,完全可以在程序中调用,这样不仅免去了重复定义的问题,还可以保持和ROS统一的接口。

本篇浅谈了ROS应用功能在机器人产品化开发当中的应用,这是ROS中资源最为丰富的一个部分,不仅可以帮助我们快速搭建功能原型,验证设计上的问题,同时还可以借助开源代码,助力后续的功能开发,绝对是机器人开发的优质资源。


(四十七)—— ROS产品化探索之生态系统篇

诞生于2007年的ROS,发展速度之迅猛超出了所有人的预料,已经成为一个机器人领域的生态系统,可以提供机器人相关的全方位技术,从硬件到软件,从框架到功能,从驱动到应用。。。

前边三篇已经分别从通信机制、开发工具、应用功能这三个方面浅谈了笔者对ROS产品化探索的一点总结,本篇就来聊聊最后一个部分——从生态系统的角度来看,ROS可以为机器人产品化提供哪些思路。

什么是生态系统?

维基百科的解释是:生态系统(Ecosystem)是指在一个特定环境内,相互作用的所有生物和此环境的统称。

ROS提供了一个庞大的开源社区,为ROS生态系统提供了基础环境,众多机器人的基础工具和应用功能不断融入这个系统,并且不断吸收第三方开源软件的精华,同时得到全球范围内众多开发者的支持,系统中的各部分协调统一、相互促进、共同成长,成为一个整体。

这个ROS生态系统应该是目前最大的机器人知识库了,在机器人产品化开发中,也必将成为一个重要的资源池。

 

一、机器人资源

 

目前国内外常用的机器人平台大部分都已经支持ROS系统,可以在wiki上查找:

http://robots.ros.org/

就算wiki上找不到的,基本也可以在github上找到其他开发者的分享。如果加上爱好者自己设计、实现的机器人,那就更加数不胜数了。

这些机器人资源对我们有什么用呢?

1. 机器人硬件设计参考

ROS中的机器人资源都是开源的,包括机器人的模型文件。如果我们需要做机器人设计,完全可以参考这些开源的机器人模型,毕竟包含了不少知名的机器人平台。

2. 辅助机器人原型搭建

使用ROS中已有的功能包,我们可以在自己的机器人上快速搭建功能原型,验证机器人设计中的问题。

3. 基于应用功能包的二次开发

ROS中的功能包非常丰富,一定可以找到与我们研究方向相关的应用功能,虽然不太可能直接应用在产品开发中,但还是可以减少类似重复造轮子的工作。

4. 算法验证

如果我们是算法工程师,手上又没有现成的机器人平台,那么使用ROS中的机器人可以随便挑随便选,放在物理仿真环境中,想怎么用怎么用,还分文不要。

5. 学习机器人系统

无论我们是机器人方向刚入门的初学者,还是资深工程师,都不可能掌握机器人方方面面的知识,那么借助ROS学习更多机器人相关的技能,一定可以事半功倍。

 

二、功能框架

设计一个完善的机器人系统并不是一件简单的事情,借用Python的一句名言:人生苦短,我用ROS。ROS中丰富的机器人框架,一定可以给你一些设计、实现上的灵感:

1. 机器人通信框架

ROS1的通信机制部分在机器人产品化中存在很多问题,但并不代表这种通信框架是不可用的,如果我们设计类似的通信功能,一样可以参考这个模型。

如果你不喜欢这种“中央集权”的通信模型,也可以看一下ROS2的通信模型。

这些通信模型的底层实现是开源透明的,真要拿来二次开发实现商业化,也不是没有可能。

2. 机器人导航框架

这个框架我们在上一篇已经说过,这里就不多说了,谁用谁知道。

3. ROS-I框架

工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟。ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-Industrial(ROS -I)。

工业机器人的品牌众多,接口也各不统一,ROS-I框架为这些机器人提供了一个统一的控制平台,可以将ROS社区中的众多资源应用到生产环境中,或许会成为ROS最快落地的一个领域。

4. ros_control框架

硬件平台千差万别,如何将上层应用快速适配到不同的机器人硬件平台上,也是软件开发工程师头疼的一个问题,那就参考一下ros_control框架吧,仿真控制与实物控制轻松切换,类似于linux系统底层write、read机制一般的统一接口,可以帮助我们解决不少麻烦。

ROS中还有很多功能框架,都是全球范围内顶尖开发者的知识结晶,妈妈再也不用担心我不会机器人设计了。

三、机器人前沿科技

机器人绝对是走在当今科技最前沿的一个领域,更新换代也异常迅速,所以我们不仅要掌握机器人基础理论和技术,还要时刻关心前沿动态。ROS在机器人领域的地位越来越高,也是我们窥看前沿科技的一个窗口。

1. 机器人前沿

比如这款“百万级”的仿生手。

比如这款“不会伤人”的KUKA LWR iiwa。

再比如这款“机器僧人”Pepper。

2. 学术前沿

每年机器人顶级期刊和会议上的论文,很多都是基于ROS实现的,部分论文还会把成果和源码在ROS社区中分享。很多大公司或大牛也经常会把一些机器人算法在ROS社区分享。这就为我们接触学术前沿提供了机会,也可以从中汲取不少新的灵感和知识。

比如2016年Google在ROS社区中开源了一种SLAM实现算法——cartographer,同时也分享了ICRA会议上的相关论文:

https://research.google.com/pubs/pub45466.html

再比如基于ROS实现的无人驾驶平台:

http://www.ros.org/news/2017/06/simulated-car-demo.html

当然,也少不了当今热门的人工智能与ROS的结合:

http://www.theconstructsim.com/machine-learning-openai-gym-ros-development-studio-2/

此外,很多基于ROS实现的论文都可以在这里找到:

http://wiki.ros.org/Papers

ROS的生态系统在机器人领域保罗万象,还有更多资源可以让我们随意使用,无论是提高个人技能,还是进行商业开发,都可以让我们站在巨人的肩膀上看得更远。这也是ROS最初的设计目标:提高机器人领域的代码复用率,促进不同组织之间各施所长、合作共赢。

 

至此,《浅谈ROS的产品化探索》系列文章也就告一段落了,笔者使用四篇文章浅谈了个人在ROS学习、应用、产品化开发过程中的一些感悟和总结,欢迎各位批评指正。

总而言之,ROS能不能产品化应用,不能用一个“能”或者“不能”简而概之,而是需要剖析开来具体分析,在应用中取其精华去其糟粕。

祝各位有一段美妙的ROS机器人开发之旅!


(四十八)——ROS机器人实例 (PR2)

PR2(Personal Robot 2,个人机器人2代)是Willow Garage公司设计的机器人平台,其中数字2代表第二代机器人。

PR2有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的夹爪;PR2依靠底部的四个轮子移动,在头部、胸部、肘部、夹爪上分别安装有高分辨率摄像头、激光测距仪、惯性测量单元、触觉传感器等丰富的传感设备。在PR2的底部有两台八核电脑作为机器人各硬件的控制和通信中枢,并且都安装了Ubuntu和ROS系统。

PR2和ROS有千丝万缕的关系,可以说ROS产生于PR2,也促成了PR2。ROS原本是Willow Garage为复杂的PR2机器人平台设计的软件框架,依靠强大的ROS,PR2可以独立完成多种复杂的任务,例如PR2可以自己开门、找到插头给自己充电、打开冰箱取出啤酒、打简单的台球等等。只不过PR2价格高昂,而且能力还达不到商业应用的要求,如今主要用于学术研究。

可见,PR2是ROS中元老级的机器人平台,所有软件代码依托于ROS,并且全部在ROS社区中开放源代码,为我们学习、应用ROS提供了丰富的资源。

 

一、 PR2功能包安装

 

在ROS Kinetic中,大部分PR2功能包还无法支持,官方推荐使用ROS Indigo运行PR2。

首先使用如下命令安装PR2机器人的相关功能包:

  1. $ sudo apt-get install ros-indigo-pr2-*

以上命令主要安装了下表中PR2机器人相关的ROS功能包。

PR2机器人售价昂贵,大多数人都无法接触到,所以这里我们使用仿真器运行PR2的相关功能。

 

二、 Gazebo中的PR2

 

使用如下命令启动gazebo仿真环境,并使用pr2.launch将机器人加载到gazebo中:

  1. $ roslaunch gazebo_ros empty_world.launch
  2. $ roslaunchpr2_gazebo pr2.launch

也可以使用pr2_gazebo功能包中的pr2_empty_world.launch一次性启动gazebo并加载机器人模型:

  1. $ roslaunch pr2_gazebo pr2_empty_world.launch

启动成功后,就可以在一个空旷的gazebo仿真环境中看到PR2机器人了。

查看当前系统中的话题列表,会看到众多话题已经发布或者等待订阅,这就是PR2机器人仿真器提供给用户的接口,我们可以基于这些接口实现很多功能。

为了测试PR2的传感器是否启动成功,可以在仿真环境中随机添加一些外部物体。

然后打开rviz,添加点云、激光、摄像头等插件,实现传感器数据的可视化显示。

目前PR2机器人还处于静止状态,可以运行键盘控制节点,控制PR2运动:

  1. $ roslaunch pr2_teleop teleop_keyboard.launch

启动后根据终端中的提示,使用键盘控制PR2机器人在gazebo中移动,同时rviz中的PR2模型也会同步更新。

在控制PR2移动时,rviz中的Fixed Frame需要修改为odom_combined

 

三、 使用PR2实现SLAM

 

在PR2仿真环境中,我们已经获取到所有传感器的数据,并且可以控制PR2移动,接下来尝试使用PR2实现SLAM。

第一步还是启动PR2的gazebo仿真环境:

  1. $ roslaunchpr2_gazebo pr2_empty_world.launch

然后在空旷的gazebo仿真环境中添加一些障碍物体。

这里以gmapping为例,创建一个启动gmapping节点的启动文件pr2_build_map.launch:

  1. <launch>
  2.    <node name="gmapping_node"pkg="gmapping"type="slam_gmapping" respawn="false" >
  3.        <remap to="base_scan" from="scan"/>
  4.        <paramname="odom_frame" value="odom_combined" />
  5.    </node>
  6. </launch>

然后在该文件所在的路径下直接运行以下命令:

  1. $ roslaunch pr2_build_map.launch

如果launch文件、节点、可执行文件等在终端的当前路径下,运行命令时可以不加功能包名。

启动成功后,gmapping节点就开始SLAM建图了。启动rviz并添加显示插件后,可以看到如图所示的SLAM效果。

启动键盘控制节点,控制PR2机器人在仿真环境中围绕障碍物体移动,就可以实现SLAM了。

  1. $ roslaunch pr2_teleop teleop_keyboard.launch

 

四、 PR2机械臂的使用

 

PR2不仅是一个移动机器人平台,它还装配了两个机械手,可以实现很多复杂的机械臂操作。类似于键盘发布速度控制指令,我们也可以在终端中使用如下命令控制PR2的两个机械臂:

  1. $ roslaunch pr2_gazebo pr2_empty_world.launch
  2. $ roslaunch pr2_teleop_general pr2_teleop_general_keyboard.launch

启动成功后,可以在终端中看到提示信息,分别控制PR2的头部、身体、机械臂等多个可运动部位。

此处选择控制机械臂,然后会看到一系列控制命令。

按照命令提示点击键盘按键,就可以控制PR2机器人的两个手臂运动了。

说到机械臂运动,就不得不提到MoveIt!,PR2机器人的机械臂也可以通过MoveIt!控制。在安装完成的PR2功能包中,已经包含了PR2手臂的MoveIt!配置功能包,可以直接启动demo示例:

  1. $ roslaunch pr2_moveit_config demo.launch

在启动的rviz中会看moveit的界面,可以通过MoveIt!插件或代码控制机械手臂运动。

除此之外,我们也可以使用如下命令,通过MoveIt!控制gazebo仿真器中的PR2:

  1. $ roslaunch pr2_gazebopr2_empty_world.launch
  2. $ roslaunch pr2_moveit_config move_group.launch
  3. $ roslaunch pr2_moveit_config moveit_rviz.launch

各种控制器插件在这里都已经配置完成,有兴趣的读者可以详细学习PR2功能包中的源码,这些都是我们实践过程中重要的参考资料。

再次在rviz中控制PR2的机械手臂运动,gazebo中PR2的手臂将根据规划的轨迹完成运动。

 

(四十九)——ROS机器人实例 (TurtleBot)

上一篇介绍了ROS中的元老机器人——PR2,虽然功能强大,但价格昂贵,无法推广。所以Willow Garage又开发了一款低成本的机器人平台——TurtleBot。

TurtleBot的目的是给入门级的机器人爱好者或从事移动机器人编程开发者提供一个基础平台,让他们直接使用TurtleBot自带的软硬件,专注于应用程序的开发,避免了设计草图、购买、加工材料、设计电路、编写驱动、组装等一系列工作。借助该机器人平台,可以省掉很多前期工作,只要根据平台的软硬件接口,就能开发出所需的功能。

TurtleBot可以说是ROS中最为重要的机器人之一,它伴随ROS一同成长,一直都作为ROS开发前沿的机器人,几乎每个版本的ROS测试都会以TurtleBot为主,包括ROS2也率先在TurtleBot上进行了大量测试。

所以TurtleBot也是ROS支持度最好的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用ROS开发移动机器人的重要资源。

TurtleBot第一代发布于2010年,两年后发布了第二代产品。前两代TurtleBot都使用iRobot的机器人作为底盘,在底盘上可以装载激光雷达、Kinect等传感器,使用PC搭载基于ROS的控制系统。

在2016年的ROSCon上,韩国机器人公司Robotis和开源机器人基金会(OSRF)发布了TurtleBot 3,彻底颠覆了原有TurtleBot的外形设计,成本进一步降低,而且模块化更强,可以根据开发者的需求自由改装。TurtleBot 3并不是为取代TurtleBot 2而生,而是提出了一种更加灵活的移动机器人平台。

那么如何在ROS中使用Turtlebot呢?

首先需要安装Turtlebot相关的所有功能包,使用如下命令安装:

  1. $ sudo apt-get install ros-kinetic-turtlebot-*

安装完成后的功能包中包含了所有Turtlebot真机与仿真的功能,这里还是以gazebo仿真为主进行实践。

 

gazebo中的TurtleBot

 

第一步依然是启动gazebo仿真环境,并且加载Turtlebot机器人:

  1. $ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
  2. $ roslaunch turtlebot_gazebo turtlebot_world.launch

这里需要使用环境变量TURTLEBOT_GAZEBO_WORLD_FILE为仿真环境指定地图,否则会显示找不到地图的错误。

启动成功后可以看到gazebo界面,TurtleBot 2已经成功加载到仿真环境当中。

查看当前系统中的话题列表,可以看到很多已经发布和等待订阅的话题。

打开rviz,可视化显示需要的传感器数据,可以看到机器人摄像头、激光雷达、点云等信息。

然后使用如下命令启动键盘控制节点:

  1. $ roslaunch turtlebot_teleopkeyboard_teleop.launch

根据终端中的命令提示,控制TurtleBot在仿真器中移动,rviz中的机器人以及传感器信息会同步更新。

TurtleBot导航仿真

 

接下来在仿真环境中使用TurtleBot实现导航功能。

第一步是SLAM建图。turtlebot_gazebo功能包中已经提供了使用gmapping实现SLAM建图的启动文件,但是文件内部的包含路径有一点问题,直接运行会提示错误。

使用如下命令打开gmapping_demo.launch文件,进行一点修改:

  1. $ roscd turtlebot_gazebo/launch/
  2. $ sudo gedit gmapping_demo.launch

在gmapping.launch.xml文件的路径前加入gmapping文件夹,修改后的gmapping_demo.launch文件内容如下:

  1. <launch>
  2.     <include file="$(find turtlebot_navigation)/launch/includes/gmapping/gmapping.launch.xml"/>
  3. </launch>

然后使用如下命令启动仿真环境和gmapping节点:

  1. $ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
  2. $ roslaunch turtlebot_gazebo turtlebot_world.launch
  3. $ roslaunch turtlebot_gazebo gmapping_demo.launch
  4. $ roslaunch turtlebot_rviz_launchers view_navigation.launch
  5. $ roslaunch turtlebot_teleop keyboard_teleop.launch

通过键盘控制TurtleBot在仿真环境中移动,在打开的rviz中可以看到SLAM过程。

SLAM结束后使用如下命令保存地图,命名为turtlebot_test_map:

  1. $ rosrun map_servermap_saver -f turtlebot_test_map

接下来我们在建立完成的地图上实现TurtleBot自主导航功能。turtlebot_gazebo功能包中同样提供了实现导航功能的launch启动文件,但是文件内部的包含路径也有问题,直接运行会提示错误。

使用如下命令打开amcl_demo.launch文件,进行一点修改:

  1. $ roscd turtlebot_gazebo/launch/
  2. $ sudo gedit amcl_demo.launch

在amcl.launch.xml文件的路径前加入amcl文件夹,修改后的amcl_demo.launch文件内容如下:

  1. <launch>
  2.    <!-- Map server -->
  3.    <arg name="map_file"default="$(envTURTLEBOT_GAZEBO_MAP_FILE)"/>
  4.    <node name="map_server" pkg="map_server"type="map_server" args="$(arg map_file)" />
  5.  
  6.    <!-- Localization -->
  7.    <arg name="initial_pose_x"default="0.0"/>
  8.    <arg name="initial_pose_y"default="0.0"/>
  9.    <arg name="initial_pose_a"default="0.0"/>
  10.    <include file="$(find turtlebot_navigation)/launch/includes/amcl/amcl.launch.xml">
  11.        <arg name="initial_pose_x"value="$(arg initial_pose_x)"/>
  12.        <arg name="initial_pose_y"value="$(arg initial_pose_y)"/>
  13.        <argname="initial_pose_a" value="$(arg initial_pose_a)"/>
  14.    </include>
  15.  
  16.    <!-- Move base -->
  17.    <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>
  18. </launch>

现在关闭除仿真环境以外的其他节点和rviz,运行如下命令就可以开始导航了。

  1. $ roslaunch turtlebot_gazebo amcl_demo.launch map_file:=/home/hcx/turtlebot_test_map.yaml
  2. $ roslaunch turtlebot_rviz_launchers view_navigation.launch

在rviz中选择导航的目标点后,gazebo中的TurtleBot开始向目标移动,rviz中可以看到传感器信息和机器人状态显示。

TurtleBot 3

ROS Kinetic中也集成了TurtleBot 3相关功能包的二进制安装文件,我们也来尝尝鲜。

使用如下命令安装TurtleBot 3的所有相关功能包:

  1. $ sudo apt-get install ros-kinetic-turtlebot3-*

安装完成后,使用如下命令启动TurtleBot 3的仿真环境:

  1. $ export TURTLEBOT3_MODEL=burger
  2. $ roslaunch turtlebot3_gazebo turtlebot3_world.launch

TurtleBot 3目前有两种模型:burger和Waffle,启动之前必须通过环境变量的方式设置所需要的模型,这里选择burger。

启动成功后,可以看到gazebo仿真环境和TurtleBot 3机器人。

查看当前系统中的话题列表,因为TurtleBot 3 burger模型较为简单,搭载的传感器也并不多,所以这里发布和订阅的话题也比较少。

基于这个仿真环境和现有的传感器数据,可以使用如下命令实现TurtleBot 3的SLAM功能:

  1. $ roslaunch turtlebot3_slam turtlebot3_slam.launch
  2. $ rosrun turtlebot3_teleop turtlebot3_teleop_key

打开rviz,并且订阅传感器和地图数据,通过键盘控制TurtleBot 3运动,就可以看到SLAM效果了。

类似于TurtleBot 2,我们也可以在建立的地图上实现导航功能,此处不再赘述。

(五十)——ROS机器人实例 (Universal Robots)

Universal Robots(优傲机器人)公司是一家引领协作机器人全新细分市场的先驱企业,该公司成立于2005年,关注机器人的用户可操作性和灵活度,总部位于丹麦的欧登塞市,主要的机器人产品有:UR3、UR5和UR10,分别针对不同的负载级别。

Universal Robots早在2009年便推出了第一款协作机器人——UR5,自重18公斤,负载高达5公斤,工作半径85cm,不仅颠覆了人们对于传统工业机器人的认识,还自此定义了“协作机器人”的真正意义。除了安全度高、无需安全围栏等特点外,协作机器人还应该具备编程简单和灵活度高等特点,才能实现真正的人机和谐共事。

2015年3月推出的UR3是现今市场上最灵活轻便、并且可与工人一起肩并肩工作的台式机器人。它自重仅为11公斤,但是有效负载却高达3公斤,所有腕关节均可360度旋转,而末端关节可作无限旋转。UR 10的有效负载为10公斤,工作半径130cm。三款机器人均以编程的简易性、高度灵活性以及与人一起工作的安全可靠性而享誉业内。

ROS中同样集成了Universal Robots机器人的功能包,使用如下命令即可安装,其中包含UR3、UR5、UR10三款机器人的相关功能:

  1. $ sudo apt-get install ros-kinetic-universal-robot

在使用之前,先来了解一下Universal Robots的相关功能包。

接下来我们以UR5为例,学习Universal Robots功能包的使用方法。

 

gazebo中的UR机器人

使用以下命令启动UR5机器人的gazebo仿真环境:

  1. $ roslaunch ur_gazebo ur5.launch

启动成功后可以看到仿真环境中的UR5。

查看当前系统中的话题列表。

follow_joint_trajectory是MoveIt!最终规划发布的action消息,由机器人控制器端接收该消息后控制机器人完成运动。从上边的话题列表中,可以找到follow_joint_trajectory,由仿真机器人的控制器插件订阅。

打开启动的ur5.launch文件,可以看到以下代码段:

  1.    <rosparam file="$(find ur_gazebo)/controller/arm_controller_ur5.yaml" command="load"/>   
  2.    <node name="arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn arm_controller" respawn="false" output="screen"/>

控制器管理节点controller_manager启动了一个arm_controller插件,该插件的配置可以查看arm_controller_ur5.yaml文件:

  1. arm_controller:
  2.  type:position_controllers/JointTrajectoryController
  3.  joints:
  4.     -shoulder_pan_joint
  5.     -shoulder_lift_joint
  6.     -elbow_joint
  7.     -wrist_1_joint
  8.     -wrist_2_joint
  9.     - wrist_3_joint
  10. constraints:
  11.     goal_time: 0.6
  12.     stopped_velocity_tolerance: 0.05
  13.     shoulder_pan_joint: {trajectory: 0.1, goal: 0.1}
  14.     shoulder_lift_joint: {trajectory: 0.1, goal: 0.1}
  15.     elbow_joint: {trajectory: 0.1, goal: 0.1}
  16.     wrist_1_joint: {trajectory: 0.1, goal: 0.1}
  17.     wrist_2_joint: {trajectory: 0.1, goal: 0.1}
  18.     wrist_3_joint: {trajectory: 0.1, goal: 0.1}
  19. stop_trajectory_duration: 0.5
  20. state_publish_rate:  25
  21. action_monitor_rate: 10

从上边的配置信息中可以看到,arm_controller是一个JointTrajectory类型的控制器,接收follow_joint_trajectory中的轨迹信息后,完成机器人的运动控制。

 

使用MoveIt!控制UR机器

ROS中类似于UR5这样的机械臂控制当然离不开MoveIt!,接下来我们就使用MoveIt!实现对gazebo中UR5的控制。

UR5的控制需要通过follow_joint_trajectory这个action接口实现,这就需要在MoveIt!端配置一个控制器插件,实现该接口的功能。该插件的配置在ur5_moveit_config中已经实现,可以查看ur5_moveit_config功能包中的controllers.yaml文件:

  1. controller_list:
  2.  - name:""
  3.   action_ns: follow_joint_trajectory
  4.    type:FollowJointTrajectory
  5.    joints:
  6.      -shoulder_pan_joint
  7.      -shoulder_lift_joint
  8.      -elbow_joint
  9.      -wrist_1_joint
  10.      -wrist_2_joint
  11.      -wrist_3_joint

所以我们并不需要进行任何修改,使用如下命令启动MoveIt!和rviz,启动过程会包含所需要的控制器插件:

  1. $ roslaunch ur5_moveit_config ur5_moveit_planning_execution.launchsim:=true
  2. $ roslaunch ur5_moveit_config moveit_rviz.launch config:=true

启动成功后可以看到如下界面。

目前,rviz和gazebo中的UR5应该保持同样的姿态。在rviz中使用MoveIt!插件选择一个运动目标姿态,然后点击“Plan”。如果可以实现运动规划,就会看到如下规划轨迹。

再点击“Execute”按钮,gazebo中的UR5会按照规划的轨迹开始运动,rviz中的UR5模型保持同样的运动姿态,如下图所示。

 

(五十一)——ROS机器人实例 (HRMRP)

HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台)是笔者在2012年和实验室的小伙伴们一起从零开始设计、开发的一款机器人平台,其中大部分扩展电路、驱动和ROS相关的底层功能都是我们自己开发。该机器人平台具有软硬件可编程、灵活性强、模块化、易扩展、实时性强等特点,机器人的整体结构如下图所示。

HRMRP具备丰富的传感器和执行器,在该平台的基础上,可以现了机器人SLAM、自主导航、人脸识别、机械臂控制等功能。

 

总体架构设计

HRMRP的总体架构如下图所示。

1. 硬件层

(1)机械平台

HRMRP主体结构为铝合金材质,尺寸为316mm ×313mm ×342mm(高×宽×长),装配两个驱动轮与一个万向轮。驱动轮由两个30W的直流电机带动,转速可达83转/分钟,机器人最快速度1.5m/s。HRMRP还装有一个六自由度机械臂,可以完成三维空间内的夹取操作。

(2) 控制平台

嵌入式系统具备小型化、低功耗、低成本、高灵活性等显著的特点,电子技术的发展也促使可编程门阵列FPGA在嵌入式系统中得到了越来越广泛的应用,很大程度上改善了嵌入式系统硬件的灵活度与繁琐计算的实时化。

HRMRP的控制平台即基于Xilinx最新一代集成FPGA与ARM的SoC——Zynq。

Zynq由处理系统(Processor System,PS)与可编程逻辑(Programmable Logic,PL)两部分组成。其中PS基于ARM Cortex-A9双核处理器构建,包含常用的外设接口,例如网络、USB、内存控制器等。而PL由Xilinx的7系列FPGA构成,支持动态重配置,可以使用Verilog语言编程。

在HRMRP中,PS通过操作系统控制所有功能正常有序的实现,而PL作为协处理器,一方面可以对复杂运算做并行加速处理,另一方面可以进行I/O接口扩展,为多传感器和执行器设计统一的接口,提高系统硬件配置的灵活性。

(3) 传感器系统

在机器人核心传感器的选择上,HRMRP使用了高性价比、高集成度的微软Kinect 传感器。除此还装配有超声波、加速度、里程计、陀螺仪等多种传感器,确保机器人平台可以采集到丰富的传感信息。

 

2. 驱动层

驱动层的主要工作是采集或预处理硬件层的数据,下发操作系统层的指令,为底层硬件与上层功能模块提供相应的数据传输通道。由于我们采用“ARM+FPGA”异构控制平台,为配合硬件层功能,驱动层也分为两部分,分别放置于硬件的PS端和PL端。

PS端主要驱动连接到ARM处理器的外设,例如通过PS中的OpenNI驱动Kinect,并且提供PL端到PS端的接口。而在PL端中,利用可编程硬件的灵活性和并行处理能力,进行I/O扩展与算法的硬件加速,如下图所示。

在I/O扩展方面,传统的设计实现中,种类繁多的传感器、执行器对接口的要求各不相同,会占用大量I/O资源,增加处理器的负担。而在HRMRP的ARM+FPGA系统当中,通过定义一组标准的硬件接口,连接传感器和电机等外设,可使用编程逻辑取代繁杂的电路连接工作,满足各种不同需求的硬件外设。

在硬件加速方面,一般来说PS端适合常用接口的驱动、网络数据的处理等功能,而PL端适合于规律性的算法处理,在HRMRP中主要负责Kinect的数据预处理工作(这里我们将OpenNI中的部分代码放入FPGA中进行加速)。PS与PL相互配合,提高了系统数据处理的实时性。

 

3. 操作系统层

操作系统层是机器人平台的控制核心,集成了机器人的功能模块,负责行为控制、 数据上传、指令解析、人机交互等功能。为与ROS通信接口保持一致,使用Ubuntu作为操作系统,运行于Zynq的PS端ARM处理器之中。

ROS为用户的不同需求提供了大小和功能不同的多种安装包,为了减少ARM端的执行压力,HRMRP编译移植了仅包括ROS基本通信机制的核心库。继承了ROS的优势,机器人平台具备ROS通信以及功能包运行的能力,与上层网络指令无缝连接,结合开源软件库,极大地丰富了机器人的功能模块与应用范围。

HRMRP是一种较为典型的高性能、低成本机器人平台。与现在研究和应用中使用较为广泛的TurtleBot、Pioneer等机器人相比,HRMRP具有相似的结构与尺寸,同样可以完成多种多样的机器人应用;但是在接口的可扩展性、传感器的丰富度以及成本控制等方面,具备更好的综合性能。

 

SLAM与导航

在以上架构的基础上实现每个模块的具体功能,系统运行状态下的数据流图如下图所示。

HRMRP在室内环境下的SLAM建图效果如下图所示。

基于SLAM建立的地图完成导航的效果如下图所示。

 

多机器人扩展

ROS作为一个分布式框架,从微观的角度讲,分布式体现在节点的布局和配置上,而从宏观的角度讲,这种分布式可以体现在多机器人、多主机集成的系统当中。在HRMRP机器人的基础上,我们试图提出一种多机器人实现的框架,如下图所示。

由于机器人架构多种多样,处理应用的能力也各不相同,在不同场合下的需求也有差异,我们设计了服务器层来提高机器人应用的计算能力,负责调度、分配多机器人应用中的任务,同时为用户提供友好、易用的人机交互界面。

分布的机器人节点与服务器都采用ROS框架设计,使用无线网络通信,可以快速集成ROS社区中丰富的应用功能。在多机器人系统当中,通过机器人之间的信息共享和与任务协作,可以让每个机器人在充分发挥自己能力的同时,获得更多额外的应用潜力。

机器人节点是应用的执行者与信息的采集者。在该系统中可以集成多种采用ROS框架的机器人,这里以HRMRP机器人平台为例,针对多机器人的框架也进行了测试,除HRMRP机器人之外,还使用树莓派制作了一个简单的小型机器人。

在实验中,HRMRP机器人在地图上自主导航前进,服务器负责应用的处理与显示,同时将HRMRP的位置信息转发给树莓派机器人;树莓派机器人收到信息后,紧跟HRMRP,效果如下图所示。

 

(五十二)—— MoveIt!中的运动学插件

MoveIt!是ROS中一个重要的集成化开发平台,由一系列移动操作的功能包组成,提供运动规划、操作控制、3D感知、运动学等功能模块,是ROS社区中使用度排名前三的功能包,目前已经支持众多机器人硬件平台。

MoveIt!中的众多功能都使用插件机制集成,其中有一个重要的功能模块——运动学插件。

今天我们就来聊下MoveIt!中的运动学求解器。

 

一、KDL

Kinematics and Dynamics Library (KDL)是MoveIt!中的默认运动学插件,在使用MoveIt! Setup Assistant进行模型配置时,可以进行配置。

配置完成后,就可以运行demo.launch控制虚拟机械臂进行运动规划了。但是KDL有自己的优缺点:

比如一次逆解的求解时间:0.062192秒。。。

很多时候我们在做运动规划的时候,MoveIt!经常会提示规划失败、求解失败等错误,很多都是因为KDL这款运动学插件导致的,那么问题就来了——能不能更换一个运动学插件?

当然可以,以下介绍两个用的最多的运动学插件:TRAC-IK和IKFAST。

 

二、TRAC-IK

TRAC-IK和KDL类似,也是一种基于数值解的运动学插件,但是在算法层面上进行了很多改进,求解效率高了很多。比如在下边这张图中,左侧的红点是KDL无法求解的姿态点,但是在右侧使用TRAC-IK是可以求解的。

那么如何将KDL更换成TRAC-IK呢,方法很简单,ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:

  1. sudo apt-get install ros-kinetic-trac-ik-kinematics-plugin

然后修改机械臂MoveIt!配置功能包下的kinematics.yaml文件就可以使用啦:

  1. arm:
  2.   kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin
  3.   kinematics_solver_attempts: 3
  4.   kinematics_solver_search_resolution: 0.005
  5.   kinematics_solver_timeout: 0.05

接下来再次运行demo.launch,默认加载的就是TRAC-IK运动学插件了,试试规划求解的效率是不是高了很多!

但是TRAC-IK也有问题,它是一种数值算法,每次求解得到的关节位置不一定相同。

 

三、IKFAST

IKFAST是一种基于解析算法的运动学插件,可以保证每次求解的一致性。

相比KDL和TRAC-IK,IKFAST的安装过程就比较复杂了,不过就笔者的使用经验来讲,IKFAST的效果还是很推荐的,所以不妨一试,以下就是IKFAST的安装配置过程。

  • 安装程序:

  1. sudo apt-get install cmake g++ git ipython minizip python-dev python-h5py python-numpy python-scipy qt4-dev-tools
  • 安装依赖库:

  1. sudo apt-get install libassimp-dev libavcodec-dev libavformat-dev libavformat-dev libboost-all-dev libboost-date-time-dev libbullet-dev libfaac-dev libglew-dev libgsm1-dev liblapack-dev liblog4cxx-dev libmpfr-dev libode-dev libogg-dev libpcrecpp0v5 libpcre3-dev libqhull-dev libqt4-dev libsoqt-dev-common libsoqt4-dev libswscale-dev libswscale-dev libvorbis-dev libx264-dev libxml2-dev libxvidcore-dev
  • 安装OpenSceneGraph-3.4:

  1. sudo apt-get install libcairo2-dev libjasper-dev libpoppler-glib-dev libsdl2-dev libtiff5-dev libxrandr-dev
  2. git clone https://github.com/openscenegraph/OpenSceneGraph.git --branch OpenSceneGraph-3.4
  3. cd OpenSceneGraph
  4. mkdir build; cd build
  5. cmake .. -DDESIRED_QT_VERSION=4
  6. make -j$(nproc)
  7. sudo make install
  • 安装sympy

  1. pip install --upgrade --user sympy==0.7.1
  • 删除mpmath

  1. sudo apt remove python-mpmath
  • 安装IKFast功能包

  1. sudo apt-get install ros-kinetic-moveit-kinematics
  • 安装OpenRave

  1. sudo apt-get install ros-kinetic-openrave
  • 创建collada文件

  1. export MYROBOT_NAME="marm"
  2. rosrun xacro xacro --inorder -o "$MYROBOT_NAME".urdf "$MYROBOT_NAME".xacro    
  3. rosrun collada_urdf urdf_to_collada "$MYROBOT_NAME".urdf "$MYROBOT_NAME".dae<br></font>

  • 创建dae文件

  1. export IKFAST_PRECISION="5"
  2. cp "$MYROBOT_NAME".dae "$MYROBOT_NAME".backup.dae # create a backup of your full precision dae.
  3. rosrun moveit_kinematics round_collada_numbers.py "$MYROBOT_NAME".dae "$MYROBOT_NAME".dae "$IKFAST_PRECISION"
  • 查看生成的模型

  1. openrave-robot.py "$MYROBOT_NAME".dae --info links

  1. openrave "$MYROBOT_NAME".dae

  • 生成六轴机器人配置

  1. export PLANNING_GROUP="arm"
  2. export BASE_LINK="1"
  3. export EEF_LINK="11"
  4.  
  5. export IKFAST_OUTPUT_PATH=`pwd`/ikfast61_"$PLANNING_GROUP".cpp
  6.  
  7. python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot="$MYROBOT_NAME".dae --iktype=transform6d --baselink="$BASE_LINK" --eelink="$EEF_LINK" --savefile="$IKFAST_OUTPUT_PATH"
  • 创建插件

  1. export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
  2. cd ~/catkin_ws/src
  3. catkin_create_pkg "$MOVEIT_IK_PLUGIN_PKG"
  4. rosrun moveit_kinematics create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"
  • 重新编译工作空间

  1. catkin_make
  • 修改使用的插件

  1. rosed "$MYROBOT_NAME"_moveit_config/config/kinematics.yaml
  2.  
  3. <planning_group>:
  4. kinematics_solver: <myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin
  5. -INSTEAD OF-
  6. kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin

注意以上步骤中的机器人名称、运动规划组名称、坐标系序号等需要和自己所使用的机器人匹配,也可以参考官方教程配置:

http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/ikfast/ikfast_tutorial.html

现在运行demo.launch文件时,使用的运动学插件就是IKFAST了,快试一试效果是不是还不错!


(五十三)—— ROS与VREP的集成

VREP( Virtual Robot Experimentation Platform)是一款瑞士军刀级的机器人仿真软件,包含的功能众多,而且使用方便,在各种系统下都有相应的安装文件。

今天我们就来看看如何将ROS和vrep集成,把两个强大的平台结合到一起。

版本设定:Ubuntu16.04 + ROS Kinetic + vrep3.4

 

一、下载vrep

第一步当然是下载vrep软件啦!

登录vrep官网:http://www.v-rep.eu/downloads.html

找到相应版本的下载地址,然后选择Linux版本即可下载。这里选择的是3.4版本。

下载完成后的vrep是一个压缩文件,解压该文件后,放置到home路径下(可自定义),重命名为vrep。

ubuntu下的vrep不需要特意安装,直接在终端下运行如下命令即可启动:

  1. $ cd vrep
  2. $ ./vrep.sh

启动成功的界面如下图所示:

 

二、配置ROS接口

vrep提供了一个ROS接口——RosInterface,使用ROS插件搭建了一座vrep和ROS之间的桥梁,其原理如下:

不过该插件需要通过编译四个功能包来生成。

创建一个单独的工作空间,将 vrep/programming/ros_packages路径下的四个功能包拷贝到工作空间下,或者使用如下命令下载这四个功能包:

  1. $ git clone https://github.com/CoppeliaRobotics/ros_bubble_rob2
  2. $ git clone https://github.com/CoppeliaRobotics/vrep_skeleton_msg_and_srv.git
  3. $ git clone https://github.com/CoppeliaRobotics/vrep_plugin_skeleton.git
  4. $ git clone --recursive https://github.com/CoppeliaRobotics/v_repExtRosInterface.git

然后在终端设置vrep的路径,并且编译工作空间

  1. $ export VREP_ROOT=~/path/to/v_rep/folder
  2. $ catkin build

编译成功后,在/deve/lib/下找到以下两个库,拷贝到vrep根路径下即可。

 

三、启动vrep

ROS与vrep集成的配置工作已经完成,接下来就可以启动系统啦。

使用如下命令启动ros master和vrep:

  1. $ roscore
  2. $ ./vrep.sh

在启动vrep的终端中应该可以看到如下RosInterface加载的日志提示:

这个时候vrep和ROS已经连接成功,不信可以打印当前系统的话题看看:

vrep接口相关的话题赫然在目。

 

四、集成测试

最后就进入到激动人心的测试环节了。vrep中已经自带了几个测试例程。

先来加载第一个仿真场景:

然后在显示区会出现很多五颜六色的模型,点击工具栏中的开始按键,启动仿真。vrep场景中的会仿真一个摄像头,并且发布图像话题,在ROS中打开rqt_image_view,订阅图像话题,看看是不是已经有图像出现啦!

这里存在一个数据流的问题,导致vrep和ROS中的图像是相反的,可以在vrep端发布数据或者ROS端订阅数据时,对图像数据做一个倒置处理,即可解决问题。

从这个例程中,我们可以看到vrep中的数据可以顺利通过RosInterface发送到ROS端。

接下来将ROS端的数据发送到vrep,一样需要加载仿真场景:

场景中有几个可爱的小机器人,每个机器人对应于一个数据来源。开始仿真后,其他几个机器人就开始活跃起来,唯独下图中的红色机器人纹丝不动。

从机器人旁边的提示可以看到,“小红”需要通过ROS节点来控制。这让我们想起了ROS中的小海龟。

查看当前ROS系统的话题列表:

和小海龟订阅的Twist消息不同,“小红”订阅了两个话题,分别对应于两个驱动电机的速度,在终端中发布如下命令,即可控制“小红”移动,差速就要自己来控制啦。

  1. $ rostopic pub /leftMotorSpeed2084567 std_msgs/Float32 "data: 1.0"
  2. $ rostopic pub /rightMotorSpeed2084567 std_msgs/Float32 "data: 0.5"

OK!今天就测试到这里,后续我们再进一步通过ROS控制vrep中的机器人实现仿真。

 

注:以上内容,也可以查看vrep自带的帮助文档:/vrep/helpFiles/en/rosTutorial.htm


(五十四)—— ROS机器人开发案例(附ppt)

8月1日晚,古月君在深蓝学院的的公开课平台,和大家一起聊了下ROS机器人开发的相关案例,主要结合自身机器人开发经验,从机器人系统组成、移动机器人开发案例和机械臂开发案例等三个方面,介绍了古月君是如何将ROS应用于机器人项目开发的。

 

公开课的全部内容可以免费回看,有兴趣的小伙伴可以访问课程网站:

http://www.shenlanxueyuan.com/open/course/13

 

另外古月君主讲的《机器人操作系统ROS理论与实践》第二期课程也在火热进行中,同样可以在深蓝学院的机器人课程中找到:

http://www.shenlanxueyuan.com/course/92

 

以下是8月1日晚公开课的ppt内容,供各位参考。

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ROS Industrial
ROS系统MoveIt玩转双臂机器人系列(一)
ROS探索总结(四)
turtlebot校正(2)
不用下载安装,你的机器人可以直接在浏览器里跳舞丨Jupyter-ROS
ROS 学习系列 -- RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服