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

ops/2025/1/11 11:33: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/ops/149151.html

相关文章

Swagger学习⑯——@ApiResponses注解

介绍 ApiResponses 是 Swagger/OpenAPI 注解库中的一个注解,用于在 Java 应用程序中为 API 方法定义多个响应。它是 ApiResponse 注解的容器注解,允许你为一个 API 方法指定多个可能的响应。 基本用法 ApiResponses 通常与 ApiResponse 一起使用&…

青少年编程与数学 02-006 前端开发框架VUE 18课题、逻辑复用

青少年编程与数学 02-006 前端开发框架VUE 18课题、逻辑复用 一、组合式函数什么是“组合式函数”?鼠标跟踪器示例异步状态示例接收响应式状态 约定和最佳实践命名输入参数返回值副作用使用限制 在选项式 API 中使用组合式函数与其他模式的比较和 Mixin 的对比和无渲…

git 转移文件夹

打开终端或命令行界面:首先,确保你的电脑上安装了 Git,并打开终端或命令行界面。 导航到你的仓库目录:使用 cd 命令来切换到包含你想要移动文件夹的仓库的目录。 cd /path/to/your/repository使用 git mv 命令移动文件夹&#x…

[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据

使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据,而不需要先将内表数据复制到相应的工作区,然后再更新回内表中,从而提高性能 针对上述代码进行优化,我们使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数…

【每日学点鸿蒙知识】跳转三方地图、getStringSync性能、键盘避让模式等

1、跳转三方地图导航页 类似于Android 跳转到地图APP 导航页面: // 目标地点的经纬度和名称 double destinationLat 36.547901; double destinationLon 104.258354; String destinationName "目的地名称"; // 构建URI Uri uri Uri.parse("…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux,最初学习时是一脸蒙圈,啥也不会,啥也不懂,做了很多乱七八糟,没有条理的笔记。不知…

易于使用和学习的编程语言Arc(list)入门手册

Arc是一种Lisp方言的编程语言。它是由Paul Graham开发的,旨在简化Lisp的语法和语义,使其更易于使用和学习。Arc的设计目标是提供一种简洁而强大的编程语言,适用于快速开发Web应用程序。它具有动态类型、自动内存管理和强大的元编程能力。Arc还…

赛车微型配件订销管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 赛车微型配件行业通常具有产品多样性、需求不确定性、市场竞争激烈等特点。配件供应商需要根据市场需求及时调整产品结构和库存,同时要把握好供应链管理和销售渠道。传统的赛车微型配件订销管理往往依赖于人工经验和简单的数据分析,效率低下且容易…