拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

低成本ArduPilot无人车:APM飞控+有刷电调航点导航实战

低成本ArduPilot无人车:APM飞控+有刷电调航点导航实战

折腾了个把月的ArduPilot无人车,终于能在楼下按航点自己跑一圈了。整个过程花得不多——一块一百多块的APM飞控、两个几十块的双向有刷电调、一辆二手玩具车底盘改出来的架子,加起来比一套Pixhawk加无刷动力便宜一大截。如果你也是学生党、创客,或者只是想拿一套靠谱的底盘做导航算法试验,这条方案值得直接抄作业。

这篇记录我把整条路线都拆开讲:为什么选ArduPilot加APM飞控、有刷电调怎么搭配、硬件清单怎么列、线和电怎么接、Mission Planner里怎么调参、怎么用MAVLink发送航点给飞控、以及我踩过的坑。ArduPilot这个系统看起来很硬核,但把底层逻辑理清楚后,你会发现它其实没那么神秘,就是把一堆传感器和电调“喂”给一套成熟的开源导航算法,剩下的就是拧螺丝、接插头、点鼠标。

1. 低成本无人车方案选型:为什么是ArduPilot加APM飞控

1.1 三条自制无人车路线的对比

很多朋友上来就问:我用树莓派加电机驱动板行不行?行,但不建议第一条路就走全自研。树莓派加驱动板意味着姿态解算、GPS融合、PID控制、任务调度、断线续跑全都要自己写,光是一个可靠的差速转向闭环就能让你调两个星期。第二种路线是用Arduino或者STM32自己造一个小飞控,适合想搞明白原理的同学,但开发周期长,安全性也需要自己负责。第三条路线就是我这次用的ArduPilot飞控方案,相当于直接把一套完整的开源自动驾驶堆栈拿过来用:卡尔曼滤波、GPS融合、PID控制器、遥控器模式切换、航点任务队列全是现成的。

ArduPilot对应的地面车固件叫ArduRover,它把你不关心但避不开的这些脏活累活全封装好了。你要做的只是把转向通道、油门通道、左右电机通道在参数里定义清楚,然后交给它去算。这也是我反复跟身边人推荐ArduPilot的原因:它适合做“载体”,你不需要先成为控制理论专家,就能先拥有一台能跑的无人车底盘,再去验证上层算法。

1.2 有刷电调和无刷电调怎么选

标题里我特意写了“有刷电调”,因为这个选择很容易被忽略。无人车常用的电机分两种:有刷直流电机和无刷电机。有刷电机便宜、扭矩大、低速性能好,驱动电路简单,给多少PWM占空比就转多少,堵转也不容易立刻烧掉,特别适合重底盘、爬坡和入门测试。无刷电机虽然效率高、声音小,但需要额外配无刷电调,无刷电调本身贵,而且油门响应、换相逻辑对初学者不友好,你还得学一遍“无刷电调行程校准”,很多新手就卡在这一步。

有刷电调的另一个好处是结构简单可靠。它本质上就是个大功率MOS管开关,接收飞控发来的标准PWM信号,占空比越大电机转速越高。双向有刷电调还支持反接换向,倒车不用加继电器或者H桥。对于一款低速无人车来说,有刷电调完全是够用的,而且把整体成本压到很低的水平。有人担心有刷电机有磨损,但轮式小车不是大负载长期连续运行,电刷寿命其实挺长,换一对碳刷也只要几块钱。

1.3 APM飞控过时了吗

APM飞控指的是ArduPilot Mega系列及其各种兼容板,核心就是一块Arduino Mega 2560加传感器组合。很多人觉得它老,实际上在ArduPilot生态里它依然占有一席之地:便宜、资料多、io简单清晰。我手上这块APM 2.8兼容板一百多块就能买到,航空插版本更耐用。板载MPU6000陀螺仪加速度计、MS5611气压计和HMC5883L罗盘核心,虽然性能比Pixhawk弱,但对地面车这种低速载体完全足够。

