我为什么要读APM的源码,一是为了学习,想知道飞控和大型项目是如何组织的。二是为了移植的需要,项目的需要。额,最近几年少儿编程大火,然后这些厂子也首当其冲的发布了一些产品,但是都是空心杯的产品,然后带来的问题就是动力不足,接着就是这个东西本身的扩展性不够。很多任务需要IO或者图像识别的帮助。
所以我就在想,APM裁剪版的飞控+空心杯电机+树莓派zero(可以是别的)可以使用ROS,Mavlink等东西组装一个无人机。
只是一种想法而已,目前没有可以参考的东西,我也在做。
F4的飞控,百来块钱
10块钱的电调
小桨叶
移植成功以后,其实使用便宜的MCU也可以,只是想利用已经比较完善的生态罢了,我觉得300多一个无刷无人机也可以,将高性能引入少儿教育,怎么看都是一件比较有趣的事情。
如果非要便宜的话,ESP8266+MPU6050+4个MOS管,一共也不要20块钱
https://ardupilot.org/dev/docs/ap-peripheral-landing-page.html
AP_Periph 是 ArduPilot Peripheral 的缩写,即。基于现有 ArduPilot 自动驾驶仪代码的 ArduPilot 外围设备。它采用了 ArduPilot 的外围设备驱动程序库,并使其适应运行在独立的外围设备上,这些外围设备通过 CAN、MSP 或其他外围总线协议与主飞控通信。我有点没看懂,好像是就单主控+单传感器的设置方案。
代码的位置再Tools里面:
位置在此
也可以使用浏览器打开,看一些英文的注释
这个APM可以使用make编译,也可以使用一个叫WAF的东西编译:其实就是Python的一个包,没有使用新的语言什么的。
https://waf.io/book/
先走马观花的看下来,细节遇到再看:
这里是所有的构建环境的安装
Ubuntu下开发是个正经事情:
Tools/environment_install/install-prereqs-ubuntu.sh -y
安装
. ~/.profile
生效
./waf clean
构建后可以使用这个清楚编译的垃圾文件
接下来看看编译步骤
先把库拉下来:
git clone --recursive https://github.com/ArduPilot/ardupilot.git
cd ardupilot
waf应该在APM的根目录下运行,而且是每次都应该这样
./waf configure --board CubeBlack
./waf copter
第一个命令一般就使用一次,选择你要编译的硬件
二是编译一个直升飞机出来
./waf configure --board skyviper-v2450
./waf copter
如果更改的话就是这样
./waf configure --board bebop --static
./waf copter
这个是编译一共二进制的固件,使用一共参数,静态构建
./waf list_boards
获取支持的板子
./waf configure --board bebop --static # Bebop or Bebop2
./waf configure --board edge # emlid edge
./waf configure --board fmuv3 # 3DR Pixhawk 2 boards
./waf configure --board navio2 # emlid navio2
./waf configure --board Pixhawk1 # Pixhawk1
./waf configure --board CubeBlack # Hex/ProfiCNC Cube Black (formerly known as Pixhawk 2.1)
./waf configure --board Pixracer # Pixracer
./waf configure --board skyviper-v2450 # SkyRocket's SkyViper GPS drone using ChibiOS
./waf configure --board sitl # software-in-the-loop simulator
./waf configure --board sitl --debug # software-in-the-loop simulator with debug symbols
出现了这么多的板子
./waf configure --board satl
#软件在环模拟器
./waf configure --board satl --debug
#带调试符号的软件在环模拟器
未来我们主要看这个东西,在机器上面仿真
./waf copter # All multirotor types
./waf heli # Helicopter types
./waf plane # Fixed wing airplanes including VTOL
./waf rover # Ground-based rovers and surface boats
./waf sub # ROV and other submarines
./waf antennatracker # Antenna trackers
可以构建出来的项目类型。
清理构建:
命令clean和distclean都可以用来清理 构建,第一个会保留配置的信息,只是清理板子的对象,第二个比较彻底,要啥没啥。一般来说别来执行这东西,因为现在大多数的编译系统都是增量编译的,就是编译前会检查哪些内容需要重新编译,如果不需要就用以前的。学过c语言都知道源码到成品,是需要经过链接的,其实构建系统就是在搞链接。
./waf --targets bin/arducopter --upload
上传参数可以将构建好的二进制文件传到板子上面(PIxhawk和Linux的板子)
./waf configure --board <board> --rsync-dest <destination>
语法是这样的
对Linux板子来说,还需要配置IP
./waf configure --board navio2 --rsync-dest root@192.168.1.2:/
./waf --target bin/arducopter --upload
连起来就是这样。
./waf copter
DESTDIR=/my/temporary/location ./waf install
还可以进行安装,到某个临时目录
# Quad frame of ArduCopter
./waf --targets bin/arducopter
# unit test of our math functions
./waf --targets tests/test_math
只构建一个二进制文件
./waf -h
可以输出所有的帮助文档
# Configure the Linux board
./waf configure --board=linux
用于配置板子的类型选项
# Build programs from bin group
./waf
# Waf also accepts '-j' option to parallelize the build.
./waf -j8
waf = waf build,就使用waf就行。
j是并行编译,j8(jb)真快。一般来讲,不用你寡b的设置这个东西,自动就是加j了,如果想更快,哥们儿牛逼。
cd /usr/lib/ccache
sudo ln -s /usr/bin/ccache arm-none-eabi-g++
sudo ln -s /usr/bin/ccache arm-none-eabi-gcc
还可以使用ccahe,大幅度的提升编译的速度,你要是真搞开发,就不用用Windows,或者是远程搞个Linux。
干说不练怎么行?我正好有WLS2,安装一下:
git@github.com:yunswj/ardupilot.git
切到自己的分支,搞了下我的GT没配置,算球了。
构建完出现的文件类型
飞控板+Linux主机,这个Linux主机上面就是运行的我下面写的这个库,控制飞控板的运行.
https://dronekit-python.readthedocs.io/en/latest/
DroneKit-Python 2.x 可帮助您为无人机创建强大的应用程序。这些应用程序在无人机的配套计算机上运行,并通过执行计算密集型和需要低延迟链接(例如计算机视觉)的任务来增强自动驾驶仪。我记得是Python2 的库,emmmm
https://github.com/dronekit/dronekit-python
GitHub地址
一些简单的描述
链接的时候,使用串口就行
或是这样,PC->Pi ,Pi->RC
需要上面的电台,距离会很远。
APM的代码只有对直升飞机详细解释的,四轴的没有,有的看就行。
就是这个Copter
这个构架图真好
其实读源码除了对细节的把控,更需要的是宏观的理解。
硬件就是PX4和Linux的变形板
因为任务多,所以引入了操作系统
这是我们在意的东西,飞行代码
抽象的硬件层
共享的库,传感器,EKF算法
一些特殊的代码
飞控这么多的信息,比如电池电量,姿态等,使用MAVLink协议发送,接着就是给高层的应用,地面站以及你加了机载的计算机。
对上面的一个总结
这是对上面层的
目录里面的这个文件是说明当前的所有依赖
这个目录里面的文件归所有的顶层项目共有
这是核心库
传感器
其它库
cd $ARDUPILOT_HOME # the top-level of an AruPilot repository
./waf configure --board=Pixhawk1
./waf build --target examples/INS_generic --upload
编译的命令 ,先转到库的位置
然后编译,后面是编译的东西+上传
cd $ARDUPILOT_HOME
./waf list | grep 'examples'
这样是可以输出所有的例子,就用了个grep的函数
如果你安装了MAVProxy,就可以执行下面的命令来看输出了。
https://ardupilot.org/mavproxy/docs/getting_started/download_and_installation.html#mavproxy-downloadinstallwindows
安装位置在此
mavproxy.py --setup --master /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00
执行的命令如上,使用 –setup 选项将 mavproxy 置于原始串口模式,而不是已处理的 MAVLink 模式。
cd $ARDUPILOT_HOME # the top-level of an AruPilot repository
./waf configure --board sitl
./waf build --target examples/RCProtocolDecoder
在环仿真用这个,这个是RC协议解码
./build/sitl/examples/RCProtocolDecoder -M quad -C
开始运行。
联系客服