查看: 807|回复: 8

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot

[复制链接]

44

主题

787

帖子

1564

积分

金牌飞友

Rank: 6Rank: 6

积分
1564
飞币
775
注册时间
2017-8-23
发表于 2022-10-24 20:30:31 | 显示全部楼层 |阅读模式
过去笔者写了几篇关于无人船偏理论的文章,但不少志同道合的友人在实际搭建无人船的时候遇到了一些小问题。这里我把纯动手的部分集中写在这里,让搭建无人船的过程像Arduino一样集成化、便捷。
首先是理论篇的姊妹文章,想要深层次了解无人船的工作原理,还请参考以下:
電波少年:从零开始的无人船制作-系统整体框架指南
電波少年:从零开始的无人船制作-姿态解算算法的选择
電波少年:从零开始的无人船制作-无人船的避障
此外,如果你只是需要一个无人船平台,也可以不去看上面的文章哦
下面就来一起搭建无人船吧!
<hr/>一:材料准备


  • STM32F103ZET6:下位机,控制船体运动
  • 树莓派,型号任意:上位机,负责高级算法实现
  • MPU6050:惯性测量模块
  • GPS,型号M8N(带磁罗盘的一款)
  • 飞控的遥控器,型号任意,最好是有7-8个通道的;要带接收机(例如:天地飞)
  • 纳雷SP70C毫米波雷达:避障用,待后续拓展。
二:各模块连线

图中的“IMU模块”、“无线串口”都不建议使用。直接忽视即可。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-1.jpg

第一个要注意的点
由于有的船使用的是普通电机,有的船使用的是电调+无刷电机,因此关于电机我们有两种连线方案,代码也相应的有两种,请按照你的实际需要选择:

  • 有刷电机

    • 如果你使用的是普通电机,那么请注意,由于要防止两电机转速不同导致的船无法走直线的情况发生,一定要连接电机编码器,因为代码里面使用了编码器对电机进行PID控制;此外,如果你使用的是普通电机,那么是需要连接电机驱动板的。
    • 此外目前有刷电机版本的代码里普通电机的转向方式是舵机转向,也就是说船的尾部或头部是有一个方向舵去控制方向的,而不是靠两个浆差速去转向。

  • 无刷电机

    • 如果你使用的是无刷电机,那就好办了;直接按照上图的蓝色部分连线即可,不需电机驱动板、编码器、舵机等。转向的实现方式是差速。
    • 无刷电机的电调通常启动的时候需要设定油门行程,需要你把遥控器遥感推到最大处,等待电调哔哔响之后才能使用。否则无论你怎么操作,电机都是不会转的哟。


第二个要注意的点:
应注意到我在图中的IIC部分写道“Compass与MPU6050共用总线”,原因是磁力计(Compass)与IMU6050我们采用的是IIC通信协议,为了减少STM32GPIO口的占用,我们将这两个模块连接到相同的GPIO上。
请注意,我们使用的磁力计是内置在GPS模块中的那一个,当然你也可以购买一个同款磁力计连接上去。GPS的磁力计端口见下图的SCL、SDA。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-2.jpg
简而言之,把GPS模块的SCL、SDA分别与MPU6050的SCL、SDA,以及STM32相应的GPIO口连接到一起就可以了。所以这里你或许会需要一个面包板。

第三个要注意的点:
遥控器的型号你可以随便选,通道你也可以随便选择;但是一般习惯上我们喜欢两根摇杆分别控制两个电机,或者一根摇杆控制动力、一根摇杆控制方向。这些都可以在遥控器里设置。
下面我以WFT07、WFR07举例。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-3.jpg

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-4.jpg
注意到我们使用了四个通道,也就是对应的遥控器的四个旋钮/摇杆。这是为什么呢?
这是因为我们要搭建的是智能船,是需要都多个模式选择的。

  • 两个通道,分别控制船的方向、动力。这里我们都很清楚,在此就不再叙述了
  • 另外还多用的其中一个通道是进行模式选择的。注意我们的无人船拥有三种模式:手动操作模式、自主巡航模式、采点模式。因此需要有一个通道进行模式选择。
  • 第四个通道是进行电机锁定的。你不希望有熊孩子乱动一气你的遥控器,导致船翻或者自己走丢吧0v0 因此当此按钮在拧到最左边的时候,无论你用遥控器对船做什么事,它都不会启动电机;只有当这个按钮被拧到最右边的时候,船的电机才会启动,从而听从你的控制。