需要注意APM 2.8的内存限制。它跑不了ArduRover 4.0以上的新版本,最高可以刷ArduRover 3.5.x系列,但该有的功能一个不落:遥控校准、差速转向、电机测距、GPS航点、简单避障、失控保护都有。如果以后想上更多传感器、跑复杂算法,再升级Pixhawk也不亏,逻辑是通用的。这个选择的核心逻辑就是:先低成本跑通,再考虑升级。

2. 硬件配置清单与选型要点

2.1 完整低成本清单

下面这份清单是我实际在用的,总成本大约四五百元(不含遥控器和电池,但如果手头有旧玩具车底盘,能省更多)。参考价格按市场常见价写了大概区间,不同渠道会有浮动。

项目型号/规格建议参考价格作用与备注
车架双电机差速履带底盘或四轮玩具车底盘50-150元优先选金属/强度高、有减速箱安装位的底盘
左右驱动电机12V有刷减速电机(如RS380/540级,带减速箱)30-60元/个有减速箱扭矩大,爬坡更容易
双向有刷电调20A/30A两路独立有刷电调20-40元/个必须选带BEC或不带BEC,但需配合UBEC供电
APM飞控APM 2.8兼容版100-150元核心控制板,集成IMU、气压计和罗盘
GPS模块M8N带罗盘版本40-80元室外定位和航向,内置罗盘可做外置罗盘用
数传模块3DR 433MHz 100mW30-50元一对无线连电脑更新任务用,也可用蓝牙模块替代
遥控接收机天地飞/富斯等PWM输出接收机50-120元手动安全控制,至少4通道
电源模块APM电流电压计15-30元给飞控提供供电和电池电压监测
UBEC5V/3A降压模块10-20元给飞控和接收机稳定供电
动力电池3S 2200mAh 30C锂电60-90元11.1V,兼顾重量和续航
辅料杜邦线、扎带、魔术贴、热熔胶20元以内固定和走线必备

这个清单不是死规矩,核心原则是“电机和电调功率匹配、飞控供电干净”。如果预算紧张,GPS可以先不买,遥控模式也能玩,但航点任务就需要GPS,建议还是加上。

2.2 选型时的几个关键参数和避坑

第一,电机电压要和电池匹配。我建议用3S锂电配12V有刷减速电机,不要直接用2S带12V电机,电压不够扭矩上不去;也不要轻易上4S,APM电源模块测量电压不要超过18V,否则板载电压传感器容易烧。第二,有刷电调的持续电流最好大于电机最大工作电流一倍以上,我用的30A电调配12V减速电机,跑起来电调只是微温,心里踏实。第三,优先选双向有刷电调,单向电调想倒车只能改变电机正负极,无法通过飞控直接倒车,对差速转向根本不可用。

选电调时还要留意它有没有带BEC。带BEC的电调会输出5V或6V给接收机供电,方便,但两个电调BEC同时给飞控供电容易抢电压。如果两个电调都带BEC,我的做法是只接一个电调的BEC火线,另一个电调的BEC火线挑出来不接,这样避免两路电源倒灌。如果两个电调都不带BEC,那就老老实实外接一个5V/3A的UBEC,给飞控和接收机单独供电。这个细节能让飞控稳定很多。

3. 硬件组装与接线实操

3.1 车架和动力系统安装要点

车架我建议优先选双电机差速结构,也就是两个电机分别驱动左右两侧轮子或履带,靠左右转速差实现转向。四轮底盘也可以,但最好把转向做成“前轮转向舵机+后轮驱动”的结构,那样更接近真车;如果四轮全都用差速,电子差速的逻辑在APM上也能配,但电机多了电流翻倍,电池和电调压力大,新手不建议一上来就搞四驱。

电机安装时要注意减速箱输出轴的朝向和底盘左右对称,否则会跑偏。我用的底盘原来是玩具车,拆掉原来的电子驱动板,把两个有刷减速电机固定在左右驱动轮轴上,电机线往中间走,用扎带固定好。装好后空转测试,确认两个电机转速一致,转向时左右都能自由转动。轮子部分如果可以,最好给驱动轮加一点胎纹,增加抓地力,GPS航点测试时不容易打滑。

