今天被在 WSL2 上配置 PX4 困扰了许久,记录以下近几天解决该问题的过程。

目的

想要在 AirSim 仿真中使用 PX4 作为飞控。由于手边并没有 Pixhawk、树莓派之类的硬件,考虑使用 Windows Subsystem Linux 2 (WSL2) 作为 PX4 的载体。

WSL 安装

  1. 在 “Windows功能” 中勾选 “适用于 Linux 的 Windows 子系统” 与 “虚拟机平台” 两个选项
  2. 安装 Linux 发行版
    1. 在 PowerShell 中输入 wsl --install 即可安装最新的 Ubuntu 发行版
    2. 按照提示创建账户与密码
      • 遇到错误0x800701bc,需更新 WSL 内核至最新版本:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
    3. 将 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`

AirSim 安装

此前已完成,此处不再赘述。可参考这篇博客

PX4 安装与配置

  1. 下载 启动 WSL2,新建保存 PX4 的文件夹并进入 mkdir PX4 cd PX4 使用 git 下载 git clone https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot

  2. 在 SITL (Software-In-Loop) 模式下构建并启动 PX4 固件: make px4_sitl_default none_iris
    • 记得在构建似乎会显示缺少某个 Python Module,使用 pip 安装后重新执行词条命令即可
  3. 构建完成后,Linux 命令行窗口应该会显示 INFO [simulator] Waiting for simulator to accpet connection on TPC port 4560 此时已构建完成,进入了运行状态,可以先使用 ctrl+C 退出运行。

  4. 更改 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 地址
  5. 设置环境变量 我们需要让 Linux 指导自己在和谁通讯,故在 Linux 命令行中输入以下命令以添加(或改变)环境变量 export PX4_SIM_HOST_ADDR=172.30.144.1 注意,此处的 IP 地址应为主机 IP。

  6. 更改 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
    
  7. 完成后,启动 sln 文件的调试以进入 UE4 编辑器,并在 Linux 中启动 PX4:
     make px4_sitl_defalut none_iris
    

    我们就完成了 PX4 作为飞控的 AirSim 仿真啦!

使用

  • 可以在 PX4 端输入命令以控制无人机,如 commander takeoff 可控制无人机起飞,commander land 可控制无人机降落。
  • 调用 Python API 的操作与使用 simple_flight 模式下相同,直接运行 Python 脚本即可!