Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >APM开发阅读

APM开发阅读

作者头像
云深无际
发布于 2022-02-09 03:40:36
发布于 2022-02-09 03:40:36
1.5K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行

我为什么要读APM的源码,一是为了学习,想知道飞控和大型项目是如何组织的。二是为了移植的需要,项目的需要。额,最近几年少儿编程大火,然后这些厂子也首当其冲的发布了一些产品,但是都是空心杯的产品,然后带来的问题就是动力不足,接着就是这个东西本身的扩展性不够。很多任务需要IO或者图像识别的帮助。

所以我就在想,APM裁剪版的飞控+空心杯电机+树莓派zero(可以是别的)可以使用ROS,Mavlink等东西组装一个无人机。

只是一种想法而已,目前没有可以参考的东西,我也在做。

F4的飞控,百来块钱

10块钱的电调

小桨叶

移植成功以后,其实使用便宜的MCU也可以,只是想利用已经比较完善的生态罢了,我觉得300多一个无刷无人机也可以,将高性能引入少儿教育,怎么看都是一件比较有趣的事情。

如果非要便宜的话,ESP8266+MPU6050+4个MOS管,一共也不要20块钱

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://ardupilot.org/dev/docs/ap-peripheral-landing-page.html

AP_Periph 是 ArduPilot Peripheral 的缩写,即。基于现有 ArduPilot 自动驾驶仪代码的 ArduPilot 外围设备。它采用了 ArduPilot 的外围设备驱动程序库,并使其适应运行在独立的外围设备上,这些外围设备通过 CAN、MSP 或其他外围总线协议与主飞控通信。我有点没看懂,好像是就单主控+单传感器的设置方案。

代码的位置再Tools里面:

位置在此

也可以使用浏览器打开,看一些英文的注释

这个APM可以使用make编译,也可以使用一个叫WAF的东西编译:其实就是Python的一个包,没有使用新的语言什么的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://waf.io/book/

先走马观花的看下来,细节遇到再看:

这里是所有的构建环境的安装

Ubuntu下开发是个正经事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Tools/environment_install/install-prereqs-ubuntu.sh -y

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
. ~/.profile

生效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf clean

构建后可以使用这个清楚编译的垃圾文件

接下来看看编译步骤

先把库拉下来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone --recursive https://github.com/ArduPilot/ardupilot.git
cd ardupilot

waf应该在APM的根目录下运行,而且是每次都应该这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board CubeBlack
./waf copter

第一个命令一般就使用一次,选择你要编译的硬件

二是编译一个直升飞机出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board skyviper-v2450
./waf copter

如果更改的话就是这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board bebop --static
./waf copter

这个是编译一共二进制的固件,使用一共参数,静态构建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf list_boards

获取支持的板子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./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

出现了这么多的板子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board satl            
#软件在环模拟器
./waf configure --board satl --debug    
#带调试符号的软件在环模拟器

未来我们主要看这个东西,在机器上面仿真

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./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语言都知道源码到成品,是需要经过链接的,其实构建系统就是在搞链接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf --targets bin/arducopter --upload

上传参数可以将构建好的二进制文件传到板子上面(PIxhawk和Linux的板子)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board <board> --rsync-dest <destination>

语法是这样的

对Linux板子来说,还需要配置IP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf configure --board navio2 --rsync-dest root@192.168.1.2:/
./waf --target bin/arducopter --upload

连起来就是这样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf copter
DESTDIR=/my/temporary/location ./waf install

还可以进行安装,到某个临时目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Quad frame of ArduCopter
./waf --targets bin/arducopter

# unit test of our math functions
./waf --targets tests/test_math

只构建一个二进制文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./waf -h

可以输出所有的帮助文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Configure the Linux board
./waf configure --board=linux

用于配置板子的类型选项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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了,如果想更快,哥们儿牛逼。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,安装一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git@github.com:yunswj/ardupilot.git

切到自己的分支,搞了下我的GT没配置,算球了。

构建完出现的文件类型

飞控板+Linux主机,这个Linux主机上面就是运行的我下面写的这个库,控制飞控板的运行.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://dronekit-python.readthedocs.io/en/latest/

DroneKit-Python 2.x 可帮助您为无人机创建强大的应用程序。这些应用程序在无人机的配套计算机上运行,并通过执行计算密集型和需要低延迟链接(例如计算机视觉)的任务来增强自动驾驶仪。我记得是Python2 的库,emmmm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/dronekit/dronekit-python

GitHub地址

一些简单的描述

链接的时候,使用串口就行

或是这样,PC->Pi ,Pi->RC

需要上面的电台,距离会很远。

APM的代码只有对直升飞机详细解释的,四轴的没有,有的看就行。

就是这个Copter

这个构架图真好

其实读源码除了对细节的把控,更需要的是宏观的理解。

硬件就是PX4和Linux的变形板

因为任务多,所以引入了操作系统

这是我们在意的东西,飞行代码

  1. 抽象的硬件层
  2. 共享的库,传感器,EKF算法
  3. 一些特殊的代码

飞控这么多的信息,比如电池电量,姿态等,使用MAVLink协议发送,接着就是给高层的应用,地面站以及你加了机载的计算机。

对上面的一个总结

这是对上面层的

目录里面的这个文件是说明当前的所有依赖

这个目录里面的文件归所有的顶层项目共有

这是核心库

传感器

其它库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $ARDUPILOT_HOME # the top-level of an AruPilot repository
./waf configure --board=Pixhawk1
./waf build --target examples/INS_generic --upload

编译的命令 ,先转到库的位置

然后编译,后面是编译的东西+上传

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $ARDUPILOT_HOME
./waf list | grep 'examples'

这样是可以输出所有的例子,就用了个grep的函数

如果你安装了MAVProxy,就可以执行下面的命令来看输出了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://ardupilot.org/mavproxy/docs/getting_started/download_and_installation.html#mavproxy-downloadinstallwindows

安装位置在此

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mavproxy.py --setup --master /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00

执行的命令如上,使用 –setup 选项将 mavproxy 置于原始串口模式,而不是已处理的 MAVLink 模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $ARDUPILOT_HOME # the top-level of an AruPilot repository
./waf configure --board sitl
./waf build --target examples/RCProtocolDecoder

在环仿真用这个,这个是RC协议解码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./build/sitl/examples/RCProtocolDecoder -M quad -C

开始运行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验