动力电池放在底盘重心偏中后的位置,但不要太靠后,否则上坡容易翘头。用魔术贴固定电池,不要把电池放在飞控正上方,电机磁场和电池的摇晃都会干扰飞控传感器。我的顺序是:底盘最下层是电池,中间层是电调和配电,最上层是飞控和GPS,飞控离电机电调至少10厘米以上。

3.2 APM飞控与电调的接线图逻辑

很多人一看到APM板子上的那么多排针就发怵,其实无人车需要接的接口就几组。飞控板侧面有“RC IN”接口和“OUT”接口。RC IN接遥控接收机,OUT接口接电调和舵机。先看RC IN:接收机和遥控器对拼后,把CH1通道连接到APM的输入口,默认CH1是转向、CH2是油门,具体通道可以在Mission Planner里面映射。再看OUT接口:左侧电调信号线接OUT1,右侧电调信号线接OUT3或其他可用输出,然后在参数里告诉ArduPilot这两个通道分别代表左右电机。APM的OUT接口输出的是PWM信号,电平5V,普通有刷电调直接接就可以。

供电回路是很多新手的盲区。正确思路是:电池正负极通过分电极给两个有刷电调的电源输入;电调信号线插到飞控OUT口,但信号插头上的红线(BEC输出)要不要插,取决于你是否用UBEC。推荐最稳的组合方式:两个双向有刷电调都不带BEC,另用UBEC从电池取电,输出5V接到飞控和接收机。如果电调带BEC,那就只保留其中一个电调的BEC红线接到飞控,另一个挑出来包好。

电源模块的接法也简单:动力电池经过APM电流计再接到电调分电极,电流计另一边的线接到飞控的PM接口,这样Mission Planner可以实时看到电压和电流。GPS接在GPS接口上,注意接口定义不能被杜邦线插错,一般板子上都标了。数传模块接数传口(Telem)或串口,默认波特率57600。

3.3 装车时的供电顺序和固定技巧

接完线不要急着上电。我的习惯是先用万用表测一遍:电池输出端有没有短路,电调输入电压是不是正常,UBEC输出电压是不是5V,APM供电引脚有没有电压。确认无误后再插USB连Mission Planner调试。调参过程中,动力电机最好先别接轮子,或者干脆把车身架空,防止飞控校准阶段电机突然转动打手。

固定插头是一件容易被忽略但很重要的事。APM用的杜邦线经过长期震动容易松脱,尤其是跑土路的时候,GPS线一松整个导航就废了。我用热熔胶把关键插头根部封住,包括GPS插头、数传插头、PM插头、电调信号线插头。注意不要用热熔胶堵住USB口和功能按键。另外飞控板底部的泡沫胶或减震硅胶不要撕掉,APM内部有IMU,减震能过滤车架震动,数据会干净很多。

4. 固件刷写与Mission Planner调参全流程

4.1 安装驱动并刷写ArduRover固件

第一步先把APM用USB线连接到电脑,正确安装驱动。APM 2.8兼容版使用FTDI或者CH340串口芯片,Windows上装好驱动后设备管理器里会出现一个COM口,记下端口号。接着安装Mission Planner,目前ArduPilot官方推荐的地面站就是它。打开Mission Planner,右上角选择正确的COM口和波特率(一般115200),点Connect就能连上飞控。如果连不上,多半是驱动没装好或端口被占用,换条数据线再试,数据线必须支持数据传输,不是那种只能充电的线。

连接成功后刷固件。在Mission Planner的“初始设置”页面选择“安装固件”,程序会列出各机型固件,我们这里选ArduRover。注意APM 2.8只能刷3.5.x版本,不要强行选择4.0以上的稳定版,否则会提示固件太大。刷写过程中绝对不能断电,等进度条走完并自动重启后,固件就烧好了。刷完建议断USB再重新连接,让飞控重新枚举串口。

4.2 遥控器校准、电调校准和传感器校准

