在Windows环境下搭建无人机模拟器

devtools/2025/1/11 17:24:12/

最近要开发无人机地面站,但是没有无人机,开发无人机对我来说也是大姑娘坐花轿——头一回。我们要用 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 作为地面站。

  • SITL

    全称 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 就跟 printecho 一样,用来向控制台打印内容。我们可以看到一共有7个步骤,他会帮我们:

  1. 下载 MAVProxy
  2. 下载 Cygwin
  3. 下载 ARM GCC 编译器
  4. 安装 Cygwin
  5. 下载需要的 Python 库
  6. 安装 ARM GCC 编译器
  7. 安装 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个: pexpectempyfuture 。这里直接看错误提示跟着把缺少的包装上就可以了,因为我不确定是不是大家都是缺这3个库,所以也不推荐大家在这里先把这3个库装一遍。
在这里插入图片描述
在这里插入图片描述
pexpectfuture 都是用 pip3 install 直接安装就行。

在这里插入图片描述
empy 根据提示使用 python -m pip install empy=3.3.4 安装即可。

如果你的系统上安装了多个 Python 版本,还要注意下 pippip3 的区别,我们要用 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,其实它已经自动连上了。

在这里插入图片描述

应该都是默认端口,所以能自动连上。


现在只是把仿真环境配置好了,其实具体怎么用我还不太会,后面开发在说吧,咱们下期见。


http://www.ppmy.cn/devtools/149663.html

相关文章

2025域名出售交易平台PHP源码

源码介绍 2025域名出售交易平台PHP源码,搭建即可正常使用,后台功能测试正常,前台测试正常,无需到处找教程或修复,教程一次性到位 搭建教程 PHP必须是5.6的 导入数据库 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&am…

eslint.config.js和.eslintrc.js有什么区别

eslint.config.js 和 .eslintrc.js 的主要区别在于它们所对应的 ESLint 版本和配置方法: 1. .eslintrc.js: 这是 ESLint v8 及更早版本使用的配置文件格式。 它使用层级式的配置系统。 现在被称为"旧版"配置格式 。 2. eslint.config.js&am…

【Spring】注入方式

介绍 在Spring框架中,依赖注入(Dependency Injection, DI)是实现控制反转(Inversion of Control, IoC)的核心机制。 除了通过XML配置的注入方式(已逐渐被淘汰),Spring还支持多种基…

基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

ChatGPT如何赋能办公

课程背景: ChatGPT近来非常火爆,但多数课程偏重于理论,我们本次讲座将以亲身实践为例,分享如何快速赋能办公,并立刻提升生产力。 课程梗概: 本课程旨在探究ChatGPT在办公中的应用。通过案例分析、课堂讨…

[研发效率]什么是软件工程生产力

软件工程生产力是指开发团队在单位时间内能够高效、高质量地完成软件开发任务的能力。提高软件工程生产力不仅有助于缩短项目周期,还能提升软件的质量和可靠性,从而为组织带来更大的商业价值。 提高软件工程生产力的一些关键策略和技术,具体如…

备考蓝桥杯:顺序表详解(静态顺序表,vector用法)

目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表,我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…

【python基础】python 日期格式数据常见操作

在 Python 中,处理日期和时间格式的数据通常依赖于 datetime 模块。这个模块提供了多种方法来解析、操作和格式化日期和时间。以下是一些常见的操作示例,包括日期和时间的解析、格式化、比较、加减等。 1. 导入 datetime 模块 import datetime2. 获取当…