目录

PX4开源飞控-开发环境搭建-编译仿真及烧录

PX4开源飞控–开发环境搭建 编译仿真及烧录

目录


前言

主要介绍过PX4开源 的开发环境搭建、编译、仿真及烧录,在仿真环节 启动无人机模拟器 ,通过 外部QGC地面站控制无人机 或通过 外部UDP服务器接收无人机数据

一、PIXHAWK、PX4、APM 简述

1、概念介绍(PIXHAWK、PX4、APM)

https://i-blog.csdnimg.cn/blog_migrate/192a2221ad9a04c130f3d1aa8e442e9c.png

PIXHAWK 是应用较广的 开源飞控硬件平台PX4和APM都是开源飞控软件平台 ,均可以烧写到PIXHAWK这款硬件板上

PX4飞控软件平台 (PX4专为PIXHAWK开发的),它提供了一个虚拟环境,可以用来验证无人机的飞控算法,也可以连接开源硬件PIXHAWK。

PX4地面控制站被称为QGroundControl(简称QGC)PX4与地面站之间的通信 是用 mavlink协议 ,QT可以对地面站进行二次开发

APM飞控软件平台 专为Arduupilot开发的固件,也可以烧写到PIXHAWK上

APM地面控制站被称为Mission Planner(简称MP)

2、PIXHAWK硬件接线调试说明

硬件接口调试文档参考:

https://i-blog.csdnimg.cn/blog_migrate/e0c09fa21137f7af48e22c62b8d643ea.png

https://i-blog.csdnimg.cn/blog_migrate/2172bc0fec7288dc0b3aaf0614b6952b.png

3、PX4开发编译仿真烧录流程

PX4的开发编译环境有Linux、window和MacOS系统这几种,在ubuntu系统下比较高效方便,搭建流程如下:

(1)下载PX4固件源码

(2)下载官方docker容器(集成了开发编译环境)

(3)编译对应仿真环境的固件

(4)编译对应飞控板的固件(Pixhawk飞控板)

4、官方指导文档和源码地址汇总

PX4官方使用者手册

mavlink协议官方指导书

PX4源码网址

原本的 已经更名为

git可下载最新版本源码固件:

git clone https://github.com/PX4/PX4-Autopilot.git --recursive

二、ubuntu下搭建PX4开发编译仿真环境

在ubuntu系统下比较高效方便,为了降低安装和使用过程中系统崩溃的风险,在本地电脑中安装VM虚拟机,虚拟机安装ubuntu 18.04或ubuntu 20.04系统,安装过程比较简单,本文不再赘述。在此,为了方便后期移植和系统维护,建议使用官方提供的docker容器,容器集成了开发编译仿真环境。

1、下载px4源码

#创建一个本地文件夹存储
mkdir px4
cd px4

#先将 PX4 文件夹克隆下来
git clone https://github.com/PX4/PX4-Autopilot.git --recursive

#然后切换到 PX4 文件夹,继续克隆子项目,执行下面指令,如果还是出现失败也没关系,继续执行直到不出现失败提示为止
git submodule update --init --recursive

也可以到这个 github 加速地址去下载: PX4 源码网址

PX4 代码架构:

https://i-blog.csdnimg.cn/blog_migrate/ea56399a877c2d665087106c9a69a843.png

2、下载官方 docker 容器(集成了开发编译环境)

  • ubuntu 系统中安装 docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
  • 拉取官方 docker 镜像
docker pull px4io/px4-dev-ros2-foxy

如果拉取不了,出现网络问题,就添加 docker 镜像加速地址,修改 docker 配置文件:

vi /etc/docker/daemon.json

{
"registry-mirrors": [
"https://mirror.iscas.ac.cn",
"https://docker.1ms.run"
]
}

再重启一下 docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

:上述使用的是 ros2-foxy 的容器,官方还提供了不同容器,如下所示,层层递进,在前一层的基础上进行构建,对应不同的仿真环境,体积也不一样,一般也可选择 px4io/px4-dev-simulation-focal ,这个容器是 px4io/px4-dev-base-focal为基础层构建的,其中加入了模拟仿真所需的环境和工具

- px4io/px4-dev-base-focal

- px4io/px4-dev-nuttx-focal
- px4io/px4-dev-simulation-focal
  - px4io/px4-dev-ros-noetic
    - px4io/px4-dev-ros2-foxy