ArduPilot第一次开机有固定仪式:必须完成加速度计校准、遥控校准、罗盘校准,否则飞控会拒绝解锁或报错。遥控校准比较简单,接收机对好码后,在Mission Planner里进“遥控器校准”,按界面提示拨动摇杆到最大最小各个位置,点保存。校准完还可以看通道实时数值,从这个页面也能确认CH1是转向、CH3是油门,如果通道和默认不一致,在参数里做成反向或改通道映射。

电调校准要特别小心,废话不多说,按这个流程来:先把车身架空,拔掉电机传动轴或者拆除轮子,然后打开遥控器,油门通道推到最大,接上电池上电,等待APM进入电调校准模式。在Mission Planner里点“电调校准”,软件会往OUT接口发出高、中、低三个PWM信号,有刷电调在此期间会自动记录最大和最小油门位置。整个过程几秒钟就完成。看到电调发出短促提示音后,拉到低油门,断电,再正常上电,电调就记住了油门行程。双向电调如果方向不对,在Mission Planner里反转对应通道输出即可。

传感器校准建议按照加速度计、罗盘、水平面的顺序一次做完。加速度计校准就是让车分别头朝上、头朝下、左侧、右侧、尾部、平放六个方向,每个方向等飞控采集数据后换方向。罗盘校准更讲究:如果是外置GPS带罗盘,GPS天线要固定在高处,远离电调和电机,然后点开始校准,让车沿着空间三个轴分别旋转360度,也就是绕X轴转几圈、绕Y轴转几圈、绕Z轴转几圈。这个步骤做不好,后面导航方向就会漂。

4.3 差速转向与电机通道配置

校准完成后,还需要在参数里告诉飞控这辆车用什么转向方式。对双电机底盘,把转向方式配成差速转向(差速转向,也叫滑移转向)。在Mission Planner的“完整参数树”中找到与舵机输出功能相关的参数(不同版本名称略有差异,一般出现在SERVO_OUTPUT或RCn_FUNCTION附近),将左右两个输出通道分别映射为左电机和右电机,另一个输出通道作为油门。配置完后,解锁飞控,轻推油门,两个电机应该同向转动;左右摇杆时,两侧电机转速出现差值,实现原地转向。

方向盘模式的逻辑和差速不一样。差速转向里“转向通道”不直接输出到转向舵机,而是作为左右轮的差速量,ArduPilot会把转向量叠加到左右电机的油门指令上。判断配置成没成,最简单的方法是:把车架起来,解锁后拉一点油门,让轮子缓慢转动;然后掰转向杆,如果发现左轮转速明显变化,而另一边转速反向变化,说明差速计算已生效。如果只有一个轮子转,检查另一个通道的SERVO_FUNCTION设置以及电调是否分配到了有效PWM信号。

4.4 驶向航点模式前的必要参数

再往外跑之前,把失控保护和舵机中立点检查一下。失控保护在“初始设置”里设置,通常把遥控器失控保护设为油门低于一定值后飞控进入RTL或者保持模式。无人车上我更推荐设成“降到最大油门”,这样一旦失控信号丢失,飞控会刹停而不是乱跑。另一个重要参数是差速转向的中立点,如果车总往一个方向偏,要么做遥控微调,要么在参数里给转向通道设置微调值。

还有一项容易被忽略的,就是飞控的前进方向。如果GPS天线的箭头朝向和车头不一致,导航会变得“神经质”:车以为自己朝东,实际朝北,航点任务一出小区就迷路。在Mission Planner的姿态界面可以看到飞控实时航向,和手机指南针对一下,差多少就调整GPS天线的安装方向。我习惯把GPS天线固定到车头方向,省事。校准完有条件的话,在室外开阔地解锁,确认罗盘方向角度正确、GPS显示星数达到10颗以上,再开始跑航点。

5. 航点任务配置与MAVLink二次开发

5.1 用Mission Planner规划第一条航点路线

航点任务的本质就是给飞控一串经纬度和高度(地面车高度可忽略),然后让它按顺序走完。在Mission Planner里连上飞控和数传模块,切到“飞行计划”页面,地图上右键添加航点,可以添加“WP”(航点)、“RTL”(返航点)等指令。点“写航点”按钮后,航点列表会通过数传或者USB写入飞控存储区,之后把遥控器模式拨到“AUTO”(在RC调参页面设置好模式开关对应的通道值),车就会沿着GPS航点走。

