最近要开发无人机地面站,但是没有无人机,开发无人机对我来说也是大姑娘坐花轿——头一回。我们要用 MAVLink 和无人机之间通信,看了几天 MAVLink,还是不得劲儿,没有实物实在是不好弄,所以想先装一个无人机模拟器来试试。
基本概念
首先要明确一些概念,将它们与具体事务之间建立起联系,明白这些名词是什么,干什么的。
-
载具
无人机,无人车,无人船,这些都叫做载具。
-
载荷
载具上安装的传感器,摄像头等都叫做载荷。
-
地面站
载具与地面站之前进行通信,地面站可以显示载具和载荷信息,并发送指令控制载具。
-
MAVLink
载具与地面站之间进行通信的协议,它针对资源受限平台进行了优化,开源,轻量。
-
Pixhawk 和 PX4
Pixhawk 是开源飞控硬件平台,PX4 是专为 Pixhawk 开发的固件。
-
ArduPilotMega 和 ArduPilot
ArduPilotMega 也是飞控硬件平台,ArduPilot 是 ArduPilotMega 的固件,但是由于 ArduPilotMega 性能较低,所以 ArduPilot 也对 Pixhawk 做了兼容,可以运行在 Pixhawk 上。它们都叫 APM,所以看到 APM 的时候要明白它既是硬件平台,也是软件平台。
-
QGC 和 MP:
QGC 是 QGroundControl,MP 是 Mission Planner,它们都是地面站。QGC 是 PX4 用的地面站,MP 是 APM 的地面站。当然,地面站没有什么专用的,APM 也可以用 QGC 作为地面站。
-
全称 Software In The Loop,是一种用于测试和开发无人机的仿真环境,可以在没有硬件的情况下通过软件模拟无人机的飞行和传感器数据。
参考:
PX4(Pixhawk)和Audupilot(APM)的区别与联系_px4和pixhawk的区别-CSDN博客
SITLAPM_45">搭建SITL仿真环境模拟APM
我选择了 APM 进行模拟仿真,因为它安装配置起来比较简单,目前只是用它来学习是试验。
SITL 是在 Linux 上开发的,但是也可以在 Windows 上编译运行。我现在没有时间来折腾 Ubuntu 系统了,所以直接在 Windows 上开搞,虽然官方并不推荐。
第一步:下载 ardupilot 源码
$ git clone https://github.com/ArduPilot/ardupilot
$ cd ardupilot/
$ git submodule update --init --recursiv
第1行是下载 ardupilot 源码,然后进入 ardupilot
目录,第3行是下载子模块。其实这里我感觉只需要执行第1行就可以了,因为我们最终要用到的其实是这个仓库下的一个脚本,后面的步骤我们会看到。所以这里应该不需要下载子模块,但是在之前的尝试中我已经下载了子模块,所以没去亲测不下载子模块是否也可以。而且后面还是要重新下载源码的。
第二步:安装运行环境
这里环境配置其实还是挺麻烦的,需要 Cygwin,GCC,MAVProxy,python等,我看了很多博客,没人讲清楚环境究竟该怎么配置好,实在是有点生气,浪费了不少时间,还是官网比较靠谱。
完整的环境配置步骤在官网有详细说明,我是在 Windows 上安装,所以参考👉这里👈。打开官方文档,我们看到有一个注意:
翻译过来就是:在 ardupilot 源码的 Tools/environment_install
目录下有一个 install-prereqs-windows.ps1
脚本可以自动帮我们自动执行下面的全部步骤,也就是自动帮我们配置好所有环境依赖。 .ps1
是 Windows 的 PowerShell 脚本,可以直接在 PowerShell 中执行。原来可以一键配置环境,这简直是太让人激动了。
不过大家先别急着执行这个脚本,我们可以先看一下这个脚本的内容:
#Powershell script to download and configure the APM SITL environmentImport-Module BitsTransferWrite-Output "Starting Downloads"Write-Output "Downloading MAVProxy (1/7)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/MAVProxy/MAVProxySetup-latest.exe" -Destination "$PSScriptRoot\MAVProxySetup-latest.exe"Write-Output "Downloading Cygwin x64 (2/7)"
Start-BitsTransfer -Source "https://cygwin.com/setup-x86_64.exe" -Destination "$PSScriptRoot\setup-x86_64.exe"Write-Output "Downloading ARM GCC Compiler 10-2020-Q4-Major (3/7)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/STM32-tools/gcc-arm-none-eabi-10-2020-q4-major-win32.exe" -Destination "$PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe"Write-Output "Installing Cygwin x64 (4/7)"
Start-Process -wait -FilePath $PSScriptRoot\setup-x86_64.exe -ArgumentList "--root=C:\cygwin64 --no-startmenu --local-package-dir=$env:USERPROFILE\Downloads --site=http://cygwin.mirror.constant.com --packages autoconf,automake,ccache,cygwin32-gcc-g++,gcc-g++=7.4.0-1,libgcc1=7.4.0.1,gcc-core=7.4.0-1,git,libtool,make,gawk,libexpat-devel,libxml2-devel,python37,python37-future,python37-lxml,python37-pip,libxslt-devel,python37-devel,procps-ng,zip,gdb,ddd,xterm --quiet-mode"Write-Output "Downloading extra Python packages (5/7)"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c 'python3.7 -m pip install empy==3.3.4 pyserial pymavlink intelhex dronecan pexpect'"Write-Output "Installing ARM GCC Compiler 10-2020-Q4-Major (6/7)"
& $PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe /S /P /RWrite-Output "Installing MAVProxy (7/7)"
& $PSScriptRoot\MAVProxySetup-latest.exe /SILENT | Out-NullWrite-Host "Finished. Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Write-Output
就跟 print
或 echo
一样,用来向控制台打印内容。我们可以看到一共有7个步骤,他会帮我们:
- 下载 MAVProxy
- 下载 Cygwin
- 下载 ARM GCC 编译器
- 安装 Cygwin
- 下载需要的 Python 库
- 安装 ARM GCC 编译器
- 安装 MAVProxy
这就是完整的环境配置流程了,但是在我这里安装 Python 库似乎有些问题,因为后面运行仿真的时候还是提示我缺少 Python 库,也包括 empy
。但是这些都不是问题,后面后动安装一下就可以了,后面我们再看。
除了这个脚本,还有一个叫 install-prereqs-windows-andAPMSource.ps1
的脚本,它除了安装依赖环境外,还会帮你下载一份 ardupilot 源码。
#Powershell script to download and configure the APM SITL environmentImport-Module BitsTransferWrite-Output "Starting Downloads"Write-Output "Downloading MAVProxy (1/8)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/MAVProxy/MAVProxySetup-latest.exe" -Destination "$PSScriptRoot\MAVProxySetup-latest.exe"Write-Output "Downloading Cygwin x64 (2/8)"
Start-BitsTransfer -Source "https://cygwin.com/setup-x86_64.exe" -Destination "$PSScriptRoot\setup-x86_64.exe"Write-Output "Downloading ARM GCC Compiler 10-2020-Q4-Major (3/8)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/STM32-tools/gcc-arm-none-eabi-10-2020-q4-major-win32.exe" -Destination "$PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe"Write-Output "Installing Cygwin x64 (4/8)"
Start-Process -wait -FilePath $PSScriptRoot\setup-x86_64.exe -ArgumentList "--root=C:\cygwin64 --no-startmenu --local-package-dir=$env:USERPROFILE\Downloads --site=http://cygwin.mirror.constant.com --packages autoconf,automake,ccache,cygwin32-gcc-g++,gcc-g++=7.4.0-1,libgcc1=7.4.0.1,gcc-core=7.4.0-1,git,libtool,make,gawk,libexpat-devel,libxml2-devel,python37,python37-future,python37-lxml,python37-pip,libxslt-devel,python37-devel,procps-ng,zip,gdb,ddd --quiet-mode"Write-Output "Downloading extra Python packages (5/8)"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c 'python3.7 -m pip install empy==3.3.4 pyserial pymavlink intelhex dronecan pexpect'"Write-Output "Downloading APM source (6/8)"
Copy-Item "APM_install.sh" -Destination "C:\cygwin64\home"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c ../APM_install.sh"Write-Output "Installing ARM GCC Compiler 10-2020-Q4-Major (7/8)"
& $PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe /S /P /RWrite-Output "Installing MAVProxy (8/8)"
& $PSScriptRoot\MAVProxySetup-latest.exe /SILENT | Out-NullWrite-Host "Finished. Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
可以看到这里一共是 8 个步骤,多了第 6 步下载 APM 源码。它最后执行的是 APM_install.sh
这个脚本,它和 install-prereqs-windows-andAPMSource.ps1
在同一个目录下,我们看下它的内容:
#!/usr/bin/env bash#A simple script to install the APM SITL environment into cygwingit clone git://github.com/ArduPilot/ardupilot.git
cd ./ardupilot
git submodule update --init --recursive
./modules/waf/waf-light configure --board=sitl
其实就是我们第一步执行的下载源码的命令,但是这里它多了一步 ./modules/waf/waf-light configure --board=sitl
,在我的配置过程中没有手动执行过这个命令,但是我也成功了。
运行这两个脚本的任何一个都行,如果图省事可以运行 install-prereqs-windows-andAPMSource.ps1
一次把环境和源码都弄好。如果你的 Github 连接不稳定,或者你想自己决定源码放在哪里,可以执行 install-prereqs-windows.ps1
只安装依赖,然后自己下载源码。
因为我一开始不知道,所以执行的是 install-prereqs-windows.ps1
,只安装了环境,所以下一步我就需要再下载一遍源码。
PS E:\project\c\ardupilot> .\Tools\environment_install\install-prereqs-windows.ps1
Starting Downloads
Downloading MAVProxy (1/7)
Downloading Cygwin x64 (2/7)
Downloading ARM GCC Compiler 10-2020-Q4-Major (3/7)
Installing Cygwin x64 (4/7)
User has NO backup/restore rights
User has NO symlink creation right
note: Hand installation over to elevated child process.
Downloading extra Python packages (5/7)
Installing ARM GCC Compiler 10-2020-Q4-Major (6/7)
Installing MAVProxy (7/7)
Finished. Press any key to continue ...
这个脚本执行需要一点时间,安装成功后,会提示我们按任意键结束。
第三步:打开Cygwin下载APM源码(可选)
在桌面上找到 Cygwin64 Terminal 图标,双击打开,或者按 win 键搜索一下打开。Cygwin 是 Windows 上的一个 Linux 终端模拟器,在这里我们可以执行 Linux shell 命令。
为什么我在这里又下载了一遍源码呢?因为当时我不知道怎么在 Cygwin 上访问 Windows 的文件系统,所以又在 Cygwin 上下载了一份源码。
$ git clone https://github.com/ArduPilot/ardupilot
$ cd ardupilot/
$ git submodule update --init --recursive
Windows 上的文件系统挂载在 Cygwin 的 cygdrive
目录下,比如我的代码放在 E:\project\c\ardupilot
目录下,那么在 Cygwin 上就是 /cygdrive/e/project/c/ardupilot
。如果在第一步已经下载了完整的源码,那么这里应该是可以直接用的,不用再重新下载,虽未亲测,但推测可行。
第四步:启动模拟
在开始之前我们要选择要模拟的载具,然后切换到相应的目录下执行 Tools/autotest/sim_vehicle.py
文件。比如我要模拟的是 ArduCopter,那么就执行:
$ cd ArduCopter
$ ../Tools/autotest/sim_vehicle.py --map --console
这里我出现了缺少 Python 包的问题,一共是3个: pexpect
, empy
和 future
。这里直接看错误提示跟着把缺少的包装上就可以了,因为我不确定是不是大家都是缺这3个库,所以也不推荐大家在这里先把这3个库装一遍。
pexpect
和 future
都是用 pip3 install
直接安装就行。
empy
根据提示使用 python -m pip install empy=3.3.4
安装即可。
如果你的系统上安装了多个 Python 版本,还要注意下 pip
和 pip3
的区别,我们要用 Cygwin 上的 pip,比如我这里是这样的:
很明显,我的 Cygwin 上装的 Python 是 3.9.16,对应的 pip3
,所以不能用 pip
去安装,否则就装错地方了。
以上问题都解决以后,再次执行 ../Tools/autotest/sim_vehicle.py --map --console
就会进入漫长的编译过程,最后编译成功,会弹出3个窗口。
到这里你的无人机就已经准备好起飞了。
右边是地图,上面有个无人机,左上是无人机的控制台,左下是 MAVProxy 的控制台。我可以在 MAVProxy 控制台中输入命令控制无人机起飞。
mode guided
arm throttle
takeoff 40
以上这些内容可以参考官方文档:在 Windows 上使用 Cygwin 进行 SITL 设置(不推荐)。别管推不推荐,反正这是目前我唯一运行成功的。
连接QGC
QGC 可以直接去官网下载安装,它有 Windows 的安装包。模拟器成功运行后,打开 QGC,其实它已经自动连上了。
应该都是默认端口,所以能自动连上。
现在只是把仿真环境配置好了,其实具体怎么用我还不太会,后面开发在说吧,咱们下期见。