ghj88 发表于 2022-10-24 05:49:59

开源飞控PX4小结

基础知识

开源代码下载

git clone https://github.com/PX4/PX4-Autopilot.git --recursive开源代码的底层是嵌入式实时操作系统是Nuttx,学习Nuttx有难度,B站上有课程视频。
官方网站:
B站视频:
编译烧录

编译:make px4_fmu-v5_default
烧录:make px4_fmu-v5_default upload编译详解

因为PX4程序十分依赖一下外模块,因为必须要git完整;
ifeq ($(wildcard .git),)
    $(error YOU HAVE TO USE GIT TO DOWNLOAD THIS REPOSITORY. ABORTING.)
endif默认情况下,编译是软仿真程序。
all: px4_sitl_default不是很懂
define make_list
   $(shell [ -f .github/workflows/compile_${1}.yml ] && cat .github/workflows/compile_${1}.yml | sed -E 's|[[:space:]]+(.*),|check_\1|g' | grep check_${2})
endef第一个参数是编译目标类型,第二个不清楚
FIRST_ARG := $(firstword $(MAKECMDGOALS))
ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))Ninja模块,一种加速编译的google开发的构建工具
NINJA_BIN := ninja
ifndef NO_NINJA_BUILD
        NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null)

        ifndef NINJA_BUILD
                NINJA_BIN := ninja-build
                NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null)
        endif
endif

ifdef NINJA_BUILD
        PX4_CMAKE_GENERATOR := Ninja
        PX4_MAKE := $(NINJA_BIN)

        ifdef VERBOSE
                PX4_MAKE_ARGS := -v
        else
                PX4_MAKE_ARGS :=
        endif

        # Only override ninja default if -j is set.
        ifneq ($(j),)
                PX4_MAKE_ARGS := $(PX4_MAKE_ARGS) -j$(j)
        endif
else
        ifdef SYSTEMROOT
                # Windows
                PX4_CMAKE_GENERATOR := "MSYS\ Makefiles"
        else
                PX4_CMAKE_GENERATOR := "Unix\ Makefiles"
        endif

        # For non-ninja builds we default to -j4
        j := $(or $(j),4)
        PX4_MAKE = $(MAKE)
        PX4_MAKE_ARGS = -j$(j) --no-print-directory
endif其他参数传给cmake模块
# additional config parameters passed to cmake
ifdef EXTERNAL_MODULES_LOCATION
        CMAKE_ARGS += -DEXTERNAL_MODULES_LOCATION:STRING=$(EXTERNAL_MODULES_LOCATION)
endif

ifdef PX4_CMAKE_BUILD_TYPE
        CMAKE_ARGS += -DCMAKE_BUILD_TYPE=${PX4_CMAKE_BUILD_TYPE}
else

        # Address Sanitizer
        ifdef PX4_ASAN
                CMAKE_ARGS += -DCMAKE_BUILD_TYPE=AddressSanitizer
        endif

        # Memory Sanitizer
        ifdef PX4_MSAN
                CMAKE_ARGS += -DCMAKE_BUILD_TYPE=MemorySanitizer
        endif

        # Thread Sanitizer
        ifdef PX4_TSAN
                CMAKE_ARGS += -DCMAKE_BUILD_TYPE=ThreadSanitizer
        endif

        # Undefined Behavior Sanitizer
        ifdef PX4_UBSAN
                CMAKE_ARGS += -DCMAKE_BUILD_TYPE=UndefinedBehaviorSanitizer
        endif

endif地面站QGC

用户使用文档:
用户开发文档:
源码:
QGC的设计哲学:
- 用户接口使用QT qml来实现,qml可以实现在不同硬件平台上的加速,并且很好匹配各种分辨率的屏幕。
源码下载:
git clone --recursive -j8 https://github.com/mavlink/qgroundcontrol.git
git submodule update --recursiveMAVLINK协议

MAVLINK: micro air vehicle communication protocol 一种用于小型无人载具的通信协议。
MAVLINK 遵循了一种混合发布-订阅机制和点对点机制的设计方案。
协议格式:



