AirSim:PX4软件在环仿真
目录
今天被在 WSL2 上配置 PX4 困扰了许久,记录以下近几天解决该问题的过程。
目的
想要在 AirSim 仿真中使用 PX4 作为飞控。由于手边并没有 Pixhawk、树莓派之类的硬件,考虑使用 Windows Subsystem Linux 2 (WSL2) 作为 PX4 的载体。
WSL 安装
- 在 “Windows功能” 中勾选 “适用于 Linux 的 Windows 子系统” 与 “虚拟机平台” 两个选项
- 安装 Linux 发行版
- 在 PowerShell 中输入
wsl --install
即可安装最新的 Ubuntu 发行版 - 按照提示创建账户与密码
- 遇到错误0x800701bc,需更新 WSL 内核至最新版本:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
- 将 WSL 迁移至其他盘防止 C 盘爆炸
- 关闭当前 WSL
wsl --shutdown
- 迁移
wsl --export Ubuntu E:/export.tar
- 将原有的Linux卸载
wsl --unregister Ubuntu
- 将导出的文件放到需要保存的地方,进行导入即可 ` wsl –import Ubuntu E:\export\ E:\export.tar –version 2`
- 关闭当前 WSL
- 在 PowerShell 中输入
AirSim 安装
此前已完成,此处不再赘述。可参考这篇博客
PX4 安装与配置
-
下载 启动 WSL2,新建保存 PX4 的文件夹并进入
mkdir PX4
cd PX4
使用 git 下载git clone https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
- 在 SITL (Software-In-Loop) 模式下构建并启动 PX4 固件:
make px4_sitl_default none_iris
- 记得在构建似乎会显示缺少某个 Python Module,使用 pip 安装后重新执行词条命令即可
-
构建完成后,Linux 命令行窗口应该会显示
INFO [simulator] Waiting for simulator to accpet connection on TPC port 4560
此时已构建完成,进入了运行状态,可以先使用 ctrl+C 退出运行。 - 更改 settings.json
目前,我们的 AirSim 仍在 simple_flight 模式。我们需要更改主机中的
文档/AirSim/settings.json
为以下内容:{ "SettingsVersion": 1.2, "SimMode": "Multirotor", "ClockType": "SteppableClock", "Vehicles": { "PX4": { "VehicleType": "PX4Multirotor", "UseSerial": false, "LockStep": true, "UseTcp": true, "TcpPort": 4560, "ControlIp": "172.30.146.169", "ControlPortLocal": 14540, "ControlPortRemote": 14580, "LocalHostIp": "172.30.144.1", "Sensors":{ "Barometer":{ "SensorType": 1, "Enabled": true, "PressureFactorSigma": 0.0001825 } }, "Parameters": { "NAV_RCL_ACT": 0, "NAV_DLL_ACT": 0, "COM_OBL_ACT": 1, "LPE_LAT": 47.641468, "LPE_LON": -122.140165 } } } }
注意,
"LocalHostIp"
与"ControlIp"
字段分别应为主机和 WSL 的 IP 地址!- 在主机的命令行中输入
ipconfig
,“以太网适配器 vEthernet (WSL)” 中的 “IPV4 地址” 即为主机地址 - 在 Linux 命令行中输入
ip address show
即可查看 WSL 的 IP 地址
- 在主机的命令行中输入
-
设置环境变量 我们需要让 Linux 指导自己在和谁通讯,故在 Linux 命令行中输入以下命令以添加(或改变)环境变量
export PX4_SIM_HOST_ADDR=172.30.144.1
注意,此处的 IP 地址应为主机 IP。 - 更改 Linux 中的
PX4-Autopilot/ROMFS/px4fmu_common/init.d-posix/rcS
文件 更改这个文件之前,我一度出现了 PX4 与 AirSim 无法连接、成功连接后无法使用 Python API 等问题。经过仔细阅读官方文档中的 “PX4 SITL with WSL2”,发现了此处需要更改,原因未知(悲)。如果没有以下内容,则将它们加入到该文件中:# If PX4_SIM_HOST_ADDR environment variable is empty use localhost. if [ -z "${PX4_SIM_HOST_ADDR}" ]; then echo "PX4 SIM HOST: localhost" simulator start -c $simulator_tcp_port else echo "PX4 SIM HOST: $PX4_SIM_HOST_ADDR" simulator start -t $PX4_SIM_HOST_ADDR $simulator_tcp_port fi
- 完成后,启动 sln 文件的调试以进入 UE4 编辑器,并在 Linux 中启动 PX4:
make px4_sitl_defalut none_iris
我们就完成了 PX4 作为飞控的 AirSim 仿真啦!
使用
- 可以在 PX4 端输入命令以控制无人机,如
commander takeoff
可控制无人机起飞,commander land
可控制无人机降落。 - 调用 Python API 的操作与使用 simple_flight 模式下相同,直接运行 Python 脚本即可!