来自:http://blog.exbot.net/archives/3055
Top按:用了4个月的时间,朝国兄和小伙伴们终于完成了嵌入式ROS ROM的闭关开发,取得了阶段性成果,为此朝国兄写了一篇记录与大家分享,如有其他无需求,可联系微信号:zhao_chao_guo。
背景
关于ROS,大家对它的吐槽点主要集中在两点:一是多进程/分布式设计带来的性能开销。二是系统冗余,过于庞大。实际上,采用了plugin和nodelet技术实现零拷贝,第一点关于性能的问题已经不是很大的问题了。关于plugin和nodelet技术的应用,move_base框架做了一个很好的样板,它把cost_map,loca_planners和global_planners通过plugin技术集成到一个进程中,即解决了性能问题,又保持了非常强的灵活性和易用性,是一个比较经典的设计案例。
解决了性能问题,ROS脱离“快速原型验证系统”走向产品化平台算走了一小半,为了让ROS产品化更近一步,小伙伴把攻关的目标放在解决第二个痛点上--给ROS瘦身。长期以来ROS支持完整特性的操作系统只有ubuntu和debian,但是这两个桌面系统,动不动十几G的ROM,和自主机器人移动和嵌入式的需求实在不匹配。所以我们定了一个小目标:打造一个基于嵌入式Linux的ROS ROM。估计有人要疑惑:ROS不是一直支持嵌入式平台OpenEmbedded么?甚至在某个版本还支持一个RTOS QNX。嗯,确实是有支持,但是--但是,当你真正想用他们构建一个完整的移动机器人时,你就会发现:他们只是支持了ROS CORE的部分功能,从来没有发布过完整功能的软件栈,可以说除了ubuntu和debian,其它系统的ROS还是开发人员的玩具。如果要用ROS做一个嵌入式移动机器人的ROM,这个ROM最小能有多小呢,我们在尝试。
方案和进展
考虑技术成熟度,我们选择先从最成熟的激光雷达SLAM软件开始移植
主控硬件:allwinner 4核A7平台
操作系统:TinaLinux
激光雷达:neato xv_11
运动控制:arduino
在这样平台上实现支持SLAM功能的移动机器人ROM大小:500M,这个大小仅考虑功能实现,并未做细致瘦身,所以继续优化的潜力还很大。
ROS主要模块:
costmap_2d,local_planner,golbal_planner
map_server
SALM:gmapping
底盘控制:ros_arduino_python
实测这个500M的系统SLAM效果和16G的树莓派3+ubuntu没有区别。
小吐槽
不得不吐槽一下ROS的依赖设计:在动手前我们一直知道ROS激光导航软件依赖PCL库,这是一个庞大的库,它的背后还依赖一堆GUI库,毕竟点云格式只是ROS激光雷达的一种输入格式,对于2D SLAM,我们用LaserScan,应该不需要依赖PCL吧...,但是随着移植进展,当我看到这个代码时,心里挖凉挖凉的:
在导航内核依赖庞大的外部库,典型的反向依赖。就因为PCL是Willow Garage的亲儿子?
小幸运--ROS IDE
嵌入式系统开发人员最怕什么,应该是没有IDE吧,我们也无法想象在嵌入式环境开发ROS如果没有IDE有多悲催。所以在Tina上ROS移植完成后,我们迫不及待要试一下IDE,我们得感谢一下RoboWare(http://roboware.me/#/)开发团队(这是我们国内的开发团队)。目前的RoboWare版本直接用在Tina ROS上还不行,但是还好,我们可以自己做一点简单修改就可以了,看看效果:
期待roboware后续版本能直接支持就更好了:)
展望
优化还在继续,除了激光导航外的更多功能也在继续加入,想象可能一两百M甚至几十M的ROM就能实现机器人自主导航,有点小激动,后续进展我还会及时给大家汇报,我们一起期待。