MAVLINK 1.0 2.0的格式

MAVLink的C库代码:
Github源码:
添加进项目:#include < ./common/mavlink.h>
mavlink_helpers.h 中,mavlink_parse_char(...) 用来解析mavlink数据
MAVLINK_HELPER uint8_t mavlink_parse_char(uint8_t chan, uint8_t c, mavlink_message_t* r_message, mavlink_status_t* r_mavlink_status)仿真模拟器


[*]jMAVSim
[*]Gazebo
Gazebo是一个强大的用于自主机器人的3D仿真环境。
.sdf 文件描述物体的物理参数
.world 描述物理世界参数
一般启动有三个程序:一个是gazebo、一个是gzserver,一个是gzclient
目前支持的机器有:

[*]Quad( Iris , Solo, Hex(Typhoon H480) )
[*]Generic quad delta VTOL
[*]Tailsitter
[*]Plane
[*]Rover
[*]Submarine/UUV
使用说明:
Headless Mode:不打开gazebo gui界面,更轻量级运行仿真。
HEADLESS=1 make px4_sitl gazebo_plane仿真速度:通过设置参数PX4_SIM_SPEED_FACTOR
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl_default gazebo加载一个Gazebo World
Gazebo支持的world有:sitl_gazebo/worlds,默认使用empty.world。可以通过参数PX4_SITL_WORLD设置。
基于Gazebo,ROS的多无人机仿真
第一步:
cd Firmware_clone
git submodule update --init --recursive
DONT_RUN=1 make px4_sitl_default gazebo第二步:
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/sitl_gazebo第三步:
roslaunch px4 multi_uav_mavros_sitl.launch其中,mavlink_udp_port:定义为gazebo和px4 结点通信的udp端口
仿真原理

所有的仿真器都使用MAVLINK API;



PX4的仿真原理示意图

SITL仿真原理图:



SITL原理示意图

HITL仿真原理图:



HITL仿真原理图

硬在环仿真详细描述

参考链接:
硬在环仿真的好处:检测飞控代码在真实硬件中运行的状态。但是,硬在环仿真兼容的机型有限。
根据上面的原理图,过程简化如下:PX4-HITL ----> Gazebo/jMAVSim Simulator ----> API / Offboard
实际流程:
1. 使用QGC配置PX4
2. Gazebo设置
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
gazebo Tools/sitl_gazebo/worlds/hitl_iris.world飞控硬件

Pixhawk(飞控硬件)---- PX4(自驾仪软件)



Pixhawk示意图

注意:APM(飞控硬件,已经被淘汰了)---- Ardupilot(自驾仪软件)



APM示意图

高级知识

高级控制接口MAVROS

MAVROS:ROS中的MAVLINK的扩展通信节点
官方文档:http://wiki.ros.org/mavros
链接:
概述:MAVROS包提供了基于MAVLINK协议的通信驱动,此外也提供了针对于QGC的UDP MAVLINK bridge.
MAVROS包提供的内容
节点:mavros_node
订阅的话题:mavlink/to (mavros_msgs/Mavlink)
发布的话题:mavlink/from (mavros_msgs/Mavlink)
diagnostics (diagnostic_msgs/DiagnosticStatus)节点:gcs_bridge
订阅的话题:mavlink/from (mavros_msgs/Mavlink)
发布的话题:mavlink/to (mavros_msgs/Mavlink)节点:event_launcher
订阅的话题:mavros/state(mavros_msgs/State)Connection URL:通过URL来建议连接。
URL类型有以下几种:
Serial: /path/to/serial/device[:baudrate]
Serial: serial:///path/to/serial/device[:baudrate][/?ids=sysid,compid]
Serial with hardware flow control: serial-hwfc:///path/to/serial/device[:baudrate][?ids=sysid,compid]
UDP: udp://[:port]@[:port][/?ids=sysid,compid]
UDP Broadcast: udp-b://[:port]@[:port][/?ids=sysid,compid]
TCP client: tcp://[:port][/?ids=sysid,compid]
TCP server: tcp-l://[:port][/?ids=sysid,compid]
sysid
发送该包的系统ID。能够区分在同一网络中不同的MAV。
compid
发送该包的组件ID,能够区分同一系统的不同发送设备。如:IMU和AutoPilotPX4 + ROS + MAVROS + Gazebo仿真
官方教程:ROS with MAVROS Installation Guide
其中,mavros_msgs包包含了所有的消息格式。
高级控制接口MAVSDK