我个人测试时常犯的错是没把第一个航点设成“起飞点(HOME)”或者把RTL设在起点,结果车跑完任务后不知该去哪。随后我把任务列表设计成:第一个点设为HOME,然后依次是目标点,最后强制加一个“设置模式为RTL”的指令,这样车到终点后会乖乖回起点。写任务前建议先用手动模式把路线走一遍,确认路面没有沟坎和障碍物,再切自动测试。

5.2 用Dart通过MAVLink发送航点给ArduPilot

Mission Planner适合人工点鼠标,但如果你想做自动化,比如让后端程序动态下发路径,就需要通过MAVLink和飞控对话。MAVLink是ArduPilot和地面站之间传输数据的一种二进制消息协议,航点消息通常包括MISSION_COUNT、MISSION_ITEM、MISSION_ACK这几类。用Dart也能做,关键在于找到合适的MAVLink解析库,现在社区里有针对Dart的MAVLink库(例如基于mavlink的封装库,还有些人用FFI调用C库),通信链路可以是UDP、TCP或串口。

用Dart发送航点给ArduPilot的整体思路是:建立连接后先发HEARTBEAT等待飞控握手,然后发送MISSION_CLEAR_ALL清空旧任务,再根据航点数量发送MISSION_COUNT,紧接着循环发送MISSION_ITEM(每个航点一条消息,包含经纬度、高度、序号和指令类型),最后等待飞控回MISSION_ACK确认。下面是简化逻辑示意代码,强调短程通信,不是完整可跑程序,但能看清流程:

// 连接飞控后,把航点列表交给飞控 Future<void> uploadMission(List<MavWaypoint> waypoints) async { // 清空旧任务 await sendMessage(commandLong.cmdClearMission()); // 告诉飞控有N个航点 await sendMessage(missionCount(count: waypoints.length)); for (var i = 0; i < waypoints.length; i++) { final wp = waypoints[i]; await sendMessage(MissionItem( seq: i, frame: 3, // MAV_FRAME_GLOBAL_RELATIVE_ALT current: i == 0 ? 1 : 0, command: 16, // MAV_CMD_NAV_WAYPOINT param1: 0, param2: 0, param3: 0, param4: 0, x: wp.lat, y: wp.lng, z: 0, // 地面车高度填0 )); await delay(20); // 给飞控处理时间 } // 请求飞控确认任务接收情况 final ack = await readMissionAck(); if (ack != MavMissionAck.ok) { throw Exception('航点上传失败'); } }

这段代码的意图是让读者理解消息交互顺序,具体库的类名和API需要看你选择的Dart包。只要逻辑顺序不乱,航点数量别和实际发送数不一致,飞控基本都会正常接收。用这种方式,你可以写一个Web界面或者后端服务,把多个任务点一次性下发到车端。

5.3 ArduPilot常用的管理工具盘点

除了Mission Planner,ArduPilot的管理工具链其实很丰富,选哪个取决于你的开发方式。纯命令行调试可以用MAVProxy,它是一个轻量级的MAVLink命令行工具,能实时查看参数、发送指令、记录日志。机器人在野外调试时,我常拿手机通过USB转OTG连MAVProxy,比带笔记本轻便。跨平台图形地面站还有QGroundControl,它对HUD和航点显示做得很现代,适合macOS/Linux用户。

脚本化调度推荐用Python配合pymavlink或者DroneKit,可以批量设置参数、规划任务,适合做测试框架。Dart这边适合用MAVLink协议包配合你自己的业务服务,比如我后面会把这套无人车接入仓储演示项目,由上位机服务统一给车下发任务,旁边用MAVProxy随时手动接管。管理工具其实不用全学,掌握一个图形地面站加一个脚本库,就基本覆盖日常了。

5.4 往后扩展:对接仓储调度系统的思路