第四:其他细节

  • 上面的连线表里面提到的上位机在这里我默认的是树莓派,但其实任何能跑python脚本的嵌入式linux板都可以。只不过环境配置的难度不一样。树莓派的IO口里面有两个分别是uart的TX、RX,这里需要根据你购买的树莓派型号去查看手册或者说明书。
  • 32和树莓派最好用一个双USB口的大功率充电宝供电。。当然了,32也可以用电池直接降压来供电。主要问题是,树莓派对电源要求比较高,一般的降压模块可能无法满足,从而导致不可预测的风险。由于STM32上面接了很多传感器,因此不要用小功率降压模块/充电宝。
  • 32和树莓派的地线GND要连在一起,这里就是稍加提醒。。别忘了;数字地与模拟地要分离。
  • 由于磁力计和陀螺仪都是有方向的(x,y轴等),因此安装传感器时请务必把方向对应好!具体方向参考下图

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-5.jpg

传感器方向对应图

<hr/>三:程序烧录与调试

树莓派(上位机)端

树莓派端,请直接将此工程下载到一个你熟悉的目录下,在调试时可以输入下面语句来运行:
sudo python3 Main_Sequence.py在调试完毕后,请注意要把Main_Sequence.py文件设置为开机自启哦!!
应注意的地方:

  • 应该把树莓派设置为每次开机自动连接到你的一个WIFI Hotspot上,同时开启树莓派的ssh或vnc,便于远程无线调试。总不想船上面还要插一个显示器吧?
  • 你可以直接使用树莓派的mini Uart(在树莓派的GPIO口上直接引出的),但是别忘了修改代码里的串口端口(默认是AMA0)。如果要用mini uart,按照这篇文章的修改一下树莓派:【树莓派4B学习】十四、树莓派4B串口通信_悟已往之不谏 知来者之可追-CSDN博客

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-6.jpg

mini Uart端口

STM32端

对于STM32,在调试时可以先烧录进此工程文件测试。但请注意这个程序是有刷电机版哦!
有刷电机版本程序仅在新开发版中有,获取地址:无人船爱发电项目地址
1  关于电机的选择
早期是有船使用有刷电机的。大家小时候玩的四驱车就是有刷电机0v0,一般也配有电机驱动板来驱动电机。有刷电机一般用于智能小车等产品上。但是有刷电机有几个问题:一是有刷电机怕水,进水可能导致故障;二是有刷电机需要使用PID调速来保持速度的准确性。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-7.jpg

有刷电机

而无刷电机一般来说是不怕水的,甚至你可以给它加水冷。此外,无刷电机不需要驱动板,通常是一个电调驱动一个无刷电机。因此,无刷电机经常用在无人船上。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-8.jpg

无刷电机

2 关于GPS
本项目工程使用的GPS模块为M8N,但是在后续的测试中发现:M8N分为国产与进口两种;国产的精度略差与进口版本,但至少代码通用;然而,问题就出在GPS模块上带的磁力计模块上!通常M8N模块上会写有with compass的字样,这个compass就是磁力计,也就是无人船用来判定船头方位的模块。进口的M8N中自带的磁力计模块为HMC5883L,即霍尼韦尔公司的磁力计,应用十分广泛。然而国产的M8N有的自带的磁力计模块QMC5883,也是国产的磁力计模块!虽然名字相同,但是QMC5883的寄存器等参数均与HMC5883L不同!所以是不能套用的!
另外,磁力计在使用前一定要进行校准,否则数值十分不准确!校准方法:磁力计的校准
注:如果您在使用我的有刷电机版Github项目,则请注意其中使用的磁力计为HMC5883版本;无刷电机版本项目中有HMC5883也有QMC5883的兼容。

