编辑推荐: |
本文于exbot,通过ROS中的应用功能分类:底层驱动,
上层功能,控制模块,常用组件并具体分析。
|
|
一、底层驱动
机器人开发是一个软硬件结合的领域,常常需要涉及很多传感器、执行器的驱动。常用的硬件一般都可以在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中资源最为丰富的一个部分,不仅可以帮助我们快速搭建功能原型,验证设计上的问题,同时还可以借助开源代码,助力后续的功能开发,绝对是机器人开发的优质资源。
|