【PX4-AutoPilot教程-仿真环境架构】梳理PX4GazeboMAVLinkMAVROSROSROS2之间的关系

news2024/10/2 10:44:01

梳理PX4&Gazebo&MAVLink&MAVROS&ROS&ROS2之间的关系

    • PX4与仿真器
      • PX4支持的仿真器
      • PX4与除Gazebo之外的仿真器的连接
      • PX4与Gazebo仿真器的连接
    • PX4默认的MAVLink UDP端口
    • PX4 SITL软件在环仿真的架构
    • Gazebo仿真
    • PX4启动仿真的launch文件
    • ROS与PX4的关系

PX4与仿真器

在仿真器中可以让PX4代码来控制无人机飞行。仿真是在尝试现实世界中飞行之前测试PX4代码的一种快速、简单且安全的方法。当你还没有可以试验的飞行器时,这也是一个开始使用PX4代码飞行的好方法。

PX4支持的仿真器

仿真器描述支持的载具
Gazebo强烈建议使用此仿真器。Gazebo取代了Gazebo Classic,具有更先进的渲染、物理和传感器模型。这是Ubuntu Linux 22.04提供的Gazebo的唯一版本。它具有功能强大的3D仿真环境,特别适用于测试对象避障和计算机视觉。支持多无人机仿真,通常伴随 ROS使用。四旋翼、标准垂直起降固定翼、尾座事垂直起降固定翼、固定翼、四驱车、水下航行器
Gazebo Classic强烈建议使用此仿真器。一个强大的3D模拟环境,特别适合测试物体回避和计算机视觉。支持多无人机仿真,通常伴随ROS一起使用。四旋翼、标准垂直起降固定翼、尾座事垂直起降固定翼、固定翼、四驱车、水下航行器
jMAVSim一个简单的多旋翼仿真器,允许您在模拟的世界中控制无人机飞行。它易于设置,可用于测试您的车辆是否可以起飞、飞行、着陆,并对各种故障条件(如GPS故障)做出适当响应。支持多无人机仿真。四旋翼
FlightGear提供物理和视觉逼真模拟的仿真器。特别是,它可以模拟许多天气条件,包括雷暴、雪、雨和冰雹,还可以模拟热流和不同类型的大气流。支持多无人机仿真。四旋翼、固定翼、四驱车
JSBSim提供高级飞行动力学模型的仿真器。这可以用于基于风洞数据对真实的飞行动力学进行建模。四旋翼、固定翼
AirSim提供物理和视觉逼真模拟的跨平台仿真器。这个仿真器是资源密集型的,需要一台比这里描述的其他仿真器功能强大得多的计算机。四旋翼、固定翼
Simulation-In-Hardware(SIH)硬件在环仿真HITL的一种替代方案,直接在硬件自动驾驶仪上提供硬实时仿真。该仿真器在C++中作为PX4模块直接在固件代码中实现四旋翼、固定翼、尾座事垂直起降固定翼

PX4与除Gazebo之外的仿真器的连接

除了Gazebo之外的所有仿真器都使用仿真器的MAVLink API接口与PX4通信。此API接口定义了一组MAVLink消息,这些消息将来自模拟世界的传感器数据提供给PX4,并返回将应用于模拟无人机的飞行代码中的电机和执行器的值。下图显示了PX4与仿真器之间的消息流。

在这里插入图片描述

PX4的SITL软件在环仿真时,使用SimulatorMavlink.cpp处理这些消息。

代码位置:Firmware/src/modules/simulation/simulator_mavlink/SimulatorMavlink.cpp

PX4的HITL硬件在环仿真时,使用mavlink_receiver.cpp处理这些消息,将来自模拟器的传感器数据写入PX4 uORB话题。所有的电机和执行器都被禁用,但其他的应用程序(姿态估计、姿态控制等)正常运行。

代码位置:Firmware/src/modules/mavlink/mavlink_receiver.cpp

