ROS的运用开发详解

描述

ROS的运用开发

一般来说市面上机器人的开发分两个主流,一个是移动机器人(AGV),主要运用场景是酒店送餐,餐厅导航+送餐,仓库物流,银行业务处理等;一种是协作机器人,六自由度,用于抓取、焊接等。

当然还有这两种的结合形成可搬运加抓取的复合机器人,一些小的方向还有人形机器人、无人机等。

以开发AGV为例 ,对于AGV来说尤其是室内运用的场景,最重要的就是地图构建和导航,也就是SLAM技术。

这里面主要涉及三大块:

1、建图,比如gmapping,hector_slam,cartographer这几个算法,通过采集点云数据进行地图构建。这里的点云数据一般是一个特定平面的,如何sick tim571、倍加福R2000、镭神这些传感器都能实现该功能,并提供好了对应的ROS包,或者通过kinect、realsense三维传感器将其转换为二维的数据。不管是哪种传感器,不同于接口。

激光雷达一般是网口形式,和运行的Ubuntu电脑组成一个局域网,而三维点云一般是通过USB或者串口通信使ROS获取到数据。

所以使用ROS的这点好处就在于,不用太关注于硬件接口甚至物理接口的定义。

对于ROS使用建图包,我在《ROS中slam_gmapping、map_server源码解读及其librviz的使用》中有详细说明。

2、定位, 常用的是AMCL算法,也就是针对上述建图得到的机器人当前在地图中的位置坐标信息,因为是二维地图,得到的数据是x,y坐标和方向角。

AMCL包一般和导航的包是合在一起的。这里单独列出来是为了说明还有其他定位方式,比如光反射导航定位、超声波导航定位、wifi定位等,有篇总结比较好的博客《自主移动机器人常用的导航定位技术及原理》可以参见一下。

3、导航和路径规划,也就是move_base包,里面还包含局部路径规划,全局路径规划,dwa路径搜索和costmap_2d。关于这些包之间的调用,网上有太多这样的图,我就没必要再贴一遍了。

costmap是David V. Lu提出的算法,即代价地图,其核心思想是对所建立的地图包括机器人本身都要进行一定的膨胀,也就是预留一定空间要考虑机器人的体积大小,不然行驶时,尤其是转弯,机器人会碰撞到障碍物。

关于costmap的应用,尤其是添加自己想要的layer,贺一家博士有很好的实践,参见《ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin》。

有了上述这几个包,机器人就能跑起来了吗?答案肯定是否定的,不过至少这些包可以在Gazebo和rviz中仿真了,看起来效果还是挺不错的。

不过仿真和实际差别还是太大了,比如真实环境中激光雷达采集到的数据,真实环境中所建立的地图等。 此外,搭建一个小型的机器人系统从硬件选型到调试成功也会经历一段非常痛苦的过程

为了快速上手或者验证,可以从一些现成的机器人入手,比如TurtleBot。不过这些更多适用于实验室研究,比如算法的验证等。对于真正的开发机器人产品,也具有一定的参考价值。

一般而言,AGV的系统架构图如下:

移动机器人

可以看到主要核心控制是运行在Ubuntu的工业级电脑上,激光雷达基本是现成的模块,语音系统一般是选配的模块,这种模块也挺多,比如科大讯飞等,根据项目需求来。

同等重要的还有传感器采集模块,也就是ARM层或PLC层,这一层主要用于采集外围的数据包括电机驱动并上传数据给ROS层,所以这个工作量也非常大,涉及到的通信协议也比较多,就相当于一个智能节点。

至关重要的就是ARM层和PC之间的通信,无论是传输速率还是协议的稳定性都有待大量的验证,曾经因为通信协议的问题导致的粘包也是相当难定位的。

所以尽量不要采用自有协议,用稳定的modbus 232,CANopen总线等是比较好的选择。关于和硬件通信方面的问题,引用一个老外的话,我觉得遵循这个原则是比较稳定的,尤其是在加载硬件初始化的过程中。

其次,AGV一般是两轮或者四轮的结构,驱动器和电机的选择也是非常重要的,不然里程计导致的累计误差会影响建图和定位精度。

现在有专门只做AGV控制器的公司,也就是图片中的ROS层和ARM层这一块(注:就不一定是采用的ROS框架了),控制器本身就预留有IO,还能适配某些485协议和控制某些型号的电机驱动器,这些模块直接插上去就可以用。

此外,对外还提供了各种各样的接口(TCP server,web,modbus master等)用于二次开发。于是客户更侧重于应用层,也就是HMI这一块,比如手机端应用,web端显示,PC端的软件等,这种二次开发一般采用C/S或者B/S的架构。

我看到一个比较好的AGV调试人机交互界面例子是Ros_Qt5_Gui_App(在GitHub上搜ros qt gui就排在我前面一位)。

最后就是结构问题,我不知道是不是因为腾讯、阿里巴巴、网易、字节跳动等这些互联网巨头公司的影响,我们越来越看重软件的开发,也就是ROS层和嵌入式层的开发。

其实对于制造业产品,工业设计和结构设计非常重要,软件设计再好,结构没设计到位哪怕是一点尺寸的偏差都会导致机器运行不稳定。在ROS中urdf模型文件的定义也跟设计的结构有关(尺寸、位置等)。

另外,结构设计需要考虑是否容易安装、维护、部件的更换、AGV平衡性、精度、美观等等,也不是一件容易的事。

关于开发的调试,ROS上手容易但调试难,一是缺少单步调试,我目前看到的方法是使用GDB调试器,不过感觉还是挺麻烦的,用得人不太多,更多的bug调试还是通过日志查看的。

二由于ROS中设计的各种通信接口,串口调试工具,TCPView,wireshark,CAN analyzer等都是常用的工具。三是window和linux下相互间远程,相互间传文件等,从中可以学到不少东西。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分