这套ArduPilot无人车接上数传之后,完全可以通过上位机变成一个简易AGV。我在实验室里做过类似的演示:仓库管理系统(比如SAP WM这类模块化仓储模块)产生搬运任务后,中间有一个调度服务把任务解析成一条航点路线,再通过MAVLink发送给无人车,车执行完任务后回报一个任务完成事件。这样就把“无人车能跑”变成“无人车能干活”的雏形了。

不过要提醒一点:这属于方案验证,真正生产级AGV还会涉及安全雷达、磁导航或者激光反光板,ArduPilot作为一个开源飞控在农业和行业应用里很多,直接用于复杂的仓储搬运环境还要注意安全冗余。但对课程设计、比赛和原型验证来说,这套方案开发速度快、可改性强,尤其适合验证“上层系统和底层车控怎么对接”这类问题。

6. 常见问题与排查实录

6.1 问题速查表

这部分是实打实的踩坑记录,很多问题不是文档里写的,而是自己跑出来的。归纳成一张表:

现象排查思路与解决
飞控无法解锁检查加速度计/罗盘是否校准,检查遥控器是否对码,检查GPS是否锁星等
电机完全不动确认电调校准完成、通道映射正确、电池电压正常、电调信号线是否插对OUT口
左右轮方向反了在Mission Planner里反转对应通道方向,或交换电机线
车直线偏向一侧重新罗盘校准,检查转向中立微调,左右电机转速是否一致
GPS长时间不锁星移到室外,检查天线正面朝上,远离电机和电调,等1-2分钟,查看“状态”页GPS状态
数传连接经常掉确认地面站和数传波特率一致(通常57600),USB供电不足时给数传独立供电
航点执行时乱跑检查GPS航向和实际航向是否一致,检查HOME点是否设置,检查航点列表里有没有异常坐标
推油门车身断电重启电调BEC或UBEC带载能力不足,电池放电能力不够,加大UBEC电流或换高C数电池

如果你遇到的是“飞控不重启但电调没输出”,先怀疑电调信号线接触不良,其次怀疑电调本身没有完成校准,最后再看飞控的PWM输出是否被设成了其他功能。拿一台示波器或者简单测信号电平的万用表,可以很快判断PWM脉冲是否到达电调信号线。

6.2 一些教科书上不会写的避坑技巧

第一,APM 2.8板子上的跳线帽不要乱动。APM 2.8的电源管理有一个跳线帽,用来选择是从USB在仿真状态供电还是从电池测量模块供电。如果你发现飞控USB连接电脑正常但插上电池又不上电,八成是跳线帽设置有问题。低压无人车通常让跳线帽保留在有效状态,让电源模块给板子供电。第二,不要同时插着USB又给动力电池满电上电,这两个电源系统之间会产生回流压差,轻则GPS端口烧掉,重则飞控损坏。我的做法是调参时只插USB,动力电池断开;室外调试时只插电池,不插USB。

第三个经验是电调校准前一定拆轮子。不要以为车架空就安全,差速底盘解锁后转速不可控,万一电机带动的是有齿的履带轮,转到一半卡住会把传动结构扭坏。我拆一次轮子只需要一分钟,哪怕多拆几次也比修车架省心。第四个经验是每次刷完固件,强制自己把所有传感器和遥控器重新校准一遍,即使是同一台车,旧的参数文件也可能因为固件版本差异变成“脏参数”。

这几个技巧看起来琐碎,但踩过一次坑之后你就会明白,它们往往比“高深算法”更决定你今晚能不能按时收工。

这趟玩下来,我最大的体会是:ArduPilot其实没那么“高不可攀”,真正折磨人的反而是接线、供电、校准这些脏活。APM飞控搭配有刷电调,是目前接触ArduPilot成本最低、见效最快的路线,成功跑航点之后,你会对整个飞控系统产生一种“原来如此”的掌控感。如果你也打算入坑,强烈建议先做一台轮式差速小车练手,而不是一上来就飞飞机,毕竟车不会直接摔坏,试错成本友好得多。等你把这套逻辑玩顺手了,再升级Pixhawk、上更多传感器,就会发现整个ArduPilot生态都是相通的。

返回列表