消息流的具体信息在下表中。

消息名称传输方向描述
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLED使用仿真时的模式标志。所有电机和执行器都被禁止,但其他的应用程序(姿态估计、姿态控制等)正常运行。
HIL_ACTUATOR_CONTROLSPX4到仿真器PX4至电机、执行器的控制输出。
HIL_SENSOR仿真器到PX4NED坐标系下模拟IMU传感器数据,单位为国际单位制。
HIL_GPS仿真器到PX4模拟的GPS数据。
HIL_OPTICAL_FLOW仿真器到PX4模拟的光流传感器数据。
HIL_STATE_QUATERNION仿真器到PX4包含无人机在仿真环境中的位置、姿态、速度等。可以将其记录下来,并与PX4的估计值进行比较,以进行分析和调试(例如,测试估计器对有传感器噪声的输入的工作情况)。
HIL_RC_INPUTS_RAW仿真器到PX4接收到的RC通道的数据。

PX4与Gazebo仿真器的连接

PX4与Gazebo仿真器的连接直接使用Gazebo API接口,不需要使用MAVlink API接口。

PX4默认的MAVLink UDP端口

默认情况下,PX4使用固定的UDP端口与地面站(如QGroundControl)、机载电脑(如MAVSDK、MAVROS)和仿真器(如Gazebo)进行MAVLink通信。

PX4的UDP端口14550用于与地面站进行通信。地面站侦听此端口上的连接,QGroundControl默认侦听此端口。

PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。Offboard模式板外电脑应侦听此端口上的连接。

仿真器的本地TCP端口4560用于与PX4通信。仿真器监听这个端口,PX4启动到这个端口的TCP连接。

这些端口的定义都是在PX4系统启动文件中定义的。

System Startup

PX4 SITL软件在环仿真的架构

下图显示了使用MAVLink API接口的仿真器的典型SITL软件在环仿真的架构。

在这里插入图片描述

系统的不同部分通过UDP连接,可以在同一台计算机或同一局域网上的另一台计算机上运行。

PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。

PX4的UDP端口14550用于与地面站进行通信。

PX4的TCP端口4560用于与仿真器的通信。

当使用make px4_sitl gazebomake px4_sitl gazebo-classicmake px4_sitl jmavsim等命令运行SITL软件在环仿真时,PX4和仿真器将在同一台计算机上启动,并且将自动配置上述端口。

可以配置其他MAVLink UDP连接,也可以在构建配置和初始化文件中修改模拟环境。

Gazebo仿真

PX4固件中有一个文件夹Firmware/Tools/sitl_gazebo存放Gazebo仿真相关文件。

Firmware/Tools/sitl_gazebo/src文件夹,存放核心插件。比如GPS、IMU的数据如何产生就是这里的代码负责的。Gazebo自身也会提供一些默认插件,或者第三方也会提供插件,如果要新增一个传感器,可以在这里找到相应的插件。

Firmware/Tools/sitl_gazebo/models文件夹,存放各种Gazebo模型文件。

Firmware/Tools/sitl_gazebo/worlds文件夹,存放各种Gazebo世界环境文件。

PX4启动仿真的launch文件

PX4固件用于启动仿真的launch文件在Firmware/launch文件夹中。

  • px4.launch:只加载PX4 SITL软件在环仿真的节点。

  • posix_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。

  • mavros_posix_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。启动MAVROS通信。相当于新建一个终端运行命令roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

  • single_vehicle_spawn.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。

  • multi_uav_mavros_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。模型的生成方式调用了single_vehicle_spawn.launch中的格式,并传入不同的mavlink_udp_port和mavlink_tcp_port用于不同飞机mavlink连接。每架飞机的MAVROS传入不同的fcu_url和tgt_system参数,便于启动不同的MAVROS。

make px4_sitl gazeboroslaunch px4 posix_sitl.launch基本是等效的。