搭建自主巡航无人船硬核干货教程:自主开发,脱离Ardupilot-9.jpg
此外,在首次使用M8N模块的时候,有一些操作需要您做。由于这不是制作无人船的主要流程,所以这里我仅用语言描述一下您需要做的事:
首先您需要下载Ublox官方的上位机软件:U-center,需要做的是把默认波特率9600更改为115200,然后保存在GPS模块的FLASH内部。具体流程如下:
连接M8N,打开u-center选择9600波特率连接,然后打开View选项卡的Message View,下拉看到UBX一栏,如果是灰色并且前面没有一个加号的话,则等待5~10分钟,之后会出现一个加号。 点击加号选择PRT一栏,将波特率从9600更改为115200,点击左下角的SEND,之后点击右上角的叉号,此时系统询问你是否需要保存配置,选择【保存】,尤其要选择FLASH一项,然后点击SEND,此时GPS便配置完毕了。
3 关于电机
若您使用的是有刷电机,那么可能问题不大;
但若您使用的是无刷电机,在测试无人船的自主航行功能时,请务必首先将接收机直接接在电调上直接测试,来观察电机是否过猛/动力不足。如果电机动力过猛,那么这个比较好办:在遥控器上调整油门曲线,将最大油门限制为一个合适的值即可;然而如果您的电机动力不足,那么没有办法,只能更换电机。

由于STM32直接控制电机等底层设备,因此需要好好调参。大体上需要调整测试的有:船行驶时的最大速度、加速度最大值、转向灵敏度等。
注意由于船的动力学模型与无人车差别很大,有时候无人船做不到转向灵活,因此转向灵敏度要好好调整。

<hr/>如果您使用的是我的无人船项目工程,那么到了这一步,您的无人船基本已经可以工作了。
接下来,请前往无人船的使用说明手册进行进一步的参数微调以及Debug。
<hr/>
【注:
GitHub端上传的项目为2019年本项目的早期版本,可能有潜在的若干问题存在
为了更好的开发此项目,现已在爱发电平台上线
项目的最新稳定版本以及手册等其他信息可在爱发电平台查看
十分感谢您的支持
无人船爱发电项目地址
早期项目已上传至Github,可能存在问题,且项目已不在Github平台更新,因此以供参考
无人船毫米波雷达避障模块
树莓派端项目地址
STM32F103端项目地址
注:

  • 下位机是STM32F1;上位机只要能运行Python脚本就可以,所以树莓派、英伟达Jetson Nano还是其他的都可以,没有什么特殊要求。
  • 功能:

    • 通过遥控器即时遥控载具;
    • 通过Google Earth取点,发送给上位机,自动巡航;
    • 计点模式:使用遥控器遥控载具的同时,上位机会在后台记录下航线坐标点;开启巡航模式,则载具会自动重复之前的路线。

  • 这套程序无人船、无人车通用。

46

主题

844

帖子

1673

积分

金牌飞友

Rank: 6Rank: 6

积分
1673
飞币
827
注册时间
2017-9-23
发表于 2022-10-24 20:36:06 | 显示全部楼层
催更催更,迫不及待看下一篇[微笑]

36

主题

812

帖子

1599

积分

金牌飞友

Rank: 6Rank: 6

积分
1599
飞币
785
注册时间
2017-8-13
发表于 2022-10-24 20:47:43 | 显示全部楼层
Stm32的无刷电机版有吗

37

主题

849

帖子

1689

积分

金牌飞友

Rank: 6Rank: 6

积分
1689
飞币
836
注册时间
2017-8-9
发表于 2022-10-24 21:02:25 | 显示全部楼层
有的,今天上传

46

主题

844

帖子

1673

积分

金牌飞友

Rank: 6Rank: 6

积分
1673
飞币
827
注册时间
2017-9-23
发表于 2022-10-24 21:16:44 | 显示全部楼层
请问上位机树莓派用的是ubuntu系统还是树莓派的官方os系统?

35

主题

804

帖子

1614

积分

金牌飞友

Rank: 6Rank: 6

积分
1614
飞币
781
注册时间
2017-8-7
发表于 2022-10-24 21:29:57 | 显示全部楼层
大佬,你做控制时使用了船舶动力学模型没有,还是直接用的PID。有什么较好的参考模型不

29

主题

783

帖子

1556

积分

金牌飞友

Rank: 6Rank: 6

积分
1556
飞币
763
注册时间
2017-8-19
发表于 2022-10-24 21:42:11 | 显示全部楼层
Stm32的无刷电机版有吗

41

主题

772

帖子

1530

积分

金牌飞友

Rank: 6Rank: 6

积分
1530
飞币
756
注册时间
2017-9-27
发表于 2022-10-24 21:56:18 | 显示全部楼层
麻烦看下爱发电留言

46

主题

844

帖子

1673

积分

金牌飞友

Rank: 6Rank: 6

积分
1673
飞币
827
注册时间
2017-9-23
发表于 2022-10-24 22:04:12 | 显示全部楼层
大佬,无人船可以代做吗
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表