用apm做无人船项目,前后一共两年,无人船主控的自动巡航精度与船的整体性能基本稳定,IPD小批量(业务量小,小批量足以)。下一代无人船系统框架刚讨论出来,项目成员由于各种原因,散了,还是挺怀念当初一起抬船去河边的时光的…不扯了。。。。。。
目前市面上大多数的无人机公司采用px4或apm来做的。这几年水务场景的应用越来越广泛。总体来说,做无人船的公司不多。本人介绍无人船项目最初是用于测绘市场的,简单来说就是 用无人船代替以前的人工船测量水深,绘制地形图。该无人船还上过两次央视新闻,也算是不辜负这两年的付出,哈哈。 期间,还和某通信公司合作了一个用无人船水质检测的项目。也拓宽了无人船的应用场景。
无人船能找到的知识比较少,涉及到的路径规划,gps+惯导等等,如果从0开始写,工作量将无比巨大。还是用开源的项目来做,进度快一点。尽管如此,还是花了两年才小批。。。。。。
思路:无人船和无人车差不多,将4个轮子换成船用的动力装置。所以借鉴 apmrover代码分支,编译,环境,代码分析,仿真等等
1:代码用git管理的,百度一下,git的简单使用就可以了。想详细了解的,可以看git权威指南这本书。 2:本人是使用ubuntu的,相对而言,在ubuntu下的编译比windows快。u buntu怎么装可以百度,帖子很多。 3.阅读代码本人是用sourceinsight,在ubuntu下,装wine,然后就可以使用 sourceinsight了,也能百度的到。 版本说明:用的是apmrover3.1.2的版本,当时的稳定版。 4.如果你是ubuntu,安装环境apm已经写好了脚本,tools/scrips/install-prereqs-ubuntu.sh,执行这个脚本即可。注意。会报错pip2没有安装,将脚本里的pip2改成pip即可。
无人船的系统分为船体,主控,动力,船整体通信系统,功能传感器,上位机,,遥控器,电池。
船体
船体,国内做船模具的也不少,可以尝试联系搞一个。 主控 刚开始谁也不知道怎么做,只能说摸着石头过河,既然要采用别人的软件, 就不妨用pixhawk来做主控,搭一个无人船的样船。官网能找到硬件的原理图。一开始不建议直接画自己的硬件,前期验证,还是用官方的pixhawk来采坑吧。
动力系统一般分为两种设计: 1.舵机加电机的方式。阅读源码可知,apmrover的控制方式是舵机加电机,舵机和点击的驱动方式是pwm。 2.差速转向。差速转向就省了一个舵机,举个例子,左边转速比右边快,不就右转了吗。但是差速转向受船体结构的影响,太长的船,转向会不灵敏。 3.动力部分代码的分析,以及差速转向的修改思路后续会开一章节。
无人机飞控上一般的通信是通过数传模块,可以理解为主控将数据传给数传模块,数传模块在传给电脑上的上位机(反之一样)完成数据的传输和控制。刚开始无头绪的时候也可以采用数传模块做样船,先完成基本通讯,后续在优化。我们刚开始也是数传模块,但是数传模块的带宽不够,传摄像头的数据会很卡。在样船完成后基本上就可以考虑,通讯系统的优化了。思路可以有很多种。举例系统集成,用串口服务器+网桥(900m或者5G)+交换机的形式组成局域网,完成通讯系统。。。。。面对不同的应用场景,也可以采用4g的通讯方式。
功能传感器根据实际的应用需求添加,最基本的gps+避障模块+摄像头在加上你的应用场景的,比如测绘的,就加上单波束,多波束。水质的就加上你的水质仪。传感器的选型需要花点功夫,,因为作为一个船上的模块,你的避障得装在船头吧,船头离主控的距离可有有个一两米。需要注意。 1.gps的选择看系统对于定位精度的要求而定。精度要求不高的选择ublox模块,几百块钱。精度要求厘米级的就得采用rtk了,国内的rtk华测,中海达,南方,司南,国外的就是天宝。 2.避障模块:可以采用的是超声波maxson啊,美国进口的,晶度和稳定的还可以。就是距离受限制,10米。你也可以选择距离远一点的激光雷达。就是好一点的雷达价格比较贵,国内口碑比较好的禾赛和速腾 。(团队散了后,本人还去禾赛面试,可惜太菜了,没通过。) 3.摄像头:摄像头还是推荐使用海康威视的。 4.如果做水质检测的,水质仪推荐使用哈希的。
上位机采用missionplannner。apm官方的开源的上位机软件,主要是和无人船的主控建立通信,可以加载地图,不知无人船的航线,控制无人船的执行自动巡航模式,等等。负责和无人船的交互。
加遥控器可以大大的增加用户体验,一开始玩船,玩飞机,不要太开心。 遥控器分为日本手,和美国手,遥控器的牌子一般两种,国内的推荐frsky ,还有一个futuba的。
pixhawk有2个imu,九轴的mpu9250,还有l3gd20 ,lsm303d +uboxl里的磁力计一般是hmmc5883,新版的ublox磁力计是icm20948.组成2个imu。 pixhawk上还有sd卡用来存日志,蜂鸣器,串口,iic,can等接口。方便你接各种传感器二次开发。 新出的pixkawk2将imu,fmu和电源底板分离,imu做了减震处理。 对于pixhawk不多做介绍了,用原版的硬件只是用来验证,做产品,接口的扩展性等等不是很合适,肯定是要自己做硬件的。
电池一定要找好一点的电池厂商,质量太差,会爆炸。一点要注意。
准备好上文的系统组成还还有一些配件后,就可以着手搭建自己的样船了 ,搭建自己的样船,前期只能自己飞线。思路就是围绕着pixhawk,将他的一些接口飞出来,需要加长的加长,需要转换的转换,固定的固定。代码的烧录看了官方的文档就知道了,可以用usb烧录,我们选择的pixhawk对应的是 make px4-v2-upload 烧完代码上电如果蜂鸣器有清脆的一段音乐,就说明程序跑起来了。要做好遥控器的匹配工作。遥控器将pwm传给主控,主控在输出给电调和舵机。注意正反转的设置。 配置好之后,现在室内试一下,遥控器等等。然后再外出下水测试。 下水之前要注意个传感器的状态,准确的说看ekf滤波器的状态是不是可用。初次的使用,还是下水先试一下,手动模式,测一下,船的动力系统和遥控器的性能。然后在开始早missionpalnner上调试参数。在前期样船准备的时候你的外界传感器要工作,就需要设置一下波特率,用法等等。ekf的一些参数也需要微调。系统才能起来。传下水之后,ekf如果没问题。就可以自动任务了。自动巡航的轨迹,就需要控制调试了。可喜的是,apm将pid等控制参数,做成可调的形式,供用户调试。初期的项目还是用apm自己的pid,可调的控制参数,推广性不是很好,后期最好加入自适应的调参。 在样船的基础上开发调试基本的避障,数据处理等等产品功能,前期的耗时 可能比较艰苦。一方面既需要开发功能,一方面前期的样船稳定性不好,各种东西易损,还得在河边调试。。。。。。。
样船功能差不夺得时候,就是做自己硬件的时候,先找到官方的开源原理图。根据自己的需求增加。各个公司规范不一样,pixhawk上的传感器,大部分比较旧了,不是新料,会停产的,基本会跟换掉,当时的mpu6000,换mpu9250,l3gd20换成l3g20h等等。 硬件回来基本上都会遇到一系列的问题,慢慢解决即可。
这时候功能基本上就差不多完善了。接下来就是一些系统上的性能优化。 中途舵机的料停产,更换舵机,电流翻了一倍,板子重新改版,新增了spi转串口的芯片等等。
软件上做的事情也基本上回顾一下吧。 1.mpu9250,l3gd20h的更换调试。 2.避障停止时间与响应的优化。 3.ublox的icm20948调试加入 4.iic电池的电量检测。跳动处理,与低电量返航发,报警的处理。 5.ublox,rtk双gps的冗余设计。以及rtk从固定跳浮动的处理等等。 6.桥洞不收星ekf的优化。 7.自动巡航,入线的优化。 8.自定模式的遥控器映射。 9.水质仪的数据采集处理及mavlink消息传输 10.测深仪的数据接入主控处理,dep文件格式的采集处理。 11.数据的下载处理。 12.gps位置与测深数据的不匹配的后处理(插值算法) 13.adi惯导模块的接入与数据融合。 14.ekf磁力计数据的去除(产品量产时,罗盘数据的易干扰性暴露出来,为此采用单天线的gps的航向数据融合,本来准备在下一代采用rtk双天线的方案,但是项目进度要求,只能先用单天线,先满足市场需求) 15.系统数据的延时处理。 16主控板接口的自动化测试脚本。 等等其他。
stf4系列做的主控平台,水质的应用场景一展开,串口就全用完了。打出来的固件也越来越大。后续的业务功能开发扩展已经不合适。为此有两种思路。 1.将apm一直到linux平台上,一开始考虑的imx6上,后来无意中逛帖子发现阿木实验室已经将飞控移植到imx6上了,不知道性能如何。 2.单片机加imx6的方式。考虑到主控的实时性要求。还是不移植到imx6上了。采用f4加imx6的方式,主控控制部分的还放在f4上,业务处理扩展的部分放在imx6上。 3.之前的罗盘处理部分,一开始定的方案是双天向的定向方案,由于已到小批量阶段,暂时采用单天线的gps航向融合。此方法的弊端就是下水后需要手动跑一条直线,获取航向,让ekf工作,影响用户体验。双天线的话,开机就有方向输出。之呢个作为下一代的改进了,百度apollo3.5发布的时候有一个亮点突出,就是双天线的航向获取。当时还高兴了一下,英雄所见略同。如今在逛一下a’pollo,发现已经5.0了,而且限定区域量产,不得不佩服。 4.gps位置和水深位置同步的问题。暂时的解决办法是插值处理。本质上是主控和采集的水深一起时间不同步的问题。平台迭代是需要加入数据的时间戳处理。
ardupilot的代码还是非常好的。ekf,ahrs,等等,每一个模块,都是一个工程师的工作。虽然笔者都涉及了,但是都不精。 写此系列的博客,仅代表个人理解和分享总结,有不足之处,希望您提出来。帮助我成长。更重要的一个原因是开始做Linux驱动了,再不写下来记录一下,就忘光了。加油!!!!!!