观察posix_sitl.launch文件中的内容,可以看到调用Gazebo模型文件的代码<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/>,调用Gazebo世界环境文件的代码<arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>

<?xml version="1.0"?>
<launch>
    <!-- Posix SITL environment launch script -->
    <!-- launches PX4 SITL, Gazebo environment, and spawns vehicle -->
    <!-- vehicle pose -->
    <arg name="x" default="0"/>
    <arg name="y" default="0"/>
    <arg name="z" default="0"/>
    <arg name="R" default="0"/>
    <arg name="P" default="0"/>
    <arg name="Y" default="0"/>
    <!-- vehicle model and world -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="iris"/>
    <arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>
    <arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/>
    <env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
    <env name="PX4_ESTIMATOR" value="$(arg est)" />

    <!-- gazebo configs -->
    <arg name="gui" default="true"/>
    <arg name="debug" default="false"/>
    <arg name="verbose" default="false"/>
    <arg name="paused" default="false"/>
    <arg name="respawn_gazebo" default="false"/>
    <!-- PX4 configs -->
    <arg name="interactive" default="true"/>
    <!-- PX4 SITL -->
    <arg unless="$(arg interactive)" name="px4_command_arg1" value="-d"/>
    <arg     if="$(arg interactive)" name="px4_command_arg1" value=""/>
    <node name="sitl" pkg="px4" type="px4" output="screen"
        args="$(find px4)/build/px4_sitl_default/etc -s etc/init.d-posix/rcS $(arg px4_command_arg1)" required="true"/>

    <!-- Gazebo sim -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="gui" value="$(arg gui)"/>
        <arg name="world_name" value="$(arg world)"/>
        <arg name="debug" value="$(arg debug)"/>
        <arg name="verbose" value="$(arg verbose)"/>
        <arg name="paused" value="$(arg paused)"/>
        <arg name="respawn_gazebo" value="$(arg respawn_gazebo)"/>
    </include>
    <!-- gazebo model -->
    <node name="$(anon vehicle_spawn)" pkg="gazebo_ros" type="spawn_model" output="screen" args="-sdf -file $(arg sdf) -model $(arg vehicle) -x $(arg x) -y $(arg y) -z $(arg z) -R $(arg R) -P $(arg P) -Y $(arg Y)"/>
</launch>

ROS与PX4的关系

ROS是一个通用机器人库,可与PX4一起用于无人机应用程序开发。ROS得益于开发人员解决常见机器人问题的活跃生态系统,以及对其他为Linux编写的软件库的访问。例如,它已被用作PX4计算机视觉解决方案的一部分,包括避障和碰撞预防。

PX4支持ROS2和ROS1。

对于ROS2:PX4和ROS2通过PX4-ROS2桥接工具(PX4 v1.13之前是microRTPS,PX4 v1.13之后是micro XRCE-DDS)进行通信,该接口在PX4 uORB话题和ROS2 DDS话题/类型之间提供直接桥接。这有效地允许实时从ROS2工作流和节点直接访问PX4内部。

对于ROS1:PX4和ROS1通过MAVLink进行通信,使用MAVROS包将ROS主题桥接到MAVLink。

在这里插入图片描述

使用ROS1时,PX4需要先接受MAVLink消息,内部应用程序再根据消息内容更改PX4 uORB话题中的参数值,但ROS2通过PX4-ROS2桥接工具可以直接更改PX4 uORB话题中的参数值,省略了一个步骤,所以是官方推荐的。


参考资料:

PX4官方文档-仿真

PX4-Gazebo仿真学习笔记

PX4在GAZEBO仿真中加载iris模型问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 0938.二叉搜索树的范围和:深度优先搜索(可中序遍历)

【LetMeFly】938.二叉搜索树的范围和&#xff1a;深度优先搜索&#xff08;可中序遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。…

《武汉市贯彻实施细则》解读房地产经纪活动时效性