官网:
源码:
介绍:MAVSDK是支持接入MAVLINK系统的各种编程语言的开发库,提供一些简单的接口来管理MAVLINK协议的机器。
为兼容多种语言,使用C++语言实现了gRPC服务器,其他语言跟该服务器连接来使用。
MAVSDK C++包括:
- core library 实现基础MAVLINK通信;
- plugin libraries 实现一些特殊功能;
- mavsdk_server 兼容其他语言;
C++版本的快速入门:
(1)ubuntu安装
wget https://github.com/mavlink/MAVSDK/releases/download/v0.37.0/mavsdk_0.37.0_ubuntu20.04_amd64.deb
sudo dpkg -i mavsdk_0.37.0_ubuntu20.04_amd64.deb(2)API介绍
Mavsdk
System
Info
Telemetry
Action
Mission
Offboard
Geofence
Gimbal
FollowMe
Calibration
LogFiles(3)SDK使用说明
- 对象管理
Mavsdk是主要的对象,主要是发现和连接机器。
其他plugins插件提供访问机器信息和控制运动。
- 回调函数
回调处理的内容不能太多。
- 限制



接口使用示意图

(4)基于CMake生成与使用
使用了Cmake编译工具链:
cmake -Bbuild -H.
cmake --build build -j8CMAKE_PREFIX_PATH 指明mavsdk安装的目录



参数详解

MAVSDK生成:
第1步:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Bbuild/default -H.
cmake --build build/default --target install第2步:
cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -H.
cmake --build build/default -j8日志分析

Flight Reporting
讲怎么下载日志的相关问题,
PX4的日志记录了飞机状态(aircraft state)和传感器数据(sensor data)。
日志下载:使用QGC----Analyze Tools----Log Download



日志下载示意图

日志分析:
- 将日志文件上传到 Flight Review 工具网站上:https://logs.px4.io/
Flight Review的分析工具能够做到:能够排除常见问题,过度震动(excessive vibration)、PID调节不良、控制器饱和、飞机不平衡和GPS噪声等。
tips:
如果日志中断了记录,最有可能的两个问题是电源故障和操作系统故障。基于STM32的自驾仪,可以查阅SD卡中的fault_xxx.log文件。
日志分析工具:
Flight Review
pyulog
pyFlightAnalysis
FlightPlot
PX4Tools
MAVGCL
PlotJuggler
Data Comets日志模式配置:



日志模式配置

ulog格式:
ulog文件格式包括三个部分:
- Header
- Definitions
- Dataulog是日志文件系统的一种通用格式,一些实现案例如下:


日志研究笔记:
临时总结:2021年7月26日10点34分
- 日志记录方法:SD卡或MAVLINK消息流发出来;
- 日志设置模式:设置SD卡参数;
- 日志下载方法:QGC工具和读SD卡,使用读日志工具;
- 日志格式:ulog格式

日志实操总结:2021年7月27日16点01分
- SD卡文件系统选择,FAT32格式即可。
- 飞控系统启动后,会自动在根目录创建相应文件夹,并写入相应日志文件。
- PX4固件默认日志记录时间是从ARM到DISARM,可通过修改SDlOG_MODE参数为boot到shutdown。
- 可通过QGC下载日志,或从SD卡读日志。

pyulog的使用
https://github.com/PX4/pyulog
主要命令:ulog_info ulog_messages
页: [1]
查看完整版本: 开源飞控PX4小结