- px4io/px4-dev-ros2-rolling
- px4io/px4-dev-base-jammy
  - px4io/px4-dev-nuttx-jammy
  • 创建容器
# enable access to xhost from the container
    xhost +

# Run docker

docker run -it --privileged \
-v /home/ubuntu/Downloads/px4/:/home/px4 \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=:0 \
--name=px4_sim \
--net=host \
px4io/px4-dev-ros2-foxy:latest /bin/bash

特别说明:

“-v /home/ubuntu/Downloads/px4:/home/px4” :表示将我 ubuntu 系统的/home/ubuntu/Downloads/px4/ 目录映射到容器 里面的/home/px4/目录,PX4 源码 PX4-Autopilot 这个文件夹,在我 ubuntu 系统的/home/ubuntu/Downloads/px4/下。

“–name=px4_sim” :表示给容器起的某个名字,可任意取。

3、编译固件和仿真((jMAVSim、Gazebo 、AirSim 仿真))

  • 初次编译 px4(使用 jMAVSim 模拟器,较为简易)
#进入容器里面后,cd 进入 px4 源码文件夹
cd /home/px4/PX4-Autopilot

#检查子模块
git submodule update --recursive

#清理构建环境
make distclean

#编译并启动仿真
make px4_sitl jmavsim

编译最后出现错误:

BUILD SUCCESSFUL
Total time: 0 seconds
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Unrecognized option: --add-exports
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

这个错误表明在运行 jMAVSim 时,Java 虚拟机(JVM)无法识别--add-exports选项。这个问题通常 与使用的 Java 版本有关--add-exports是 Java 9 引入的一个新选项,用于配置模块之间的访问权限。如果你使用的 Java 版本低于 9,你将会遇到此错误。

检查 Java 版本, 如果你看到的版本是低于 9(比如 1.8),那么你需要升级 Java 版本:

java -version

升级一下 java 即可:

apt-get update
apt-get install -y openjdk-11-jdk

完成 Java 版本更新后,尝试再次编译并运行 jMAVSim 仿真:

#设置飞行速度
export PX4_SIM_SPEED_FACTOR=10

#编译
make px4_sitl jmavsim

注:也可以编译其它模拟器的仿真环境,如 Gazebo, Gazebo Classic 和 AirSim,(Gazebo 取代了旧的 模拟器)

#例如 Gazebo:
make px4_sitl gazebo

#例如 Gazebo Classic:
make px4_sitl gazebo-classic
  • 启动仿真模拟器:

编译成功后系统将自动打开 jMAVSim 模拟器,这时无人机仿真环境就出现了。

https://i-blog.csdnimg.cn/blog_migrate/983ec38463c33aa326b3cedee922ddff.png

输入起飞指令:

pxh> commander takeoff

https://i-blog.csdnimg.cn/blog_migrate/50bf04c4117c534384f0d4583ba38ae2.png

  • 启动地面站

当然,使用地面控制台进行模拟飞行更接近真实操作,下载地面站模拟器(QGroundControl),不同系统对应不同安装包,软件下载地址如下:

https://i-blog.csdnimg.cn/blog_migrate/d562e7bcec52d8513cae86eb723fa773.png

我选择在 Windows 系统安装 QGC,因此下载 QGroundControl-installer.exe,双击即可安装,就可以用 QGroundControl 模拟器来控制虚拟无人机了,如起飞、设置高度、航点等。

地面站一直是处于断开连接状态:

https://i-blog.csdnimg.cn/blog_migrate/09c934836f8cbcae57efc3e7ade0d827.png

  • 启动仿真模拟器的 mavlink,在局域网和 QGC 通信

PX4 内部 UDP 端口说明:

地面站(监听本地 UDP 端口 14550),接收 PX4 数据

外部开发人员 API 监听 PX4 的 UDP 端口:14540。对于多个目标模拟,PX4 按顺序为 14540 到 14549 的每个实例分配一个单独的远程端口(其他实例都使用端口 14549)。

https://i-blog.csdnimg.cn/blog_migrate/7818a61d04705439c271fab851017e72.png

输入:

mavlink start -p -u 14556 -o 14550

-u 表示的是绑定的本地端口,-o 表示的是远程连接对方端口

也可以使用-t 命令和特定的 IP 通信. :mavlink start -p -u 14556 -t 192.168.x.x -o 14550