时效性【当前有效】 为进一步规范我市房地产经纪活动&#xff0c;保护房地产交易和经纪活动当事人的合法权益&#xff0c;促进行业健康发展&#xff0c;制定《武汉市房地产经纪实施细则》&#xff08;以下简称《实施细则》&#xff09;。 &#xff08;以下简称《实施细则》&am…

《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)

文章目录 5.1 理解 Docker Compose5.1.1 重点基础知识5.1.2 重点案例&#xff1a;部署 Flask 应用和 Redis5.1.3 拓展案例 1&#xff1a;多服务协作5.1.4 拓展案例 2&#xff1a;使用自定义网络 5.2 编排多容器应用5.2.1 重点基础知识5.2.2 重点案例&#xff1a;部署 Flask 应用…

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

用html编写的简易新闻页面

用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

内网穿透的应用-如何在群晖配置WebDAV实现云同步Zotero科研文献与笔记【内网穿透】

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…

linux下执行文件包含^M,将window文件格式内容转为linux格式

查看文件内容 cat -v jvm_options 报错信息 ./bin/install-plugin.sh: /bigdata/opt/s/seatunnelsgg/apache-seatunnel-2.3.4/mvnw: /bin/sh^M: bad interpreter: No such file or directory install connector : connector-selectdb-cloud安装工具 yum install -y dos2uni…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l)&#xff0c;头文件搜索路径&#xff0c;库文件搜索路径&#xff0c;连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前&#xff0c;我们首先来…

YOLOv9中的RepNCSPELAN4结构!

RepNCSPELAN4结构出炉啦&#xff0c;收藏起来写论文用&#xff01; 1.代码&#xff1a; 代码路径&#xff1a;yolov9-main->models->common.py&#xff0c;代码如下&#xff1a; class RepNCSPELAN4(nn.Module):# csp-elandef __init__(self, c1, c2, c3, c4, c51): # …

哪些行业适合做小程序?零售电商、餐饮娱乐、旅游酒店、教育生活、医疗保健、金融社交、体育健身、房产汽车、企管等,你的行业在其中么?

引言 在当今数字化时代&#xff0c;小程序成为了各行各业快速发展的数字工具之一。它的轻便、灵活的特性使得小程序在多个行业中找到了广泛的应用。本文将探讨哪些行业适合开发小程序&#xff0c;并介绍各行业中小程序的具体应用。 一、零售和电商 在当今数字化的商业环境中&…

聊聊 Go 边界检查消除

前言 在这篇文章中碰巧看到了Go边界检查消除相关的讨论. 我也借此简单聊聊. 有这样一段代码, 非常简单, 就是一段求向量点积的程序: func sum(a, b []int) int {if len(a) ! len(b) {panic("must be same len")}ret : 0for i : 0; i < len(a); i {ret a[i] * …

tab 切换页面

<template><divclass"syncData"v-loading"fullscreenLoading"element-loading-spinner"el-icon-loading"element-loading-background"rgba(0, 0, 0, 0.8)"element-loading-text"拼命加载中"><el-tabsv-model…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

C/C++有序数组中插入元素

一、不利用指针 代码&#xff1a; int i; void insert(int ,int , int ); int main() {int a[100];int n, m;cout<<"输入数组元素个数\n";cin >> n;cout << "输入数组元素\n";for (i 0; i < n; i) {cin >> a[i];}cout <&…

C语言里面的内存函数

1.memcpy函数 &#xff08;1&#xff09;函数的模拟实现&#xff0c;这个函数的作用就是把arr1拷贝到arr2里面&#xff0c;单位是字节&#xff0c;20字节就是5整 数&#xff0c;所以输出的就是1234500000&#xff1b; &#xff08;2&#xff09;之所以强制类型转换成为char*是…

高德地图与相机

高德地图与相机 1. 演示效果 2. 实现代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>高…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week04 (完结)

Week 04 of Advanced Learning Algorithms 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learning…

学习vue3 第一节

1、介绍vue以及vue3 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&…