APM飞控学习之路:2 四旋翼的工作原理与系统组成
工作原理
四旋翼飞行器,通过4个对称布置的电机,改变螺旋桨的转速,实现升力的变化,进而控制飞行器的姿态和位置。姿态具体指3个欧拉角:横滚(Roll)、俯仰(Pitch)、偏航(Yaw)。位置具体指1个高度油门(Throttle)和2个位置(X和Y)。欧拉角是一种描述物体姿态的常见方式,广泛应用于惯性导航、机器人等领域。为了方便大家理解,在网上找了3个欧拉角的动图,分别为Roll、Pitch、Yaw,让我们致敬制作者3秒钟。
横滚:Roll,控制四旋翼左右运动。
俯仰:Pitch,控制四旋翼前后运动。
偏航:Yaw,控制四旋翼的朝向。
无人机的姿态和位置共有6个自由度,每个自由度的控制如下图所示。4个电机2个正转(电机2和4),2个反转(电机1和3),对称布置。电机正反转配合正反桨,可使螺旋桨的风都往下刮以平衡重力,同时抵消因桨叶旋转带来的空气阻力扭矩。由于输入只有4个自由度,因此多出的2个自由度是不完全受控的,其中俯仰运动和前后运动耦合,滚转运动和侧向运动耦合。
坐标系:标准右手系。规定X轴正方向为前向。螺旋桨的箭头向上↑:电机转速上升。螺旋桨的箭头向下↓:电机转速下降。
(a) 垂直运动(Throttle):4个电机均加大马力,螺旋桨产生的升力大于重力,飞机便垂直上升。当升力与重力平衡时,飞机便悬停。悬停是考验算法的重要一环,靠的是PID不断反馈,调整转速。
(b) 俯仰运动(Pitch):电机1加大马力,电机3减小马力,二者的变化量相同。1处升力变大,3处升力减小,重力仍保持平衡,但对Y轴产生一个力矩,机身绕Y轴旋转,实现俯仰。
(c) 滚转运动(Roll):与 (b) 原理相同,只是Y轴换成了X轴。
(d) 偏航运动(Yaw):电机1、3加大马力,电机2、4减小马力,二者的变化量相同。重力和绕X、Y轴的扭矩仍保持平衡,但要注意的是,根据作用力和反作用力原理,由于2个正转的速度》2个反转的速度,空气阻力产生的扭矩不平衡了,使得机身绕Z轴旋转,实现偏航。
(e) 前后运动:与 (b) 耦合,机身绕Y轴旋转一定角度后,使得升力沿水平方向有了分量,实现前后运动。
(f) 侧向运动:与 (c) 耦合,原理与 (e) 相同。
如果有朋友接触过麦克纳姆轮,也称“全向轮”,那就更容易理解四旋翼的工作原理了。麦克纳姆轮通过4个对称布置的电机和轮盘,可实现车身水平任意方向的移动和原地旋转,无比灵活。
主要部件
以S500为例,S500是一架入门级的四旋翼飞机,这里的500指的是轴距(对角2个电机之间的距离),单位 :mm。对于开源爱好者而言,如果想一站式玩四旋翼,在某宝上选购一架S500是个不错的选择。下面我就从上表出发,详细介绍四旋翼的主要部件和技术名词。
四旋翼本体
四旋翼分2种模式,1种是+模式:飞行方向(机头)与旋翼重合;1种是X模式:飞行方向(机头)平分旋翼。
+模式:直观,简单,驱动弱,调参容易。
X模式:复杂,稳定,驱动好,调参麻烦。
对于四旋翼,稳定和驱动是第一位的,调参可以站在巨人的肩膀上,因此一般采用X模式。
飞行控制器
飞行控制器简称飞控,是无人机的大脑。目前主要分开源和闭源两派,开源飞控的鼻祖来自Arduino,著名的WMC飞控和APM飞控都是Arduino飞控的直接衍生品,APM全称ArduPilotMega,其中的Ardu代表的就是Arduino。APM飞控是目前成熟度最高的开源飞控,但由于容量和计算量有限,在不久的将来一定会被更强大的PIX4、PIXHAWK所超越,成为一个时代的缩影。还有一些较为初级的飞控,如KK、QQ、玉兔等,在这就不赘述了。闭源飞控主要由商业公司推出,如DJI的工业级飞控A2、A3,入门级飞控Naza系列,还有零度的S4、X4和双子星GEMINI。值得一提是其中的双子星,是国内首个双余度安全飞行控制系统。随着安全性的重视和提高,冗余度设计也将成为无人机的标配。
螺旋桨
4个螺旋桨,2正桨(顺时针转)2反桨(逆时针转),正反桨的风都向下吹,正反的目的主要是抵消螺旋桨的自旋。安装的时候,无论正反桨,有字的一面均向上。桨型中1045这4位数字,前2位10代表桨的直径(单位:英寸inch),后2位45代表桨的角度(单位:度°)。
电机
4个无刷电机,2正转2反转。2212这4位数字,前2位22代表电机转子直径,后2位12代表电机转子高度,单位:毫米mm,注意均指电机转子而非外壳。如果大家留心的话,电机外壳上一般会并注明这4位数字,除此之外,还会看到一个KV值,代表外加1V电压时电机每分钟空转转速。如“KV:900”代表外加1V电压时,电机空转时每分钟转900圈。常见的电机品牌有新西达(XXD)、朗宇(SunnySky)等,并且很多外壳上会有一串神秘字符:MADE IN CHINA。
电调
说完电机说电调,电调和电机配套使用,是飞控和电机之间的桥梁。电调全称电子调速器(Electronic Speed Control),负责将飞控的控制信号(PWM波)转变为电流的大小,进而控制电机转速。除了明面上的转换功能,还能承载电机所需的大电流,以及将11.1V转为5V供飞控和遥控模块使用(BEC输出)。电调的主要参数是电流输出能力,单位A,如30A代表电调能提供的最大电流为30A。常见的电调品牌有新西达(XXD)、中特威(ZTW)、好盈(HobbyWing)等。
电池
一般为锂电池,因为同等电池容量锂电池最轻。大家可以看到有3个参数:3200mAh 11.1V 30c。和手机电池一样,3200mAh代表以3200mA电流放电,可持续1小时。11.1V代表电压,一般由3节标准锂电池组成(3.7V×3=11.1V),相应标识为3S。30c代表放电能力,在航模中是个重要参数,意味着可以3200mA×30的电流强度放电。说完了放电,还有充电,一般为2c充电,即充电电流可为3200mA×2。由于航模锂电池采用多节标准锂电池组成,而各节标准锂电池之间存在充放电性能差异,因此充电器一般采用平衡充,避免某节电池过充。
遥控器
主要分美国手和日门手,美国手的油门在左边,日本手的油门在右边。在四旋翼的控制中,一般采用美国手。怎么判断油门呢?很简单,遥控器左右2个摇杆中,推上去不回弹的是油门。也很好理解,油门一般稳定在一个位置就好了,回弹的话飞手会流泪。遥控器中也有1个神秘数字,6代表6通道,即遥控器可控的动作路数。因为四旋翼有4个自由度,所以遥控器至少需要4通道,剩余的通道用于控制飞行模式等。
至此四旋翼的主要部件和技术名词介绍完毕,还有一些可选部件,如数传、OSD、云台、相机、图传等,待大家入门后即可自行挖掘。最后附上一个Exciting的TED视频,震撼你的眼球。
APM飞控学习之路:3 APM系统介绍与开发环境搭建
APM系统介绍
APM全称ArduPilotMega,Ardu源自Arduino,Pilot意指飞行,Mega代表主芯片为ATMEGA2560(Atmel公司的8位AVR单片机)。是的,没有看错,一个简单8位单片机竟完成了如此复杂的飞控任务! 51单片机表示哭晕在厕所,同为8位出身,命运截然不同。笔者大概是2011年接触的单片机,当时也同大多数初学者一样,从经典的51单片机入门,一个个模块、寄存器的学习,曲线虽说不上陡峭,但至少不那么友好。反观Arduino,近3年在国内迅速崛起,除了Geek文化和开源文化的普及,一个很关键的原因在于Arduino让不懂硬件电路的普通人(甚至小学生)也能轻松上手硬件了。没有了烦人的寄存器,没有了纷繁的头文件,一个setup()和一个loop(),再加一个自带教程的简洁IDE,Arduino名副其实——源自意大利的男姓用名,意为“强壮的朋友”。世界如此美好,我想和Arduino做朋友。
APM内置六轴MEMS传感器MPU6000,气压计MS-5611,三轴磁力计HMC5883,一般还会配置GPS模块,以便更精确的惯性导航。其中,MPU6000整合了三轴陀螺仪和三轴加速度计,积分可得速度和位姿。MS-5611通过测量气压得到高度,辅助GPS定位。HMC5883通过测量地磁场得到方位,辅助无人机定向。飞控采集并融合多种传感器的数据,计算并校正无人机的位姿。给APM一张正面裸板特写!
APM与PIXHAWK的关系
说到APM,就不得不提它的进化版:PX4和PIXHAWK,来自苏黎世联邦理工大学。“PX4是一个软硬件开源项目(遵守BSD协议),目的在于为学术、爱好和工业团体提供一款低成本、高性能的高端自驾仪。PX4FMU自驾仪模块运行高效的实时操作系统(RTOS),Nuttx提供可移植操作系统接口(POSIX)类型的环境。由3DR联合APM小组与PX4小组于2014年推出的PIXHAWK飞控是PX4飞控的升级版本,拥有PX4和APM(ArduPilot)两套固件和相应的地面站软件,也是目前全世界飞控产品中硬件规格最高的产品。”
好了说人话,目前主流就2种:APM和PIXHAWK。有时指硬件,有时指软件(固件),为了明确,在此做个区分。硬件分2种:APM和PIXHAWK。APM的版本有2.5,2.6和2.8,PIXHAWK的版本有v1和v2。软件也分2种:APM和PX4。软件版本就多了去了,详见github。APM硬件由于存储空间有限,最高支持到3.2.1的APM软件。PIXHAWK硬件是STM32F4,存储空间大,对APM软件(3.2.1之后的版本也支持)和PX4都支持。
APM和PIXHAWK都开源,不过二者遵守的开源协议不同。APM多用于DIY和小型产品,某宝上大量的无人机就采用APM,成本低。公司商用一般采用PIXHAWK。目前很多PIXHAWK里跑的还是APM固件,个人认为有几大原因:1. APM固件出来的更早,使用人群习惯的延续;2. APM固件成熟度更高、资料更全。3. APM固件走开源路线更彻底,遵守GPL V3协议,PX4更倾向商业和实验用途,遵守BSD协议。
APM固件下载
刚提到APM硬件的最高版本为2.8,现在说说APM固件(源码)的版本。既然是开源项目,那么在github上肯定有仓库。曾经的APM源码存于code.google.com,后来github席卷全球,成为广泛接受的代码仓库,于是谷歌把自己的仓库关了(反正国内也上不去:-()。github上的源头在此。其中的ArduCopter支持多旋翼、直升机等,四旋翼源码即在其中,但是别急着下载,先点击release看看源码版本。可以看到带Copter的最新版本是“Copter-3.4.0”,带ArduCopter的最新版本是“ArduCopter-3.2.1-apm-px4”,很多朋友直接参照网上的《通过Arduino给APM编译下载最新固件》用git克隆代码到本地,发现无法使用,问题就在于git获取的是最新版,而APM支持的最高版本是“ArduCopter-3.2.1-apm-px4”,从命名也可以发现,该版本固件同时支持APM和PX4。
获取ArduCopter-3.2.1版本的源码有2种方式:I. 在github页面点击release,往下翻几页,找到“ArduCopter-3.2.1-apm-px4”下载即可。II. 喜欢git的朋友在克隆最新代码后,也可以回退到3.2.1的版本,与第一种方法获得的源码无异。
git clone
cd ardupilot/
git branch -a
git checkout -b arducopter-3.2.1 origin/ArduCopter-3.2.1
使用方法解压之后就可以看到源码啦,结构如下。其中,APMrover2支持地面车辆,ArduPlane支持固定翼,ArduCopter支持多旋翼和直升机。对于四旋翼的开发,就对应ArduCopter文件夹。值得一提的是,打开ArduCopter文件夹后,可以看到一大波.pde文件,.pde为Arduino文件的旧版后缀,新版的为.ino(Arduino的后3个字母),可以简单类比成.cpp文件。熟悉C++的朋友可能会想去找main文件,这回改头换面了,主文件叫ArduCopter.pde。
APM开发环境
巧妇难为无米之炊”,现在米有了,用什么工具做饭呢。先把火备好,即编译的工具链和驱动:MHV_AVR_Tools_20121007.exe(AVR单片机编译和下载程序用)和MissionPlanner-latest.msi(飞控地面站,含APM的USB接口驱动)。接下来就是用什么灶台做饭了,以Windows平台为例,灶台根据方便程度有2种:I. 土灶:ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows(为ArdupPilot定制的Arduino IDE)。II. 电磁炉:Visual Studio配合Visual Micro插件(Arduino for Visual Studio插件)。二者本质没有区别,可以看到都是调用gcc工具链,Visual Studio只是通过Visual Micro在上层封装了操作接口,便于程序员查看和编写代码。
环境I(轻量)。 Arduino IDE
先介绍Arduino派的IDE:ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows,此IDE不同于普通的Arduino IDE,而是为ArdupPilot定制的。解压之后,打开“arduino.exe”,一张白板扑面而来。唯一和飞控有关的就在菜单栏上,相比通用ArduinoIDE多了“ArduPilot”一项。工具栏的“√”是编译,“→”是下载。
点击“文件-》参数设置”,可设置程序库的位置,即APM源码位置,注意不要勾选“启动时检查更新”,因为本IDE专为ArduPilot定制。其他选项可根据个人喜好设置。
设置完成后退出再重开,以保证程序库位置生效。点击“文件-》程序库-》ArduCopter”,源代码一览无余。之后配置APM固件,主芯片:“工具-》板卡-》Arduino Mega 2560 or Mega ADK”,串口:“工具-》串口-》相应USB串口”(确保驱动已安装),编程器:“工具-》编程器-》AVRISP mkll”(默认),APM硬件型号:“ArduPilot-》HALBoard-》ArduPilot Mega 2.x”。
至此,Arduino IDE的完毕,可以点击编译了。等待3分钟左右,编译完毕,生成一个hex文件用于下载到APM板。
切记:不要下载!不要下载!不要下载!下载会变砖!
环境II(推荐)。 Visual Studio&Visual Micro
Arduino IDE编译APM的代码还可以,但要是用来浏览和编写代码,那就是千丝万缕扭不清了,所以ArduinoIDE的设置里也机智地留下一条后路:“□使用外部编辑器”。
Visual Studio(以下简称VS)作为宇宙最强IDE,怎么能不支持下Arduino,感谢微软救民于水火。以VS2012为例,点击“工具-》扩展和更新-》联机”,搜索“Visual Micro”,下载安装即可。顺便推荐下Visual Assist,VS下最好的代码补全工具,以前写1行代码的功夫,现在可以写3行~
安装好之后,VS的菜单栏多了一些振奋人心的东西。“VMICRO”中可设置Arduino的选项,点击“VMICOR-》Visual Micro Explorer”,如下图所示。对比Arduino IDE可发现,编译、下载、COM口应有尽有,还可适配不同的Arduino 版本。
点击“Configure”进行配置,选择Arduino版本:1.0,配置Arduino目录,笔者的是:D:FlyArduPilot-Arduino-1.0.3-windows,即ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows解压后的文件夹。注意此插件的名字是“Arduino IDE for Visual Studio”,并不是专为Ardupilot/APM定制,因此还需适配apm硬件信息(点击蓝字链接下载,解压后为一名为apm的文件夹,内仅含boards.txt)。将该apm文件夹放入D:FlyArduPilot-Arduino-1.0.3-windowshardware中。配置完成之后,可在“Installed”选项卡中查看支持的硬件类型,如所需的“Arduino Mega 2560 HAL (Apm 2)”,插上APM后在COM口选择对应的串口号。此外,在“Examles”选项卡中可查看Arduino和ArduCopter的例程。
重启VS,点击“文件-》打开-》Arduino Project”,选择ArduCopter文件夹中的ArduCopter.pde打开,即可在“解决方案资源管理器”中看到APM的源码结构。解释一下,ArduCopter.pde相当于平时常见的Main.cpp,在ArduCopter.pde的最后一行是真正的main函数。
AP_HAL_MAIN(); 除此之外,有一点需要注意,在“VMICRO”中,“Debugger”取消勾选“Automatic Debug(Release/Debug)”,否则会编译失败。因为APM2.8不支持在线Debug,同时对于“多线程”程序,Debug本身意义不大,一般采用串口print进行调试以便观察程序流程。对于普通Arduino板(如nano)可以勾选,下载后会自动进入调试状态。
至此,Visual Studio&Visual Micro的配置完毕,又可以愉快地编译了。同样等待大概3分钟左右,可以看到编译完成,生成一个hex文件用于下载到APM板。对于编译,第1次会较慢,修改代码再次编译就很快了。
APM飞控学习之路:2 四旋翼的工作原理与系统组成
工作原理
四旋翼飞行器,通过4个对称布置的电机,改变螺旋桨的转速,实现升力的变化,进而控制飞行器的姿态和位置。姿态具体指3个欧拉角:横滚(Roll)、俯仰(Pitch)、偏航(Yaw)。位置具体指1个高度油门(Throttle)和2个位置(X和Y)。欧拉角是一种描述物体姿态的常见方式,广泛应用于惯性导航、机器人等领域。为了方便大家理解,在网上找了3个欧拉角的动图,分别为Roll、Pitch、Yaw,让我们致敬制作者3秒钟。
横滚:Roll,控制四旋翼左右运动。
俯仰:Pitch,控制四旋翼前后运动。
偏航:Yaw,控制四旋翼的朝向。
无人机的姿态和位置共有6个自由度,每个自由度的控制如下图所示。4个电机2个正转(电机2和4),2个反转(电机1和3),对称布置。电机正反转配合正反桨,可使螺旋桨的风都往下刮以平衡重力,同时抵消因桨叶旋转带来的空气阻力扭矩。由于输入只有4个自由度,因此多出的2个自由度是不完全受控的,其中俯仰运动和前后运动耦合,滚转运动和侧向运动耦合。
坐标系:标准右手系。规定X轴正方向为前向。螺旋桨的箭头向上↑:电机转速上升。螺旋桨的箭头向下↓:电机转速下降。
(a) 垂直运动(Throttle):4个电机均加大马力,螺旋桨产生的升力大于重力,飞机便垂直上升。当升力与重力平衡时,飞机便悬停。悬停是考验算法的重要一环,靠的是PID不断反馈,调整转速。
(b) 俯仰运动(Pitch):电机1加大马力,电机3减小马力,二者的变化量相同。1处升力变大,3处升力减小,重力仍保持平衡,但对Y轴产生一个力矩,机身绕Y轴旋转,实现俯仰。
(c) 滚转运动(Roll):与 (b) 原理相同,只是Y轴换成了X轴。
(d) 偏航运动(Yaw):电机1、3加大马力,电机2、4减小马力,二者的变化量相同。重力和绕X、Y轴的扭矩仍保持平衡,但要注意的是,根据作用力和反作用力原理,由于2个正转的速度》2个反转的速度,空气阻力产生的扭矩不平衡了,使得机身绕Z轴旋转,实现偏航。
(e) 前后运动:与 (b) 耦合,机身绕Y轴旋转一定角度后,使得升力沿水平方向有了分量,实现前后运动。
(f) 侧向运动:与 (c) 耦合,原理与 (e) 相同。
如果有朋友接触过麦克纳姆轮,也称“全向轮”,那就更容易理解四旋翼的工作原理了。麦克纳姆轮通过4个对称布置的电机和轮盘,可实现车身水平任意方向的移动和原地旋转,无比灵活。
主要部件
以S500为例,S500是一架入门级的四旋翼飞机,这里的500指的是轴距(对角2个电机之间的距离),单位 :mm。对于开源爱好者而言,如果想一站式玩四旋翼,在某宝上选购一架S500是个不错的选择。下面我就从上表出发,详细介绍四旋翼的主要部件和技术名词。
四旋翼本体
四旋翼分2种模式,1种是+模式:飞行方向(机头)与旋翼重合;1种是X模式:飞行方向(机头)平分旋翼。
+模式:直观,简单,驱动弱,调参容易。
X模式:复杂,稳定,驱动好,调参麻烦。
对于四旋翼,稳定和驱动是第一位的,调参可以站在巨人的肩膀上,因此一般采用X模式。
飞行控制器
飞行控制器简称飞控,是无人机的大脑。目前主要分开源和闭源两派,开源飞控的鼻祖来自Arduino,著名的WMC飞控和APM飞控都是Arduino飞控的直接衍生品,APM全称ArduPilotMega,其中的Ardu代表的就是Arduino。APM飞控是目前成熟度最高的开源飞控,但由于容量和计算量有限,在不久的将来一定会被更强大的PIX4、PIXHAWK所超越,成为一个时代的缩影。还有一些较为初级的飞控,如KK、QQ、玉兔等,在这就不赘述了。闭源飞控主要由商业公司推出,如DJI的工业级飞控A2、A3,入门级飞控Naza系列,还有零度的S4、X4和双子星GEMINI。值得一提是其中的双子星,是国内首个双余度安全飞行控制系统。随着安全性的重视和提高,冗余度设计也将成为无人机的标配。
螺旋桨
4个螺旋桨,2正桨(顺时针转)2反桨(逆时针转),正反桨的风都向下吹,正反的目的主要是抵消螺旋桨的自旋。安装的时候,无论正反桨,有字的一面均向上。桨型中1045这4位数字,前2位10代表桨的直径(单位:英寸inch),后2位45代表桨的角度(单位:度°)。
电机
4个无刷电机,2正转2反转。2212这4位数字,前2位22代表电机转子直径,后2位12代表电机转子高度,单位:毫米mm,注意均指电机转子而非外壳。如果大家留心的话,电机外壳上一般会并注明这4位数字,除此之外,还会看到一个KV值,代表外加1V电压时电机每分钟空转转速。如“KV:900”代表外加1V电压时,电机空转时每分钟转900圈。常见的电机品牌有新西达(XXD)、朗宇(SunnySky)等,并且很多外壳上会有一串神秘字符:MADE IN CHINA。
电调
说完电机说电调,电调和电机配套使用,是飞控和电机之间的桥梁。电调全称电子调速器(Electronic Speed Control),负责将飞控的控制信号(PWM波)转变为电流的大小,进而控制电机转速。除了明面上的转换功能,还能承载电机所需的大电流,以及将11.1V转为5V供飞控和遥控模块使用(BEC输出)。电调的主要参数是电流输出能力,单位A,如30A代表电调能提供的最大电流为30A。常见的电调品牌有新西达(XXD)、中特威(ZTW)、好盈(HobbyWing)等。
电池
一般为锂电池,因为同等电池容量锂电池最轻。大家可以看到有3个参数:3200mAh 11.1V 30c。和手机电池一样,3200mAh代表以3200mA电流放电,可持续1小时。11.1V代表电压,一般由3节标准锂电池组成(3.7V×3=11.1V),相应标识为3S。30c代表放电能力,在航模中是个重要参数,意味着可以3200mA×30的电流强度放电。说完了放电,还有充电,一般为2c充电,即充电电流可为3200mA×2。由于航模锂电池采用多节标准锂电池组成,而各节标准锂电池之间存在充放电性能差异,因此充电器一般采用平衡充,避免某节电池过充。
遥控器
主要分美国手和日门手,美国手的油门在左边,日本手的油门在右边。在四旋翼的控制中,一般采用美国手。怎么判断油门呢?很简单,遥控器左右2个摇杆中,推上去不回弹的是油门。也很好理解,油门一般稳定在一个位置就好了,回弹的话飞手会流泪。遥控器中也有1个神秘数字,6代表6通道,即遥控器可控的动作路数。因为四旋翼有4个自由度,所以遥控器至少需要4通道,剩余的通道用于控制飞行模式等。
至此四旋翼的主要部件和技术名词介绍完毕,还有一些可选部件,如数传、OSD、云台、相机、图传等,待大家入门后即可自行挖掘。最后附上一个Exciting的TED视频,震撼你的眼球。
APM飞控学习之路:3 APM系统介绍与开发环境搭建
APM系统介绍
APM全称ArduPilotMega,Ardu源自Arduino,Pilot意指飞行,Mega代表主芯片为ATMEGA2560(Atmel公司的8位AVR单片机)。是的,没有看错,一个简单8位单片机竟完成了如此复杂的飞控任务! 51单片机表示哭晕在厕所,同为8位出身,命运截然不同。笔者大概是2011年接触的单片机,当时也同大多数初学者一样,从经典的51单片机入门,一个个模块、寄存器的学习,曲线虽说不上陡峭,但至少不那么友好。反观Arduino,近3年在国内迅速崛起,除了Geek文化和开源文化的普及,一个很关键的原因在于Arduino让不懂硬件电路的普通人(甚至小学生)也能轻松上手硬件了。没有了烦人的寄存器,没有了纷繁的头文件,一个setup()和一个loop(),再加一个自带教程的简洁IDE,Arduino名副其实——源自意大利的男姓用名,意为“强壮的朋友”。世界如此美好,我想和Arduino做朋友。
APM内置六轴MEMS传感器MPU6000,气压计MS-5611,三轴磁力计HMC5883,一般还会配置GPS模块,以便更精确的惯性导航。其中,MPU6000整合了三轴陀螺仪和三轴加速度计,积分可得速度和位姿。MS-5611通过测量气压得到高度,辅助GPS定位。HMC5883通过测量地磁场得到方位,辅助无人机定向。飞控采集并融合多种传感器的数据,计算并校正无人机的位姿。给APM一张正面裸板特写!
APM与PIXHAWK的关系
说到APM,就不得不提它的进化版:PX4和PIXHAWK,来自苏黎世联邦理工大学。“PX4是一个软硬件开源项目(遵守BSD协议),目的在于为学术、爱好和工业团体提供一款低成本、高性能的高端自驾仪。PX4FMU自驾仪模块运行高效的实时操作系统(RTOS),Nuttx提供可移植操作系统接口(POSIX)类型的环境。由3DR联合APM小组与PX4小组于2014年推出的PIXHAWK飞控是PX4飞控的升级版本,拥有PX4和APM(ArduPilot)两套固件和相应的地面站软件,也是目前全世界飞控产品中硬件规格最高的产品。”
好了说人话,目前主流就2种:APM和PIXHAWK。有时指硬件,有时指软件(固件),为了明确,在此做个区分。硬件分2种:APM和PIXHAWK。APM的版本有2.5,2.6和2.8,PIXHAWK的版本有v1和v2。软件也分2种:APM和PX4。软件版本就多了去了,详见github。APM硬件由于存储空间有限,最高支持到3.2.1的APM软件。PIXHAWK硬件是STM32F4,存储空间大,对APM软件(3.2.1之后的版本也支持)和PX4都支持。
APM和PIXHAWK都开源,不过二者遵守的开源协议不同。APM多用于DIY和小型产品,某宝上大量的无人机就采用APM,成本低。公司商用一般采用PIXHAWK。目前很多PIXHAWK里跑的还是APM固件,个人认为有几大原因:1. APM固件出来的更早,使用人群习惯的延续;2. APM固件成熟度更高、资料更全。3. APM固件走开源路线更彻底,遵守GPL V3协议,PX4更倾向商业和实验用途,遵守BSD协议。
APM固件下载
刚提到APM硬件的最高版本为2.8,现在说说APM固件(源码)的版本。既然是开源项目,那么在github上肯定有仓库。曾经的APM源码存于code.google.com,后来github席卷全球,成为广泛接受的代码仓库,于是谷歌把自己的仓库关了(反正国内也上不去:-()。github上的源头在此。其中的ArduCopter支持多旋翼、直升机等,四旋翼源码即在其中,但是别急着下载,先点击release看看源码版本。可以看到带Copter的最新版本是“Copter-3.4.0”,带ArduCopter的最新版本是“ArduCopter-3.2.1-apm-px4”,很多朋友直接参照网上的《通过Arduino给APM编译下载最新固件》用git克隆代码到本地,发现无法使用,问题就在于git获取的是最新版,而APM支持的最高版本是“ArduCopter-3.2.1-apm-px4”,从命名也可以发现,该版本固件同时支持APM和PX4。
获取ArduCopter-3.2.1版本的源码有2种方式:I. 在github页面点击release,往下翻几页,找到“ArduCopter-3.2.1-apm-px4”下载即可。II. 喜欢git的朋友在克隆最新代码后,也可以回退到3.2.1的版本,与第一种方法获得的源码无异。
git clone
cd ardupilot/
git branch -a
git checkout -b arducopter-3.2.1 origin/ArduCopter-3.2.1
使用方法解压之后就可以看到源码啦,结构如下。其中,APMrover2支持地面车辆,ArduPlane支持固定翼,ArduCopter支持多旋翼和直升机。对于四旋翼的开发,就对应ArduCopter文件夹。值得一提的是,打开ArduCopter文件夹后,可以看到一大波.pde文件,.pde为Arduino文件的旧版后缀,新版的为.ino(Arduino的后3个字母),可以简单类比成.cpp文件。熟悉C++的朋友可能会想去找main文件,这回改头换面了,主文件叫ArduCopter.pde。
APM开发环境
巧妇难为无米之炊”,现在米有了,用什么工具做饭呢。先把火备好,即编译的工具链和驱动:MHV_AVR_Tools_20121007.exe(AVR单片机编译和下载程序用)和MissionPlanner-latest.msi(飞控地面站,含APM的USB接口驱动)。接下来就是用什么灶台做饭了,以Windows平台为例,灶台根据方便程度有2种:I. 土灶:ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows(为ArdupPilot定制的Arduino IDE)。II. 电磁炉:Visual Studio配合Visual Micro插件(Arduino for Visual Studio插件)。二者本质没有区别,可以看到都是调用gcc工具链,Visual Studio只是通过Visual Micro在上层封装了操作接口,便于程序员查看和编写代码。
环境I(轻量)。 Arduino IDE
先介绍Arduino派的IDE:ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows,此IDE不同于普通的Arduino IDE,而是为ArdupPilot定制的。解压之后,打开“arduino.exe”,一张白板扑面而来。唯一和飞控有关的就在菜单栏上,相比通用ArduinoIDE多了“ArduPilot”一项。工具栏的“√”是编译,“→”是下载。
点击“文件-》参数设置”,可设置程序库的位置,即APM源码位置,注意不要勾选“启动时检查更新”,因为本IDE专为ArduPilot定制。其他选项可根据个人喜好设置。
设置完成后退出再重开,以保证程序库位置生效。点击“文件-》程序库-》ArduCopter”,源代码一览无余。之后配置APM固件,主芯片:“工具-》板卡-》Arduino Mega 2560 or Mega ADK”,串口:“工具-》串口-》相应USB串口”(确保驱动已安装),编程器:“工具-》编程器-》AVRISP mkll”(默认),APM硬件型号:“ArduPilot-》HALBoard-》ArduPilot Mega 2.x”。
至此,Arduino IDE的完毕,可以点击编译了。等待3分钟左右,编译完毕,生成一个hex文件用于下载到APM板。
切记:不要下载!不要下载!不要下载!下载会变砖!
环境II(推荐)。 Visual Studio&Visual Micro
Arduino IDE编译APM的代码还可以,但要是用来浏览和编写代码,那就是千丝万缕扭不清了,所以ArduinoIDE的设置里也机智地留下一条后路:“□使用外部编辑器”。
Visual Studio(以下简称VS)作为宇宙最强IDE,怎么能不支持下Arduino,感谢微软救民于水火。以VS2012为例,点击“工具-》扩展和更新-》联机”,搜索“Visual Micro”,下载安装即可。顺便推荐下Visual Assist,VS下最好的代码补全工具,以前写1行代码的功夫,现在可以写3行~
安装好之后,VS的菜单栏多了一些振奋人心的东西。“VMICRO”中可设置Arduino的选项,点击“VMICOR-》Visual Micro Explorer”,如下图所示。对比Arduino IDE可发现,编译、下载、COM口应有尽有,还可适配不同的Arduino 版本。
点击“Configure”进行配置,选择Arduino版本:1.0,配置Arduino目录,笔者的是:D:FlyArduPilot-Arduino-1.0.3-windows,即ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows解压后的文件夹。注意此插件的名字是“Arduino IDE for Visual Studio”,并不是专为Ardupilot/APM定制,因此还需适配apm硬件信息(点击蓝字链接下载,解压后为一名为apm的文件夹,内仅含boards.txt)。将该apm文件夹放入D:FlyArduPilot-Arduino-1.0.3-windowshardware中。配置完成之后,可在“Installed”选项卡中查看支持的硬件类型,如所需的“Arduino Mega 2560 HAL (Apm 2)”,插上APM后在COM口选择对应的串口号。此外,在“Examles”选项卡中可查看Arduino和ArduCopter的例程。
重启VS,点击“文件-》打开-》Arduino Project”,选择ArduCopter文件夹中的ArduCopter.pde打开,即可在“解决方案资源管理器”中看到APM的源码结构。解释一下,ArduCopter.pde相当于平时常见的Main.cpp,在ArduCopter.pde的最后一行是真正的main函数。
AP_HAL_MAIN(); 除此之外,有一点需要注意,在“VMICRO”中,“Debugger”取消勾选“Automatic Debug(Release/Debug)”,否则会编译失败。因为APM2.8不支持在线Debug,同时对于“多线程”程序,Debug本身意义不大,一般采用串口print进行调试以便观察程序流程。对于普通Arduino板(如nano)可以勾选,下载后会自动进入调试状态。
至此,Visual Studio&Visual Micro的配置完毕,又可以愉快地编译了。同样等待大概3分钟左右,可以看到编译完成,生成一个hex文件用于下载到APM板。对于编译,第1次会较慢,修改代码再次编译就很快了。
举报