https://i-blog.csdnimg.cn/blog_migrate/4782bb940c5646349b436fe104693fc6.png

已经和远端的模拟器连接上了

https://i-blog.csdnimg.cn/blog_migrate/60284b79d02c7cb9fc9723b87ff698c1.png

  • 启动仿真模拟器的 mavlink,在局域网和自己的 UDP 服务通信

在上面的步骤中,在终端窗口启动了一个 mavlink 和 QGC 通信,那么如何使自己的 UDP 服务像 QGC 一样接收 PX4 的数据呢?操作如下:

https://i-blog.csdnimg.cn/blog_migrate/d8aceff4984b3bda101473c1c204f638.png

先停止之前的所有通信:

mavlink stop-all

启动仿真模拟器的 mavlink 和 QGC 通信: (我的 QGC 安装在本地电脑上)

mavlink start -p -u 14556 -t 127.0.0.1 -o 14550

启动仿真模拟器的 mavlink 和 UDP 服务通信,端口不能和 QGC 通信的端口冲突:

UDP 服务自己手写了一个, ip 是 10.10.151.211,端口 14540

mavlink start -p -u 14557 -t 10.10.151.211 -o 14540

可以看到 udp 服务接收到了一堆数据,这些就是 mavlink 协议数据了,mavlink 协议参照官方指导书:

https://i-blog.csdnimg.cn/blog_migrate/6e59723e3cf48f8b8bde3ffbb3c7664c.png

4、编译飞控板固件(Pixhawk 飞控板)

  • 下载飞控板编译环境的 docker 容器

为 Pixhawk 飞控板编译固件和仿真环境固件不一样,需要下载另外 docker 容器:

docker pull px4io/px4-dev-nuttx-focal

创建并启动进入 docker 容器:

docker run -it --privileged \
-v /home/ubuntu/Downloads/px4/:/home/px4/ \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-v /dev/:/dev/ \
-e DISPLAY=:0 \
--name=px4_nuttx \
--net=host \
px4io/px4-dev-nuttx-focal:latest /bin/bash

特别说明:

“-v /home/ubuntu/Downloads/px4:/home/px4” :表示将我 ubuntu 系统的/home/ubuntu/Downloads/px4/ 目录映射到容器 里面的/home/px4/目录,PX4 源码 PX4-Autopilot 这个文件夹,在我 ubuntu 系统的/home/ubuntu/Downloads/px4/下。

“–name=px4_nuttx” :表示给容器起的某个名字,可任意取。

容器可能缺少一个库,下载一下:

pip install pyserial
  • 编译

https://i-blog.csdnimg.cn/blog_migrate/b50502cb78e99d2815506fd2a0ed966f.png

Pixhawk 2.4.8 (1M) :  px4_fmu-v2_default

Pixhawk 2.4.8 (2M) :  px4_fmu-v3_default

不同版本的开发板对应指令如上,我是为 Pixhawk 2.4.8 (2M)编译的,因此指令如下:

cd PX4-Autopilot
make px4_fmu-v3_default

也可以通过指令来查看对应开发板的指令:

make list_config_targets

编译完成后会在 build/nuttx_px4fmu-v3_default/ 目录下生成一个叫 px4fmu-v3_default.px4 的文件,这个文件就是我们需要烧写到 Pixhawk 中的固件程序。

注:如果是 2M 闪存的 Pixhawk 2.4.8,一定要烧录 V3 版本的,如果烧录不了,参考:

  • 将固件烧录到飞控板 (必须要通过有线连接的方式进行固件的烧录)

PX4 固件代码的烧录方式 1(ubuntu 终端窗口命令行烧录):

将 Pixhaw 使用 USB 线接入到计算机上,在 ubuntu 系统的/dev/目录下会有一个 /dev/ttyACM0 的设备文件,即是 Pixhawk 飞控,使用命令查看:ls -l /dev/ACM

通过终端,使用不同命令针对不同的硬件型号进行烧录,例如:

make px4_fmu-v3_default upload

PX4 固件代码的烧录方式 2 (QGC 地面站升级):

通过 USB 连接电脑启动 QGC 地面站中的自定义固件类型进行烧录,

启动 QGC 地面站,在固件位置 → 重新插拔 USB→ 选择高级设置 → 自定义固件文件 → 找到 PX4-Autopilot 中的 build 文件夹中的 .px4 文件即可。