Prometheus-自主无人机开源项目

提示

Prometheus使用手册为Prometheus-v2版本,我们推荐大家使用Prometheus-v2,并且Prometheus-v1已不再维护,如需使用Prometheus-v1请前往 Prometheus仿真环境配置:Ubuntu 了解相关内容

Prometheus简介

Prometheus.png

Prometheus是希腊神话中最具智慧的神明之一,希望本项目能为无人机研发带来无限的智慧与光明。

Prometheus是一套开源的自主无人机软件系统平台,为无人机的智能与自主飞行提供全套解决方案。本项目基于PX4开源飞控固件ROS机器人操作系统,旨在为无人机开发者配套成熟可用的机载电脑端软件系统,提供更加简洁快速的开发体验。目前已集成控制、规划及目标检测等研究方向,提供多个功能demo,并配套有Amovlab仿真组件。

Prometheus项目由阿木实验室运营维护,阿木实验室提供Prometheus项目配套硬件

为什么要用Prometheus?

代码开源

Prometheus项目绝大部分代码都是开源的,并且代码都有比较完善的中文注释,能够帮助大家更好地进行二次开发。

功能丰富

目前已集成控制、规划以及目标检测等功能模块,涉及无人机绝大部分研究方向。

稳定易用

  • 所有功能模块均在不同无人机机型、不同场景下经过大量测试,并且所有功能模块均配备有无人机安全保护系统,确保无人机飞行稳定性

  • 在功能设计上尽可能减少操作步骤,几乎所有功能操作都可以实现“一键式”操作,确保功能易用性

  • 配备有Prometheus地面站,能够支持图形化界面操作

  • 提供turtorial_demo模块,该模块拥有更全面的注释,能够帮助用户快速了解Prometheus二次开发接口,上手Prometheus二次开发

配套齐全

Amovlab仿真组件

基于Gazebo/PX4/ROS的仿真系统,Prometheus项目所有功能均能够在Amovlab仿真组件上复现,支持二次开发。

仿真镜像系统

提供搭建好Prometheus项目以及相关依赖环境的Ubuntu镜像系统。

配套硬件

仿真镜像系统mini主机、搭载有Prometheus项目的三种不同大小机型产品(p230/p450/p600),适合各种应用场景下的二次开发无人机平台。

Prometheus使用手册

完善的Prometheus使用手册,帮助用户熟悉Prometheus,搭建Prometheus仿真系统以及熟悉Prometheus二次开发接口。

Prometheus配套课程

全面的Prometheus二次开发课程,针对无人机开发者,从零到一掌握无人机开发的基础知识。

Prometheus社区

  • 由阿木实验室维护的阿木社区-Prometheus问答专区,在学习使用Prometheus过程中遇到的相关问题都可以在里面进行讨论沟通,Prometheus项目组成员也会定期在论坛里答疑

  • Prometheus微信交流群,需要进Prometheus微信群可扫描下方微信二维码加阿木实验室-嘉月微信联系

  • 不定期的直播、线上培训、线下培训等活动,能够更好地帮助大家更好地沟通交流

  • Prometheus校园赞助计划:奖励使用Prometheus进行实验并发表相关论文的学生科研工作者

提示

建议初次查看Prometheus使用手册的用户先阅览Prometheus使用手册概述,先简单了解Prometheus使用手册包含哪些具体内容。

Prometheus使用手册概述

Prometheus-wiki分为以下内容板块

  • Prometheus-自主无人机开源项目

    本章内容为Prometheus项目概述,通过阅览本章内容,可快速了解Prometheus项目整体情况以及相关内容

  • 快速上手

    本章讲解如何快速搭建Prometheus项目仿真环境,分别介绍了使用Ubuntu原生系统以及使用虚拟机两种方式

  • Prometheus仿真入门

    本章讲解Prometheus项目仿真基础知识,主要包含仿真系统框架、仿真功能介绍以及遥控器使用相关说明

  • 无人机控制模块 - uav_control

    本章讲解Prometheus无人机控制子模块,包含整个子模块介绍以及功能demo讲解

  • 目标检测模块 - object_detection

    本章讲解Prometheus目标检测子模块,包含整个子模块介绍以及功能demo讲解

  • 路径规划模块 - motion_planning

    本章讲解Prometheus路径规划子模块,包含整个子模块介绍以及功能demo讲解

  • Prometheus真机教程

    本章讲解Prometheus真机教程相关内容,以Z410无人机为例,讲解如何在真机中部署Prometheus项目

  • 其他

    本章讲解与Prometheus项目其余相关内容,包括Ubuntu、PX4、ROS以及其余相关内容

配套硬件

淘宝Prometheus专区:点击购买

京东Prometheus专区:点击购买

客服咨询(皓月):17360174433(微信同号)

仿真镜像系统mini主机

预装Prometheus、PX4、ROS、Gazebo、MAVROS开发环境,可快速上手仿真开发。京东链接

a1a8adc0aa8ea1e9b8813543925f331.jpg

  • 特点:

    1.搭配8G内存和128G硬盘。

    2.拥有HDMI、DP、USB3.0、TypeC等多种接口。

    3.已预装Prometheus自主无人机开源项目的官方仿真镜像。

P230

Prometheus230(简称P230)是一款专为科研工作者及无人机开发者设计的无人机实验室平台,适用于室内环境,提供控制、SLAM、室内定位、视觉避障、路径规划等功能demo。京东链接

图片 1.png

图片 2(1).png

图片 3(1).png

  • 特点:

    1.内置基于PX4-ROS的控制模块和SLAM、自主决策、编队、避障等多种算法。

    2.搭载Pixhawk4 Mini开源飞控与英伟达Jetson Xavier NX边缘AI计算机。

    3.预装基于PX4+ROS的Prometheus自主无人机机载系统。

    4.配置Intel RealSense D435i深度相机。

    5.可通过内置的VINS-Fusion和EGO-Planner等算法。

    6.可实现室内定点飞行、路径规划和自主避障等功能。

    7.可广泛应用于室内环境下的无人机编队。

    8.支持接入主流的MOCAP动作捕捉和UWB等外部定位系统,通过ROS组网实现室内的编队飞行。

P450

Prometheus450(简称P450)是一款专为科研工作者及无人机开发者设计的无人机实验平台,兼容室内外环境,提供控制、SLAM、室内/室外定位、激光雷达/视觉避障、目标检测、路径规划等功能demo。京东链接

图片 2.png

图片 4.png

图片 5.png图片 6.png

  • 特点:

    1. 基于Pixhawk V4开源飞控架构,通过内走线设计集成了高性能旋翼动力系统。

    2. 可轻易实现室内/室外的简易飞行控制。

    3. 搭载Nvidia Jetson Xavier NX机载计算机。

    4. 内置ROS(机器人操作系统)环境下的无人机控制程序与多种前沿算法。

    5. 可一键实现目标识别、激光SLAM、视觉避障等功能。

    6. 采用3D打印外壳&轻量化碳管机架的设计,提高了传感器的搭载量。

    7. 高拓展性的二次开发平台,支持使用者自行加装其他设备,满足不同的研发需求。

    8. 所有功能及相关算法均通过开源项目Prometheus发布了源代码与仿真脚本,真正做到到手即飞,即刻开发!

P600

Prometheus600(简称P600)是一款专为科研工作者及无人机开发者设计的无人机实验平台,适用于室外环境,提供控制、室外定位、激光雷达避障、目标检测、目标追踪、圆叉降落等功能demo。京东链接

图片 3.png 图片 6.png 图片 10.png 图片 11.png

  • 特点:

    1. 全机身内走线+内置飞控的设计,预留三层拓展空间,可自由地加装适配PX4飞控或ROS的传感器。

    2. 可搭载云台吊舱、激光雷达与图数传一体组网链路等挂载设备。

    3. 实现基于视觉的目标识别、框选追踪、激光雷达避障、室外指点飞行等功能。

    4. 具备超视距多机组网+图数传通信的能力。

    5. 内置基于Pixhawk V5深度优化的飞控核心,贴合开发者使用习惯。

    6. 可选配10倍变焦光电吊舱、激光雷达与图数传一体组网链路。

    7. 支持复现Prometheus中的KCF框选追踪、A*全局规划、激光雷达SLAM和YOLO通用目标识别等算法。

Prometheus校园赞助计划

image.png

赞助示例

  • 题目:拦截非合作机动四旋翼的最优末速控制制导律

  • 期刊:中科院分区2区 - 机器人领域顶刊《Journal of Field Robotics》

  • 作者:陶宏,林德福,何绍溟,宋韬,金忍

  • 作者单位:北京理工大学无人自主控制研究所

  • 通讯作者:宋韬

  • 论文链接:https://onlinelibrary.wiley.com/doi/10.1002/rob.22059

Prometheus项目组

高校科研团队

  • 戚煜华(项目创始人):中山大学博士后,本科及博士毕业于北京理工大学,在自主无人机平台搭建及二次开发方面经验丰富。参与多项航空航天科研院所无人 机相关项目,曾获得2017年国际微小型无人机比赛第三名,已在铂贝学院开设PX4自主无人机线下培训课程10次,累计培训学员300余人次。 目前在International Journal of Systems Science及Robotics and Autonomous Systems等SCI期刊上发表论文4篇,会议论文3篇。主要研究方向为:无人机控制、自主避障等。

  • 金忍(目标检测):北京理工大学博士后/博士,多年从事机器视觉、无人机视觉的开发及教学工作,曾作为视觉组队长参加2017与2020年穆罕默德·本·扎耶德国际机器人挑战赛(MBZIRC),两次获得冠军。目前在Journal of Field Robotics等SCI期刊上发表论文3篇,会议论文2篇。擅长数据驱动算法编写、性能优化、实时计算等,研究兴趣主要包括深度学习,目标检测与跟踪,迁移学习,目标定位与姿态估计。

  • 祝洋(控制方向):西南交通大学助理教授,博士毕业于电子科技大学,长期以理论与工程紧密结合的方式开展无人机、运动体和集群的(多源)抗干扰控制技术 研究、验证与应用。目前已在TIM、IJRNC等期刊发表SCI论文5篇(其中包括IJRNC封面论文一篇),会议论文6篇(其中两篇分别获得ICCA2018和GNCC2018两个会议的Best Paper Finalist) 。负责Prometheus Matlab工具包模块。

  • 江涛(路径规划):重庆大学讲师,北京理工大学博士,具有多年无人机系统、控制和导航算法开发经验。参与过多项航空航天科研院所无人机相关项目,曾获得2017年穆罕默德·本·扎耶德国际机器人挑战赛(MBZIRC)冠军。目前在Journal of the Franklin Institute等SCI期刊上发表无人机自主控制论文7篇。主要研究方向包括:无人机自主控制、移动机器人规划和定位建图等。

  • 李春雨(SLAM):北京理工大学在读博士,具有丰富的竞赛经验及仿真系统的开发经验,负责阿木实验室Prometheus系列无人机的视觉导航及仿真部分的开发。主要研究兴趣包括:无人机状态估计、无人机高机动自主飞行等

阿木实验室研发团队

  • 王根(阿木实验室研发总监):参与PX4开源技术的推广与培训,累计培训学员近千人,主要研究方向:嵌入式驱动开发、PX4系统二次开发与控制调参、ROS系统二次开发与产品落地。参与Prometheus项目飞控端的适配与开发工作。

  • 弋鑫(控制算法工程师):在控制算法工程师开源飞控及自主无人机二次开发方面经验丰富,参与多个航空航天院校及科研院所自主无人机项目。目前主要负责P系列无人机开发与维护,负责无人机控制模块、路径规划模块、gazebo仿真模块的开发与测试。

  • 李博(控制算法工程师):多年从事研究无人车、类人型机器人、无人机以及编队集群等系统开发相关工作,参与多个无人车以及集群相关项目,行业经验丰富。目前负责阿木实验室无人车以及集群相关开发、维护及测试工作。负责Prometheus集群控制模块的开发与测试。

  • 张灵(软件工程师):参与过多个机器人相关的项目,负责其中的通信以及地面站开发工作;目前在阿木实验室负责P系列无人机、R系列无人车的通信模块和地面站的开发、维护及调试工作。负责Prometheus集群地面站的开发与测试。

  • 王明(视觉算法工程师):参与过多项与深度学习相关的计算机视觉,自然语言处理工作,负责阿木实验室的P系列无人机的视觉算法的落地,P600无人机的软件开发,维护及调试,以及AirSim仿真的推进。负责Prometheus视觉模块的开发与测试。

  • 李科衡(视觉算法工程师):参与过多项机器人竞赛以及和机器人相关的项目,负责阿木实验室吊舱开发、维护及调试,主要研究方向:目标检测、目标追踪、视频编解码(Deepstream)。参与Prometheus目标追踪模块的开发与测试。

  • 张子超 (结构工程师):从事多年无人机、无人车、消费级电子产品结构及外观设计,在产品设计领域有丰富的经验,参与过多款阿木实验室无人机产品的研发。负责Prometheus项目中无人机、无人车产品外观与结构的设计。

  • 龙飞宇(无人车工程师):哈尔滨工业大学校友,ROS经验丰富。参与过多项机器人竞赛及其项目。目前负责阿木实验室Rhea无人车项目开发、维护与落地以及刘锦涛博士智能机器人集群项目的工程落地。负责Rhea无人车控制、无人车教学模块的开发与测试。

开源License及版权声明

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution".

    "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    • You must give any other recipients of the Work or Derivative Works a copy of this License; and

    • You must cause any modified files to carry prominent notices stating that You changed the files; and

    • You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    • If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

Copyright 2022 AMOVLAB

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

快速上手

本章将讲解如何快速搭建Prometheus仿真环境

提示

Prometheus仿真环境搭建出现相关问题或异常可以前往Prometheus配置常见问题处理 查询相关解决办法,如果没有,可前往阿木社区-Prometheus问答专区或Prometheus微信交流群提问

本教程提供Ubuntu系统下载搭建Prometheus仿真环境以及使用Prometheus仿真镜像系统两种安装方式,任选其中一种方式安装即可。

Ubuntu系统下载搭建Prometheus仿真环境教程除使用手册有介绍外,还搭配有视频教程(如下),用户可参考文档结合视频学习。 Matlab-Gazebo联合仿真展示

提示

虽然使用虚拟机Prometheus仿真镜像系统能够快速搭建环境,但我们仍然建议大家能够从0到1搭建整个Prometheus环境,这对于后面的开发是非常有意义的。也能够让大家能够对整个Prometheus系统能有更深入地理解。

旧版本Prometheus删除

  • 如果已经安装过旧版本的Prometheus项目(指在2022年7月20日之前已完成Prometheus项目的安装),建议先删除Prometheus以及prometheus_px4,然后按照本教程进行安装。

  • .bashrc中prometheus以及prometheus_px4相关环境变量需删除,重新按照本教程添加相关环境变量。

运行第一次仿真

仿真运行依赖于遥控器,需要通过USB数据线将遥控器与仿真电脑进行连接。

如需购买遥控器请点击遥控器购买链接

如果使用其他遥控器,只要数据流能符合目前的程序设计也是可以的。可以查看仿真中的遥控器使用说明中遥控器通道以及含义进行对比。

image.png

输入以下命令启动仿真功能测试脚本文件。

# 请将示例中的{your prometheus path}替换为prometheus的安装路径
cd ${your prometheus path}/Prometheus/Scripts/simulation/px4_gazebo_sitl_test
# 第一次使用时需要给脚本文件添加可执行权限
chmod +x px4_sitl_*
# 启动室外无人机仿真启动脚本
./px4_sitl_outdoor.sh

输入该命令后,会出现一个含有三个标签页的终端以及Gazebo,如下图所示。

图片1.png

第一个标签页内启动ROS主节点,出现图中内容则说明启动正常。

点击终端内的第二个标签页,该标签页为启动PX4以及仿真组件。查看打印信息,出现关键字CON: Got HEARTBEAT, connected. FCU:PX4 Autopilot则证明PX4正常启动,出现Gazebo和无人机则说明仿真组件启动正常。

图片2.png

点击终端内第三个标签页,该标签页为启动Prometheus uav_control_main节点。该界面会打印无人机相关信息,包含无人机状态信息和控制数据。

图片3.png

其中无人机状态信息如下图所示。

图片4.png

控制数据如下图所示。

图片5.png

然后将遥控器SWA档杆打至最底端,此时无人机将解锁进入怠速状态,无人机状态信息如下图所示。

图片7.png

再将遥控器SWB档杆打至中间位置,此时无人机及进入RC_POS_CONTROL控制模式,此时可以通过遥控器控制无人机飞行,无人机状态信息如下图所示。

图片8.png

Prometheus仿真环境配置: Ubuntu

警告

提示

本章Prometheus仿真环境配置教程为Prometheus-v2版本的教程, 需要注意,由于Prometheus-v2版本更新,Prometheus-v1和Prometheus-v2相关项目分支存在差异

Prometheus-v2:Prometheus为main分支,prometheus_px4为1.12.3分支

也就是说如果你要配置Prometheus V1,那么在最开始不能直接git clone,那样会直接下载最新Prometheus 你需要指定分支v1.1下载 如下

git clone -b v1.1 https://gitee.com/amovlab/Prometheus.git

#进入目录检查一下分支
cd Prometheus
git branch
#显示* v1.1代表分支下载正确

Prometheus-v1:Prometheus为v1.1分支,prometheus_px4为1.11.1分支

这个和上面同理,下载时需要指定分支,如下

git clone -b Prometheus_PX4_1.11.1 https://gitee.com/amovlab/prometheus_px4.git

#进入目录检查一下分支
cd prometheus_px4/
git branch
#显示* Prometheus_PX4_1.11.1代表分支下载正确

如果需要搭建Prometheus-v1版本,需要前往Prometheus旧版WIKI

前面已经提到Prometheus项目基于PX4和ROS,目前Prometheus支持在Ubuntu操作系统上运行,因此进行Prometheus仿真环境配置需要在电脑上安装Ubuntu操作系统,在Ubuntu操作系统上需要安装PX4ROSPrometheus以及相关依赖的环境

安装步骤

  1. 安装Ubuntu操作系统以及ROS
  2. prometheus_px4配置
  3. Prometheus配置

Ubuntu系统

提示

Prometheus支持Ubuntu18.04以及Ubuntu20.04操作系统

工具准备

  • Rufus软件
  • Usb3.0接口U盘一个,推荐容量大于16G
  • Ubuntu18.04桌面版镜像文件

Rufus下载

点击链接下载安装Rufus软件,选择图示版本。

image.png

Ubuntu系统镜像下载

Ubuntu18.04

点击链接下载安装Ubuntu18.04系统镜像,选择桌面版镜像,并设置好下载路径确保能找到镜像。

image.png

Ubuntu20.04

Ubuntu20.04系统镜像下载链接

image.png

系统启动盘制作

格式化U盘

警告

在格式U盘之前一定要备份好U盘中的数据!!!!

格式化U盘.png

Rufus软件使用

使用Rufus软件制作启动盘。选择对应的U盘,选择下载好的Ubuntu镜像文件,其余设置与图示相同。等待制作完成关闭即可。

image.png

系统安装

若为双系统安装,需压缩硬盘留出系统安装空间,单系统安装可跳过。

image.png

将U盘插上电脑、重启,在出现品牌logo时按F7进入boot模式,选择启动介质。

1.png

提示

不同品牌电脑,进入boot模式按键不同,可对照下图操作。

快捷键.png

选择启动盘后,选择安装Ubuntu。

20190119013933270.jpg

点击继续下一步。

3.png

选择Normal installation 选项,如下图所示。

4.png

选择Something else 选项,如下图所示。

image.png

选择之前预留的存储空间。

image.png

设置分区根据电脑内存和存储不同而不同,具体参见Ubuntu分区,勾选后点击install now。

image.png

设置用户名及密码,点击继续。

image.png

等待安装完成后,重启。

image.png

对于Ubuntu使用由于国内网络环境影响,强烈建议更改Ubuntu的源,这里的源是指你使用Ubuntu下载东西时所经过的网络途径,默认是国外源,国内使用很慢,且经常出现下载失败,所以强烈建议改源,建议改为阿里源或者清华源 修改方法参见: 改源的两种方法

提示

ROS官方安装教程已经比较完善,Prometheus使用手册不再详细介绍,可参考官方的进行安装。

需要注意的是官方的安装由于国内网络环境影响可能会出现下载缓慢或者失败,这里也提供国内安装方法

fish一键安装:fish一键安装

国内源安装:国内源安装

Ubuntu18.04: ROS-melodic安装教程

Ubuntu20.04: ROS-noetic安装教程

ROS是否安装好可以通过终端依次输入下面指令,运行小乌龟程序来检验,如果可以正常键盘的↑↓←→键控制小乌龟代表正常ROS安装成功

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

需注意无论哪种安装方式,其中一定包含构建包的依赖,也就是下面这个安装命令,否则后面安装PX4环境会出现问题

Ubuntu18.04依赖包

sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

Ubuntu20.04依赖包

sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

prometheus_px4配置

prometheus_px4是Prometheus项目配套使用的PX4固件,Prometheus项目的仿真模块依赖PX4固件以及sitl_gazebo ros功能包。(如果是配置Prometheus到真实无人机上那不需要配置prometheus_px4,因为这个是用于虚拟仿真的,真实无人机不需要)

电脑建议Ubuntu18.04/20.04,内存建议大于等于16G,如果内存不足可以通过增加Swap空间来避免编译爆内存。Ubuntu20.04电脑默认分配swap 2G,如果编译卡住,也可以通过增加swap空间解决,教程链接

更新系统

sudo apt-get update

sudo apt-get upgrade

确保系统在当下版本保持最新

安装prometheus_px4

打开终端输入下面的命令安装prometheus_px4

git clone https://gitee.com/amovlab/prometheus_px4.git

首次安装PX4固件时,需要安装PX4环境

cd prometheus_px4/Tools/setup
source ./ubuntu.sh

安装子模块以及相关依赖

注意

请将示例中的{your_prometheus_px4_path}替换为prometheus_px4的安装路径。

cd prometheus_px4
git submodule update --init --recursive #下载子模块可能会有些慢稍等,下载完可以再运行,如果下载好是不会显示什么的
pip3 install --user toml empy jinja2 packaging

编译prometheus_px4

cd prometheus_px4
make amovlab_sitl_default gazebo_p450

编译对于CPU性能和内存有一定要求,内存建议16G及以上,CPU性能建议i7 10代及以上,安装Ubuntu18.04相比20.04对于性能要求相对低一些

编译结束后,会自动运行gazebo仿真环境并加载P450无人机

如果遇到错误无法如下图显示,见下面常见错误解决

prometheus_px4_make.png

常见报错如下图所示

1.启动仿真环境时部分电脑可能出现下面这种报错信息,但只要仿真环境和P450无人机可以正常加载就可以忽略相关报错。

prometheus_px4_error.png

2.如果出现“Waiting for simulator to accept connection on TCP port 4560”并且一直保持,并且往上看显示lookup error:........./libgazebo_common.so.9,如下图 ,那么关闭终端,单独打开gazebo软件,不出意外是没有反应,这个错误原因:ignition-math库太老了,需要更新。 运行下面代码

sudo apt upgrade libignition-math2

59ce7708b4741e9029c0fea54c5fea7.jpg

3.如果错误显示'amovlab_sitl_default'failed ,中间错误显示error:'........../libignition-common.so.1.0.1',如下图所示,这个是系统缺少libignition-common_1.0.1-1 点击ignition-common,下载libignition-common_1.0.1-1_amd64.deb,右键->用软件安装打开

3745f7ff7e1991622064ef7b16ae830.jpg

4.如果出现错误显示“could not find a package configuration file provided by "gazebo" with any”,这个是缺少gazebo中的配置文件 运行下面代码

sudo apt-get install ros-melodic-gazebo-dev

2023-03-13 14-14-07 的屏幕截图.png

ubuntu的终端中遇到错误不要慌,根据终端错误提示,将提示复制,百度搜索,一般都可以解决

Prometheus配置

安装Prometheus

打开终端输入以下命令安装Prometheus项目。

git clone https://gitee.com/amovlab/Prometheus.git

安装prometheus_mavros

prometheus_mavros是Prometheus项目配套使用的MAVROS功能包,Prometheus项目与PX4连接进行数据交互依赖于MAVROS功能包。

打开终端输入以下命令安装prometheus_mavros。

注意

请将示例中的{your_prometheus_path}替换为Prometheus的安装路径。

cd Prometheus/Scripts/installation/prometheus_mavros
chmod +x install_prometheus_mavros.sh
./install_prometheus_mavros.sh

Prometheus_mavros.png

安装完毕后关闭当前终端窗口,打开新的终端输入以下命令测试prometheus_mavros是否正常安装完毕以及环境变量是否正常加载。

roscd mavros

如果出现路径为~/prometheus_mavros/src/mavros/mavros则证明安装成功。

roscd_mavros.png

如果上面执行后没有报错,但是roscd mavros 并不能成功,那么打开.bashrc文件

sudo gedit ~/.bashrc

正常情况下.bashrc里显示了ROS的环境"source /opt/ros/melodic/setup.bash",这时添加mavros如下所示

source ~/prometheus_mavros/devel/setup.bash

Screenshot from 2023-05-05 09-37-48.png

保存退出,再终端中更新环境变量

source .bashrc

roscd mavros

如果还没有成功那么就是前面有错误,仔细看看运行过程中是否异常,报错。

依赖项下载

遥控器仿真驱动安装

## 安装遥控器仿真驱动
sudo apt-get install jstest-gtk
## 安装完成之后,可以在终端中运行如下指令确认遥控器是否正常以及摇杆和按钮的响应情况
jstest-gtk

Gazebo模型库下载

 cd ~/.gazebo/
 # 如果之前没有models文件夹的话,创建models文件夹
 mkdir -p models
 cd ~/.gazebo/models/
 # 这个仓库是从官方仓库(https://github.com/osrf/gazebo_models)复制过来的,会定期更新
 git clone https://gitee.com/amovlab/gazebo-models.git

nlink_parser安装

nlink_parser为UWB驱动功能包,目前仅支持nooploop相关UWB产品

# 通过git clone方式下载功能包,参考README配置该功能包
git clone https://github.com/nooploop-dev/nlink_parser.git

vrpn_client_ros安装(可选)

vrpn_client_ros功能包为动捕定位系统应用所依赖的ROS功能包,如果使用动捕定位则需要下载该功能包

sudo apt-get install ros-melodic-vrpn-client-ros

编译Prometheus

输入以下命令编译Prometheus项目。

cd Prometheus 

# 第一次使用时需要给编译脚本文件添加可执行权限
chmod +x compile_*

# 编译控制功能模块
./compile_control.sh

compile_control.png

目前提供四个编译脚本:

编译脚本文件编译模块
compile_all.sh编译全部功能模块,包含基础模块、通信模块、Gazebo仿真模块、控制模块、demo模块、规划模块、目标检测模块
compile_control.sh编译控制功能相关模块,包含基础模块、Gazebo仿真模块、控制模块、demo模块
compile_planning.sh编译规划功能相关模块,包含基础模块、Gazebo仿真模块、控制模块、规划模块
compile_detection.sh编译视觉功能相关模块,包含基础模块、Gazebo仿真模块、控制模块、demo模块、目标检测模块

警告

  • 目标检测模块能编译通过,并不代表所有功能都能正常运行
  • 目标检测模块大部分功能都需要Nvidia显卡,CUDA环境支持,具体请看视觉功能汇总
  • 如果需要使用完整目标检测模块,请前往目标检测模块介绍完成相关依赖环境安装

提示

用户可根据自身情况选择其中一个编译脚本文件运行,可避免不需要的功能模块带来的环境或编译问题。

其他配置

环境变量配置

打开终端输入以下命令打开.bashrc文件。

sudo gedit ~/.bashrc

将以下内容复制到.bashrc文件中后保存退出,如果.bashrc已有相关内容,则无需重复添加。

提示

其中{your prometheus path}为Prometheus项目路径,{your px4 path}为安装prometheus_px4固件的路径。

source {your prometheus path}/Prometheus/devel/setup.bash

export GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:{your prometheus path}/Prometheus/devel/lib
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:{your prometheus path}/Prometheus/Simulator/gazebo_simulator/gazebo_models/uav_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:{your prometheus path}/Prometheus/Simulator/gazebo_simulator/gazebo_models/ugv_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:{your prometheus path}/Prometheus/Simulator/gazebo_simulator/gazebo_models/sensor_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:{your prometheus path}/Prometheus/Simulator/gazebo_simulator/gazebo_models/scene_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:{your prometheus path}/Prometheus/Simulator/gazebo_simulator/gazebo_models/texture

source {your px4 path}/prometheus_px4/Tools/setup_gazebo.bash {your px4 path}/prometheus_px4 {your px4 path}/prometheus_px4/build/amovlab_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:{your px4 path}/prometheus_px4
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:{your px4 path}/prometheus_px4/Tools/sitl_gazebo

以下图为例,Prometheus安装在/home文件夹下,可用~代表。~/Prometheus/home/amov/Prometheus等效。示例中的amov为用户名,如果使用/home/{user}/Prometheus这种形式的需要将用户名更改。

prometheus_px4环境变量.png

Prometheus仿真环境配置:Prometheus镜像

提示

Prometheus镜像支持在虚拟机上安装使用 ,但若是想在双系统上安装Prometheus镜像,需注意必须使用Rufus 3.19以上版本软件去制作系统启动盘。另外,在双系统下安装Prometheus镜像兼容性较差,不太容易成功。

Prometheus镜像系统基于Ubuntu18.04操作系统,大小约10个G,镜像系统已提前安装并配置好Prometheus、prometheus_mavros以及prometheus_px4以及相关依赖环境,可以直接上手使用Prometheus。

虚拟机安装Prometheus镜像

安装准备

注意

这里提供的Prometheus镜像只是为了方便用户安装,安装后并不是就可以直接上手使用Prometheus,用户需要按照wiki中操作配置Prometheus

如果用户不想要配置或者时间紧急需要快速上手Prometheus仿真,阿木实验室提供仿真套件供用户购买,到手即用,包含仿真遥控器

购买链接

仿真套件wiki

Prometheus镜像下载链接

提供的下载链接为百度网盘方式,提取码为amov

注意

此处提到的Prometheus镜像系统为Prometheus-v2版本(指2022年7月15日发布的新版Prometheus),此前的Prometheus-v1版本镜像请点击下方链接进行下载

Prometheus-v1镜像下载链接

提供的下载链接为百度网盘方式,提取码为amov

安装步骤

首先,创建一个新的虚拟机。

1.png

选择自定义安装,点击下一步。

2.png

选择稍后安装操作系统,继续下一步。

3.png

选择Linux操作系统,版本为Ubuntu64位。

4.png

根据电脑配置和需求选择合适的虚拟机处理器配置和内存大小。

5.png

6.png

7.png

接下来按照引导推荐选择即可。

8.png

9.png

10.png

根据需求选择合适的磁盘大小,至少大于30G空间,推荐60G空间以上,其余根据引导推荐完成安装。

11.png

14.png

创建虚拟机之后,在虚拟机设置中选择使用Prometheus镜像,然后点击运行虚拟机。

13.png

选择Boot system installer,按下回车。

15.png

进入登录界面,输入密码 amov,即可进入Prometheus镜像系统开始安装。

16.png

开始安装镜像系统,配置用户名和密码。

17.png

选择之前创建的虚拟磁盘分区,点击delete。

18.png

选中虚拟磁盘分区,再选择生成的新磁盘大小,再点击右边的绿色箭头分配。

19.png

将生成的四个新虚拟磁盘分别设置为 “/” , “/home" , "/SWAp" , "/boot/efi"。

21.png

注意要勾选传递用户配置文件,如何点击next。

22.png

点击start后,耐心等待镜像安装完成。

23.png

安装完成点击reboot重启后即可使用Prometheus镜像系统。

24.png

Prometheus配置常见问题处理

  1. 更新子模块遇到报错

    尝试输入以下命令解决。

    make distclean
    git submodule update --init --recursive
    
  2. arm-none-eabi-gcc安装失败或者版本不对

    一定要使用prometheus_px4/Tools/setup目录下的ubuntu.sh进行安装,如果使用PX4官方master分支下的对应文件则会安装高级版本的arm-none-eabi-gcc,会使得编译prometheus_px4出错,可通过下面的命令查看查看arm-none-eabi-gcc版本。

    arm-none-eabi-gcc --version
    

    prometheus_px4对应的版本是gcc version 9-2020-q2-update(其他版本gcc可能也支持,只要能顺利编译固件即可),如果之前已经安装过最新的arm-none-eabi-gcc,请重新运行ubuntu.sh文件后,重启电脑。

    安装失败一般是由于网络原因导致,在运行ubuntu.sh文件时,请耐心查看安装记录,下载arm-none-eabi-gcc有时会因为网络原因而自动放弃下载,此时,也只需要反复运行ubuntu.sh文件直至安装成功。

  3. 缺少gstreamer依赖

    输入以下命令安装相关依赖。

    sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
    
  4. 编译prometheus_px4时提示"Failed to import numpy: No module named 'numpy' "

    输入以下命令安装numpy。

    pip3 install --user numpy
    
  5. prometheus_mavros安装时出现rosdep update 错误

    # 需要科学上网
    rosdep update
    

Prometheus仿真入门

本章将为大家介绍Prometheus仿真涉及的基础内容。

在本章内容中,会首先介绍一些常用开发工具的安装,这些工具能帮助大家更好地进行开发,能够提升开发效率,大家可以从中找出比较适合自己的工具下载即可。

接下来会介绍PX4-Gazebo的仿真原理,能够让大家快速了解掌握仿真各模块的框架,也能了解到Prometheus、PX4、Gazebo中各个功能模块的关系,强烈建议大家熟悉这一块内容,当掌握了仿真框架,再去了解真机相关内容后,基本上就能够明白如何将仿真代码移植到真机中。

然后是Prometheus代码框架及功能汇总,介绍Prometheus项目的代码框架、消息文件以及功能汇总。

最后是仿真中的遥控器说明,这一块将详细介绍Prometheus仿真中遥控器操作相关内容,这一节内容较为重要,需要完全掌握全部内容。

常用开发工具的安装

  • VSCode

    VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置,也可以通过内置的扩展程序商店安装扩展以拓展软件功能。

    VSCode下载地址

    打开VSCode下载地址后将出现以下界面,点击.deb下载方式。

    image.png

    一般情况下默认下载在Downloads文件夹下,输入以下命令进行安装。

    	cd ~/Downloads
    	sudo dpkg -i ***.deb
    
  • NoMachine

    NoMachine是一款远程桌面工具,在高延迟低带宽的通信链路上也有较好地表现。

    NoMachine下载地址

    image.png

    建议大家使用.deb下载方式,下载完后安装命令与VSCode安装方式一致。

  • QGroudControl

    QGroundControl简称QGC,是一款与PX4飞控通信连接进行交互的地面站软件,官方网站对于下载安装的说明已经非常完善了,此处不再过多讲解,大家参考官网即可完成下载安装。

    QGroundControl下载地址

PX4-Gazebo仿真说明

在介绍PX4-Gazebo仿真之前,我们先介绍一下基于PX4的旋翼无人机系统

PX4无人机框架图.png

首先,先了解一下上面这幅PX4无人机框架图,可以看到PX4旋翼无人机包含机架、电机、旋翼、飞控(飞行控制板)、脚架等必需模块,这是无人机实现飞行移动的基础。

其次还包含图传、数传、GPS、激光雷达、视觉传感器等模块,这一块非必需模块和无人机应用场景相关,根据不同的场景会搭载其余模块。

其中,我们需要清楚地认识到真实无人机能够实现飞行功能就必须要有上面所说的必需模块以及配套的软件系统。

PX4-Gazebo仿真框架.png

而在仿真当中,我们并不需要这些硬件模块,但是我们需要通过软件来模拟这些硬件模块的数据交互。

其中Gazebo为我们提供了一个物理环境的模拟系统,例如无人机以及飞行环境的可视化物理属性碰撞属性等。

而PX4完成了对无人机物理模型以及运动控制模型的搭建、运动控制插件飞行控制系统等内容。

基于PX4-Gazebo的仿真系统能够完全实现无人机飞行控制的全部功能,除了性能,其余方面与真机表现并无差异.可以简单理解为Gazebo提供无人机硬件仿真,而PX4提供飞控仿真,当然无人机硬件仿真也是由PX4项目组完成,Gazebo仅仅是提供一个物理仿真平台。

关于PX4-Gazebo仿真更多的内容可参考PX4-Gazebo官网介绍

Prometheus代码框架及功能汇总

Prometheus代码框架图

提示

Prometheus代码框架图仅展示主要内容,并未包含所有文件。

Prometheus代码框架主要包含ExperimentScriptsSimulatorModules四个模块:

  • Experiment

    与阿木实验室Z410无人机配套的真机代码,其余安装有Prometheus项目的无人机也可以通过该模块内容适配Prometheus项目,但可能需要修改部分参数,详情请查看Prometheus真机教程

  • Modules

    Modules作为Prometheus项目最重要的组成部分,包含各个功能子模块的全部源代码,主要包括通用子模块、控制子模块、教程子模块、目标检测子模块、规划子模块等功能源代码。

  • Scripts

    Scripts下有installationsimulation两大部分,其中installation包含目标检测子模块环境安装脚本以及prometheus_mavros安装脚本,simulation包含各仿真功能启动脚本以及测试脚本。

  • Simulator

    提供基于PX4-Gazebo的Prometheus仿真代码,包含无人机、传感器、二维码以及环境等相关模型,控制插件以及仿真launch文件等。

Prometheus_msgs说明

ArucoInfo: Aruco二维码的信息, 标定相机后可估计二维码的位姿

MultiArucoInfo: ArucoInfo的数组形式

BoundingBox: 表示目标检测的分类,边框坐标,置信度

BoundingBoxes: BoundingBox的数组形式

DetectionInfo: 目标检测反馈信息,包含对目标、类别、位姿估计

MultiDetectionInfo: DetectionInfo的数组形式

FormationAssign: 集群队形位置分配

GPSData: GPS经纬度以及海拔高度

MultiUAVState: 多架无人机状态

OffsetPose: 无人机ENU坐标系下的定位数据位置偏移量

SwarmCommand: 集群控制指令,包含位置控制、控制模式设置、队形变换设置、队形间距设置等.

TextInfo: 无人机向地面站反馈文本消息

UAVCommand: 无人机控制指令,包含控制命令设置、惯性系、机体系、轨迹、姿态、经纬度、位置、速度、加速度等多种控制模式

UAVControlState: 无人机控制状态

UAVSetup: 无人机设置,包含解上锁、设置px4飞行模式、设置控制模式、重启飞控

UAVState: 无人机状态,包含飞行模式、连接状态、定位来源、gps状态、位置、速度、姿态等信息

Prometheus项目功能模块组成

uav_control:Prometheus项目中的基础模块,负责其余上层功能模块与底层MAVROS进行数据交互的接口

gazebo_simulator:仿真模块,包含室内外无人机仿真模型、仿真环境、Gazebo插件以及仿真启动的launch文件等内容

turtorial_demo: 示例模块,包含Prometheus项目绝大部分功能模块的基础教程源代码以及相应的启动lauch文件

planning: 路径规划模块

object_detection:视觉检测模块

swarm_control:集群控制模块

matlab_bridge:matlab子模块

仿真中的遥控器使用说明

在真实飞行过程中,我们使用真实的遥控器作为控制无人机的主要操作来源,遥控器始终拥有最高的权限,精湛的遥控器操作手法可以保证无人机安稳着陆,但对于很多非专业来说,遥控的操作技巧是需要不断的练习的。我们始终强调一个观念,仿真与实机结合,这样更加符合开发流程,在以往的仿真中,我们通过键盘控制无人机飞行,并不能真实的反应出实机飞行时该怎么操作,也是基于现在存在的种种问题,为了让仿真与实机结合的更加完美,在Prometheus中增加遥控器控制方式,与真机使用更加对应起来,更加容易上手进行二次开发。

遥控器通道和方向

FS-i6S.png

  1. 开关机按钮,开关机需要同时按下两个按钮,开机时需要所有档杆开关打至最上端
  2. 摇杆
  3. 档杆开关,从左到右依次为SWA、SWB、SWC、SWD
遥控器通道含义
右摇杆(左右)通道1滚转(向左推,无人机向左移动)
右摇杆(上下)通道2俯仰(向上推,无人机向前飞)
左摇杆(上下)通道3油门(向上推,无人机向上飞)
左摇杆(左右)通道4偏航(向左推,无人机向左转弯)
SWA(两段开关)通道5解锁/上锁开关
SWB(三段开关)通道6Prometheus控制模式切换,分别对应INIT-RC_POS_CONTROL-COMMAND_CONTROL
SWC(三段开关)通道7KILL开关,也可以留作用户自定义
SWD(两段开关)通道8Prometheus中的LAND模式

仿真电脑和遥控器连接

仿真电脑和遥控器通过Micro USB数据线连接

Micro USB数据线

image.png

仿真电脑与遥控器连接图

USB连接电脑.jpg

Prometheus控制模式包含四种,分别是INITRC_POS_CONTROLCOMMAND_CONTROLLAND_CONTROL下图为无人机运行时的控制状态机图

Prometheus控制状态机图.png

无人机各种情况下的操作说明

无人机档杆情况说明

SWA/SWC/SWD档杆都属于触发型,而SWB档杆属于维持型,SWA档杆执行解上锁操作,触发解锁操作需要从上往下拨这个动作,而不是SWA档杆处于底部,而SWB切换到某一模式,是因为档杆处于那个位置,而不是拨的动作。

无人机未解锁时

1.仅能通过SWA档杆进行解锁上锁操作,SWB档杆无法切换控制模式,SWD无法切换到降落模式。

2.将SWB档杆拨到中间位置时,无人机解锁后会直接进入RC_POS_CONTROL,而直接拨到底部位置时,无人机解锁后无法进入COMMAND_CONTROL,因为需要先进入RC_POS_CONTROL才能切入到COMMAND_CONTROL模式。

无人机解锁并处于INIT(PX4处于Position模式)模式时

1.处于地面时可执行上锁操作。

2.可使用摇杆控制无人机移动。

3.可切入RC_POS_CONTROL模式。

4.无法切入LAND_CONTROL模式(需要在RC_POS_CONTROL或LAND_CONTROL模式下)。

5.无法直接切入COMMAND_CONTROL模式(档杆以及软件都需要先进入RC_POS_CONTROL模式)。

6.将SWB档杆快速切入到COMMAND_CONTROL模式时,会导致系统异常,此时,档杆处于COMMAND_CONTROL模式,但无人机上一状态为INIT模式,导致无人机无法正常进入COMMAND_CONTROL模式。

无人机解锁并处于RC_POS_CONTROL(PX4处于OFFBOARD模式)模式时

1.无人机此时会离地一定高度,不能上锁。

2.可切入LAND_CONTROL。

3.可切入COMMAND_CONTROL。

无人机解锁并处于COMMAND_CONTROL(PX4处于OFFBOARD模式)模式时

1.可切入LAND_CONTROL。

2.可切入RC_POS_CONTROL。

3.将SWB档杆快速移动至顶端可直接切入到INIT模式。

无人机遥控器操作正常流程

1.将SWA/SWB/SWC/SWD档杆全部打到最顶端。

2.启动相关功能代码脚本。

3.将SWA档杆切入到底端进行解锁。

4.无人机解锁后将SWB档杆切入到RC_POS_CONTROL模式,缓慢升高到一定高度。

5.将SWB档杆切入到COMMAND_CONTROL模式,无人机进行自主飞行。

6.自主飞行任务结束后将SWD档杆拨到底端,无人机自主降落。

无人机定位异常无法正常飞行

1.此时无人机将触发保护机制,进行快速降落。

2.如果快速降落依然存在安全风险或无人机已经失控,则将SWC档杆向下拨,无人机电机将停转。

无人机在COMMAND_CONTROL模式下需要人为接管

1.将SWB档杆拨到中间位置或最顶端位置切换至RC_POS_CONTROL或INIT人为进行操作。

无人机控制模块 - uav_control

uav_control代码框架

uav_control包含两个功能模块uav_controller(无人机控制)和uav_estimator(无人机状态);

uav_controller模块一次循环的的核心逻辑为:

  1. 无人机状态检查,包含飞控连接状态、定位状态、地理围栏等
  2. 检查无人机控制状态,包含INIT、RC_POS_CONTROL、COMMAND_CONTROL、LAND_CONTROL四种控制状态并对控制变量进行赋值
  3. 如果无人机状态为INIT则本次循环结束
  4. 下发控制指令

uav_estimator模块一次循环的的核心逻辑为:

  1. 订阅无人机状态、电池状态、无人机定位数据、外部定位数据等
  2. 如果使用外部定位数据,则将定位数据下发到MAVROS
  3. 打印显示无人机相关数据
  4. 发送相关提示信息到地面站

下图为uav_control模块代码运行流程

uav_control代码框架图

uav_control_node介绍

uav_control模块相关源代码放置在Prometheus/Modules/uav_control文件夹下,对应的ROS功能包名为prometheus_uav_control。该模块为Prometheus项目的基础模块,完成Prometheus其他功能模块与mavros节点进行数据交互。

发布话题和订阅话题中均带有命名空间/uav*,无人机编号不同则对应的命名空间不同,一般情况下默认为/uav1

发布话题

  • /uav*/mavros/setpoint_raw/attitude(mavros_msgs/AttitudeTarget)

    期望的无人机姿态控制量

  • /uav*/mavros/setpoint_raw/global(mavros_msgs/GlobalPositionTarget)

    期望的无人机经纬高控制量

  • /uav*/mavros/setpoint_raw/local(mavros_msgs/PositionTarget)

    期望的无人机ENU坐标系的控制量(包含位置、速度、加速度等)

  • /uav*/mavros/vision_pose/pose(geometry_msgs/PoseStamped)

    MAVROS提供的外部定位数据接口

  • /uav*/prometheus/control_state(prometheus_msgs/UAVControlState)

    Prometheus控制状态

  • /uav*/prometheus/odom(nav_msgs/Odometry)

    无人机里程计数据

  • /uav*/prometheus/offset_pose(prometheus_msgs/OffsetPose)

    ENU坐标系下的位置偏移量

  • /uav*/prometheus/state(prometheus_msgs/UAVState)

    无人机状态合集,包括位置\速度\姿态\模式等

  • /uav*/prometheus/text_info(prometheus_msgs/TextInfo)

    反馈到地面站的打印信息

  • /uav*/prometheus/trajectory(nav_msgs/Path)

    无人机运动轨迹

  • /uav*/prometheus/uav_mesh(visualization_msgs/Marker)

    无人机位置(带图标),用于RVIZ显示

订阅话题

  • /uav*/mavros/battery(sensor_msgs/BatteryState)

    无人机电池状态

  • /uav*/mavros/global_position/global(sensor_msgs/NavSatFix)

    无人机当前经纬度数据,经飞控融合过后的数据.

  • /uav*/mavros/gpsstatus/gps*/raw(mavros_msgs/GPSRAW)

    GPS模块数据状态

  • /uav*/mavros/imu/data(sensor_msgs/Imu)

    IMU模块数据

  • /uav*/mavros/local_position/pose(geometry_msgs/PoseStamped)

    无人机ENU坐标系下的位置数据

  • /uav*/mavros/local_position/velocity_local(geometry_msgs/TwistStamped)

    无人机ENU坐标系的当前速度数据

  • /uav*/mavros/setpoint_raw/target_attitude(mavros_msgs/AttitudeTarget)

    PX4中无人机的姿态设定值 (坐标系:ENU系)

  • /uav*/mavros/setpoint_raw/target_local(mavros_msgs/PositionTarget)

    PX4中无人机的位置/速度/加速度设定值(坐标系:ENU系)

  • /uav*/mavros/state(mavros_msgs/State)

    无人机当前状态(PX4)

  • /uav*/prometheus/command(prometheus_msgs::UAVCommand)

    无人机控制指令(用于COMMAND_CONTROL模式)

  • /uav*/prometheus/fake_rc_in(mavros_msgs/RCIn)

    PX4遥控器数据

  • /uav*/prometheus/offset_pose(prometheus_msgs::OffsetPose)

    ENU坐标系下的位置偏移量

  • /uav*/prometheus/set_local_offset_pose(prometheus_msgs::OffsetPose)

    设置ENU坐标系下无人机的位置偏移量

  • /uav*/prometheus/setup(prometheus_msgs/UAVSetup)

    无人机设置指令

  • /uav*/prometheus/state(prometheus_msgs/UAVState)

    无人机状态合集,包括位置、速度、姿态、模式等

参数

  • uav_id:

    参数说明: 无人机编号

    单位: -

    数据类型: int

    默认值: 1

    备注: 无

  • sim_mode:

    参数说明: 是否为仿真

    单位: -

    数据类型: bool

    默认值: true

    备注: true代表为仿真模式,false代表为非仿真模式

  • control/pos_controller:

    参数说明: 控制器标志位

    单位: -

    数据类型: int

    默认值: 0

    备注: 0: PX4_ORIGIN, 1: PID, 2: UDE, 3: NE

  • control/enable_external_control:

    参数说明: 是否使用外部控制器

    单位: -

    数据类型: bool

    默认值: false

    备注: true代表使用外部控制器,false代表不使用外部控制器

  • control/Takeoff_height:

    参数说明: 起飞高度(command_control模式下的起飞高度)

    单位: 米

    数据类型: float

    默认值: 1.0

    备注: 无

  • control/Disarm_height:

    参数说明: land_control模式下自动上锁的高度

    单位: 米

    数据类型: float

    默认值: 0.2

    备注: 无

  • control/Land_speed:

    参数说明: land_control模式下下降的速度

    单位: 米

    数据类型: float

    默认值: 0.2

    备注: 位置坐标系为ENU坐标系

  • control/location_source:

    参数说明: 定位数据来源

    单位: 无

    数据类型: int

    默认值: 4

    备注: 0: MOCAP, 1: T265, 2: GAZEBO, 3: FAKE_ODOM, 4: GPS, 5: RTK, 6: UWB

  • control/maximum_safe_vel_xy:

    参数说明: XY轴最大安全速度

    单位: 米/秒

    数据类型: float

    默认值: 4.0

    备注: 无

  • control/maximum_safe_vel_z:

    参数说明: Z轴最大安全速度

    单位: 米/秒

    数据类型: float

    默认值: 3.0

    备注: 无

  • control/maximum_vel_error_for_vision:

    参数说明: 最大vision/px4速度误差

    单位: 米/秒

    数据类型: float

    默认值: 1.0

    备注: 无

  • geo_fence/x_min:

    参数说明: 地理围栏X轴最小值

    单位: 米

    数据类型: float

    默认值: -100.0

    备注: 位置坐标系为ENU坐标系

  • geo_fence/x_max:

    参数说明: 地理围栏X轴最大值

    单位: 米

    数据类型: float

    默认值: 100.0

    备注: 位置坐标系为ENU坐标系

  • geo_fence/y_min:

    参数说明: 地理围栏Y轴最小值

    单位: 米

    数据类型: float

    默认值: -100.0

    备注: 位置坐标系为ENU坐标系

  • geo_fence/y_max:

    参数说明: 地理围栏Y轴最大值

    单位: 米

    数据类型: float

    默认值: 100.0

    备注: 位置坐标系为ENU坐标系

  • geo_fence/z_min:

    参数说明: 地理围栏Z轴最小值

    单位: 米

    数据类型: float

    默认值: -100.0

    备注: 位置坐标系为ENU坐标系

  • geo_fence/z_max:

    参数说明: 地理围栏Z轴最大值

    单位: 米

    数据类型: float

    默认值: 100.0

    备注: 位置坐标系为ENU坐标系

无人机控制模块教学例程

提示

尝试运行无人机控制模块教学例程前需要掌握仿真入门中仿真中的遥控器使用说明

学习无人机控制模块教学例程需要掌握一定的UbuntuROSC++/Python基础

无人机控制模块作为Prometheus项目的基础子模块,Prometheus项目中其余子模块均会通过控制模块与无人机进行数据交互。所以学习Prometheus项目以及通过Prometheus项目进行无人机二次开发都是需要先从控制模块开始学习。

在控制模块我们提供了对应的教学例程,包含起飞降落惯性系控制机体系控制经纬高控制轨迹控制以及集群控制六个教学例程。通过教学例程大家能够快速了解控制模块的相关数据接口,也能够通过学习例程demo的源码学习Prometheus控制模块的二次开发

教学例程提供有C++以及Python两种语言的源码,用户可自行选择相应的源码文件进行学习。

  • 控制模块源码文件位置:/Prometheus/Modules/uav_control
  • 教学例程demo源码文件:/Prometheus/Modules/tutorial_demo/basic

无人机控制模块教学例程 - 起飞降落

运行结果展示

起飞降落demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/takeoff_land.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动起飞降落仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x takeoff_land.sh
    ./takeoff_land.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,到达预设高度后悬停30秒,随后自动降落

节点运行图

起飞降落节点运行图.png

起飞降落例程主要包含/joy_node/uav1/mavros/uav_control_main_1/takeoff_land等ROS节点。

  • /joy_node节点为遥控器ROS驱动节点,用以获取遥控器数据。

  • /uav1/mavros节点为飞控ROS驱动节点,与飞控进行数据交互。在仿真中,该驱动节点与模拟飞控进行数据交互。

  • /uav_control_main_1节点为Prometheus项目中最基础的ROS节点,所有Prometheus项目的功能模块都通过该节点与无人机进行数据交互。

  • /takeoff_land节点为起飞降落节点,通过/uav_control_main_1节点提供的数据接口获取无人机数据以及控制无人机。

从节点运行图中,我们可以看到/takeoff_land节点与/uav_control_main_1节点进行数据交互主要有三个ROS话题

  • /uav1/prometheus/command:无人机控制接口,对应的消息为prometheus_msgs/UAVCommand
  • /uav1/prometheus/state:无人机状态,对应的消息为prometheus_msgs/UAVState
  • /uav1/prometheus/control_state:无人机控制状态,对应的消息为prometheus_msgs/UAVControalState

建议阅读/Prometheus/Modules/common/prometheus_msgs/msg内对应的消息文件,了解上面提到的三个消息的详细定义。

代码讲解

源码文件名为takeoff_land.cpp

位于/Prometheus/Modules/tutorial_demo/basic/takeoff_land/src文件夹下

起飞降落demo-1.png

起飞降落demo-2.png

该demo为Prometheus 起飞&降落控制接口开发示例,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Init_Pos_Hover模式,该模式为起飞;Agent_CMD设置为Land,该模式为降落
  2. 每发送一次数据,Command_ID加1
  3. 时间戳通过调用ros::Time::now()函数获取当前ROS系统时间并赋值即可,frame_id并不影响功能,但建议与控制命令所采用的坐标系一致。

无人机控制模块教学例程 - 惯性系控制

运行结果展示

惯性系控制demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/enu_xyz_pos_control.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动惯性系移动仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x enu_xyz_pos_control.sh
    ./enu_xyz_pos_control.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,飞行到预设位置(ENU坐标系下(1,0,1)坐标点)后将悬停30秒,随后降落

代码讲解

惯性系移动demo.png

该demo为Prometheus XYZ_POS控制接口开发示例,XYZ_POS为无人机XYZ轴位置(ENU坐标系)的控制模式,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Move模式
  2. Move_mode设置为XYZ_POS
  3. 填充XYZ轴的位置数据
  4. 每发送一次数据,Command_ID加1

无人机控制模块教学例程 - 机体系控制

运行结果展示

机体系控制demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/body_xyz_pos_control.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动机体系移动仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x body_xyz_pos_control.sh
    ./body_xyz_pos_control.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,飞行到预设位置(body坐标系下(1,0,0)坐标点)后将悬停30秒,随后降落

代码讲解

机体系移动demo.png

该demo为Prometheus XYZ_POS_BODY控制接口开发示例,XYZ_POS_BODY为无人机XYZ轴位置(BODY坐标系)的控制模式,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Move模式
  2. Move_mode设置为XYZ_POS_BODY
  3. 填充XYZ轴的位置数据
  4. 每发送一次数据,Command_ID加1

注意

机体坐标系控制对Command_ID变量有严格限制,当前发送控制命令的Command_ID必须高于上一个控制命令的Command_ID才会执行

无人机控制模块教学例程 - 经纬高控制

运行结果展示

经纬高控制demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/global_pos_control.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动经纬高控制仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x global_pos_control.sh
    ./global_pos_control.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,飞行到预设位置(无人机当前经纬度,高度5米的位置点)后将悬停30秒,随后降落

注意

高度数据为相对高度,并不是海拔高度

代码讲解

经纬高控制demo.png

该demo为Prometheus LAT_LON_ALT控制接口开发示例,LAT_LON_ALT为无人机经纬度以及高度位置(WGS84坐标系)的控制模式,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Move模式
  2. Move_mode设置为LAT_LON_ALT
  3. 填充经纬度以及高度数据
  4. 每发送一次数据,Command_ID加1

无人机控制模块教学例程 - 轨迹控制

运行结果展示

轨迹控制demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/circular_trajectory_control.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动圆形轨迹追踪仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x circular_trajectory_control.sh
    ./circular_trajectory_control.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,然后飞行一个圆形轨迹后将悬停30秒,随后降落

代码讲解

圆形轨迹控制demo.png

该demo为Prometheus XY_VEL_Z_POS控制接口开发示例,XY_VEL_Z_POS为无人机XY轴速度、Z轴位置(ENU坐标系)的控制模式,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Move模式
  2. Move_mode设置为XY_VEL_Z_POS
  3. 填充XY轴的速度数据以及Z轴的位置数据
  4. 每发送一次数据,Command_ID加1

无人机控制模块教学例程 - 集群控制

运行结果展示

集群控制demo对应脚本文件位于/Prometheus/Scripts/simulation/tutorial_demo/formation_control.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动集群控制仿真demo

    cd Prometheus/Scripts/simulation/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x formation_control.sh
    ./formation_control.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 此时可通过在终端界面输入相关指令控制无人机集群,如下图所示

    • 其中输入0后将输入位置控制数据,控制无人机集群移动

    • 输入1后切换无人机集群队形为一字队形(无人机默认以一字队形飞行)

    • 输入2后切换无人机集群队形为三角队形

代码讲解

  1. 接收终端输入的控制指令(集群位置控制、队形切换)
  2. 将集群控制指令转化为单台无人机控制指令
  3. 下发单台无人机控制指令

在RTX 3060、Ubuntu18.04、X86主机环境中通过测试,其他环境(如ARM上)可能会遇到问题

介绍

Prometheus开源视觉模块,内置多种无人机视觉模块包括:二维码检测、YOLOv3目标识别算法(开箱即用)、YOLOv5目标识别算法、高速轻量的KCF跟踪算法,以及先进的高精度跟踪算法SiamPRN,同时也包含一些基础的知识,例如相机标定。

整个Prometheus开源视觉模块由视觉图像输入、视觉算法、无人机控制算法组成,各个部分相互解耦合实现模块复用。视觉图像输入包含USB相机、MIPI相机、视频流、视频文件、转化为ROS图像话题发布。视觉算法从ROS图像话题中获取图像,识别处理图像后,发布从图像中获取相应到信息(目标像素位姿,类别等)以及可视化处理后的图像话题。无人机控制算法获取到目标信息后给无人机发送相应指令,完成相关程序任务(如降落,跟踪)。

目录

  1. 环境安装与配置
  2. 视觉功能汇总
  3. 仿真教学例程
    1. 二维码自主降落
    2. 二维码探寻降落
    3. SiamRPN框选追踪
    4. YOLOv5+SiamRPN点击跟踪
  4. 扩展知识阅读(可选)
    1. SiamRPN算法概述
    2. YOLOv5算法概述
    3. YOLOv5自定义数据模型训练
    4. 二维码检测原理概述
    5. 图像输入话题
    6. 相机标定
    7. 配置目标的实际长宽

在RTX 3060、Ubuntu18.04、X86主机环境中通过测试,其他环境(如ARM上)可能会遇到问题

介绍

Prometheus开源视觉模块,内置多种无人机视觉模块包括:二维码检测、YOLOv3目标识别算法(开箱即用)、YOLOv5目标识别算法、高速轻量的KCF跟踪算法,以及先进的高精度跟踪算法SiamPRN,同时也包含一些基础的知识,例如相机标定。

整个Prometheus开源视觉模块由视觉图像输入、视觉算法、无人机控制算法组成,各个部分相互解耦合实现模块复用。视觉图像输入包含USB相机、MIPI相机、视频流、视频文件、转化为ROS图像话题发布。视觉算法从ROS图像话题中获取图像,识别处理图像后,发布从图像中获取相应到信息(目标像素位姿,类别等)以及可视化处理后的图像话题。无人机控制算法获取到目标信息后给无人机发送相应指令,完成相关程序任务(如降落,跟踪)。

目录

  1. 环境安装与配置
  2. 视觉功能汇总
  3. 仿真教学例程
    1. 二维码自主降落
    2. 二维码探寻降落
    3. SiamRPN框选追踪
    4. YOLOv5+SiamRPN点击跟踪
  4. 扩展知识阅读(可选)
    1. SiamRPN算法概述
    2. YOLOv5算法概述
    3. YOLOv5自定义数据模型训练
    4. 二维码检测原理概述
    5. 图像输入话题
    6. 相机标定
    7. 配置目标的实际长宽

目标检测模块 - 环境配置

提示

如果只使用二维码检测,KCF等功能(更多见视觉功能汇总)就不必进行以下步骤配置,可直接编译运行.

配置 Melodic cv_bridge 支持 python3

sudo apt install ros-melodic-cv-bridge-python3

在每一个python3的脚本中,在文件头都要添加

#!/usr/bin/env python3

以及

import sys, os; sys.path.insert(0,'/opt/ros/' + os.environ['ROS_DISTRO'] + '/lib/python3/dist-packages/')

例如在SiamRPN跟踪中:

#!/usr/bin/env python3
import sys
import os
path = sys.path[0]
path = path + '/../../siam_rpn_lib/'
print(path)
sys.path.append(path)
sys.path.append("/../../../../devel/lib/python2.7/dist-packages")
sys.path.insert(0,'/opt/ros/' + os.environ['ROS_DISTRO'] + '/lib/python3/dist-packages/')
import rospy
import cv2
import torch
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge,CvBridgeError

安装Python3相关环境

  1. 安装并配置condaconda详细安装教程较多,自行搜索

  2. 配置安装所需环境,进入object_detection目录cd Prometheus/Modules/object_detection, 执行:

conda env create -f conda_env_gpu.yaml # 有GPU,英伟达驱动
# conda env create -f conda_env_cpu.yaml # 无GPU,Nvidia驱动(siamrpn框选跟踪,YOLOv5等无法运行)
  1. 等待上一命令执行完成后,conda会创建一个prometheus_python3名字的python虚拟环境。激活环境conda activate prometheus_python3.

  2. 验证环境是否安装正确。执行以下命令,如果返回的不是/usr/bin/python3就说明正确安装。比如我这里返回的是/home/onx/.conda/envs/prometheus_python3/bin/python3

conda activate prometheus_python3
which python3
  1. 加入.bashrc,启动时自动激活prometheus_python3环境
echo "conda activate prometheus_python3" >> ~/.bashrc
  1. (可选)如果不需要或者重复安装时报错,可以先删除prometheus_python3环境,再执行命令
conda env remove -n prometheus_python3
# 进入~/.bashrc删除`conda activate prometheus_python3`该行

目标检测模块 - 功能概览

本文中,如果不作特别说明的均可以插上摄像头直接运行。另外,大部分程序都需要Nvidia Cuda环境,默认您有Nvidia显卡,并且按照环境配置完成相关配置,其他无需CUDA环境的程序会做特别说明。

编译目标检测功能包:终端运行./compile_control.sh或者./compile_all.sh

相机标定

创建一个标定板,运行后会在当前目录创建一个名为board_charuco_d6.png的图片,使用A4进行打印。

./Prometheus/Modules/object_detection/shell/create_board_charuco.sh

运行标定程序,程序会读取相机id为0的画面,根据画面提示,按c键添加标定图像(建议添加20张以上),然后按esc键程序开始根据获取到图像进行相机内参计算(画面会卡主,此时正在计算),等待计算完成。

./Prometheus/Modules/object_detection/shell/calibrate_camera_charuco_cam0.sh

将生成的文件重命名为calib_webcam_640x480.yaml替换掉Modules/object_detection/shell/calib_webcam_640x480.yaml中的文件。

更加详细内容请看相机标定

二维码检测(CPU)

Prometheus/Modules/object_detection/aruco_images/6X6_250中的二维码打印粘贴。运行以下程序,既可以获取二维码的ID、位姿等信息。

# 默认使用0号摄像头
roslaunch prometheus_detection web_cam0.launch
# 启动二维码检测
roslaunch prometheus_detection aruco_det.launch

YOLOv3通用目标检测

仅提供测试使用,暂无法自定义数据集训练模型,如果想训练自己的目标检测模型请参照使用YOLOv5 注意配置安装Nvidia驱动、CUDA,否则帧率只有1帧率

# 默认使用0号摄像头
roslaunch prometheus_detection web_cam0.launch
roslaunch prometheus_detection ms_coco_det.launch

KCF框选跟踪(CPU)

# 默认使用0号摄像头
roslaunch prometheus_detection web_cam0.launch
roslaunch prometheus_detection tracker_kcf.launch

SiamRPN框选跟踪

# 默认使用0号摄像头
roslaunch prometheus_detection web_cam0.launch
roslaunch prometheus_detection tracker_siamrpn.launch

其他

启动minip相机

roslaunch prometheus_detection mipi_cam_720p.launch

将视频文件转为ROS图像话题,修改input_video_dir路径为视频文件地址

roslaunch prometheus_detection video_replay.launch

YOLOv5(tensorrt加速版本)+目标跟踪。需要另外其他内容参考YOLOv5的使用部分

roslaunch prometheus_detection yolov5_nvidia_tensorrt.launch

相关msg说明

  • ArucoInfo.msg:Aruco二维码的信息
  • MultiArucoInfo.msg:MultiArucoInfo.msgz的数组表示
  • BoundingBox.msg:单个视觉检测框的信息
  • BoundingBoxs.msg:BoundingBox.msg的数组表示
  • DetectionInfo.msg:视觉检测反馈消息
  • MultiDetectionInfo.msg:DetectionInfo.msg的数组表示
  • GlobalAruco.msg:室内多二维码定位

无人机目标检测模块教学例程 - 二维码自主降落

二维码自主降落.gif

提示

建议阅览以下内容:

二维码检测概述

运行

  1. 打开终端,执行以下命令
./Prometheus/Scripts/simulation/tutorial_demo/autonomous_landing.sh
  1. 等待程序全部启动完成

使用步骤

  1. 点击图像话题右边的刷新按钮,切换rqt_image_view的图像话题到/uav1/prometheus/camera/rgb/image_landpad_det,查看二维码检测的可视化(无人机在没有起飞时,摄像头朝下画面可能为白色)

  2. 遥控器解锁无人机,并切换到RC_POS_CONTROL模式,等待无人机起飞并保持悬停(或手动飞行到一定高度)

  3. 遥控器切换到COMMAND_CONTROL,无人机飞行到一定高度识别二维码,执行降落程序,等待无人机完成降落

程序运行逻辑

image.png 视觉与控制分离为不同的ros节点。视觉节点从图像数据上提取目标信息(如目标类别,位姿等)并将消息发送出来;控制节点从视觉节点中拿到数据,控制无人机执行相应指令,实现视觉、控制的功能复用。

接收图像信息,检测二维码,发布降落点在相机坐标系下的位置,消息为Modules/common/prometheus_msgs/msg/DetectionInfo.msg

Modules/object_detection/cpp_nodes/markers_landpad_det.cpp

接收消息并结合无人机姿态、位置计算出目标在机体惯性坐标系下的位置

Modules/tutorial_demo/advanced/autonomous_landing/src/autonomous_landing.cpp

有了目标在机体惯性系坐标后,就可以根据各个方向的距离误差,动态控制无人机速度接近降落点降落。

  • Modules/common/prometheus_msgs/msg/DetectionInfo.msg: 包含对目标位置,姿态,视角的估计值。

无人机控制

视觉节点发布二维码降落板在无人机相机坐标系下到位姿,控制节点接收到此消息后结合相机距离无人机质心的安装偏移,姿态转化为机体惯性系下二维码降落板的位置。无人机根据降落板坐标,动态控制x、y、z三个方向上到速度(距离远速度越快),完成无人机的降落控制。

无人机目标检测模块教学例程 - 二维码自主降落

二维码自主降落.gif

提示

建议阅览以下内容:

二维码检测概述

运行

  1. 打开终端,执行以下命令
./Prometheus/Scripts/simulation/tutorial_demo/autonomous_landing.sh
  1. 等待程序全部启动完成

使用步骤

  1. 点击图像话题右边的刷新按钮,切换rqt_image_view的图像话题到/uav1/prometheus/camera/rgb/image_landpad_det,查看二维码检测的可视化(无人机在没有起飞时,摄像头朝下画面可能为白色)

  2. 遥控器解锁无人机,并切换到RC_POS_CONTROL模式,等待无人机起飞并保持悬停(或手动飞行到一定高度)

  3. 遥控器切换到COMMAND_CONTROL,无人机飞行到一定高度识别二维码,执行降落程序,等待无人机完成降落

程序运行逻辑

image.png 视觉与控制分离为不同的ros节点。视觉节点从图像数据上提取目标信息(如目标类别,位姿等)并将消息发送出来;控制节点从视觉节点中拿到数据,控制无人机执行相应指令,实现视觉、控制的功能复用。

接收图像信息,检测二维码,发布降落点在相机坐标系下的位置,消息为Modules/common/prometheus_msgs/msg/DetectionInfo.msg

Modules/object_detection/cpp_nodes/markers_landpad_det.cpp

接收消息并结合无人机姿态、位置计算出目标在机体惯性坐标系下的位置

Modules/tutorial_demo/advanced/autonomous_landing/src/autonomous_landing.cpp

有了目标在机体惯性系坐标后,就可以根据各个方向的距离误差,动态控制无人机速度接近降落点降落。

  • Modules/common/prometheus_msgs/msg/DetectionInfo.msg: 包含对目标位置,姿态,视角的估计值。

无人机控制

视觉节点发布二维码降落板在无人机相机坐标系下到位姿,控制节点接收到此消息后结合相机距离无人机质心的安装偏移,姿态转化为机体惯性系下二维码降落板的位置。无人机根据降落板坐标,动态控制x、y、z三个方向上到速度(距离远速度越快),完成无人机的降落控制。

无人机目标检测模块教学例程 - 二维码探寻降落

多二维码.gif

提示

建议阅览以下内容:

二维码检测概述

运行

  1. 打开终端,执行以下命令
./Prometheus/Scripts/simulation/tutorial_demo/find_aruco_marker.sh
  1. 等待程序全部启动完成

使用步骤

  1. 点击图像话题右边的刷新按钮,切换rqt_image_view的图像话题到/uav1/detection/image,查看二维码检测的可视化(无人机在没有起飞时,摄像头朝下画面可能为白色) image.png

  2. 输入二维码id,目前world中有id为1~20二维码,比如这里输入17 image.png

  3. 遥控器解锁无人机,并切换到RC_POS_CONTROL模式,等待无人机起飞并保持悬停(或手动飞行到一定高度)

  4. 遥控器切换到COMMAND_CONTROL,无人机绕圆飞行,并且在绕圆到过程中进行二维码识别,如果识别到与步骤2输入的Id相同的二维码,则终止圆飞行,前往对应二维码进行自主降落

程序运行逻辑

image.png 视觉与控制分离为不同的ros节点。视觉节点从图像数据上提取目标信息(如目标类别,位姿等)并将消息发送出来;控制节点从视觉节点中拿到数据,控制无人机执行相应指令,实现视觉、控制的功能复用。

检测发布所有二维码在相机坐标系位置

Modules/object_detection/cpp_nodes/aruco_det.cpp

接收二维码信息,转化为机体系坐标,在机体惯性坐标系控制无人机到达二维码上方悬停。

Modules/tutorial_demo/advanced/find_aruco_marker/src/main.cpp

无人机控制

无人机绕圆飞行,在绕圆的移动的过程中,持续进行检测二维码,实时将检测到的二维码与输入的二维码id进行匹配,如果id相同则终止绕圆飞行,执行二维码降落控制

无人机目标检测模块教学例程 - SiamRPN框选跟踪(没有Nvidia显卡无法使用)

siamrpn.gif

提示

建议阅览以下内容:

环境配置:

运行

  1. 打开终端进入Prometheus根目录,执行以下命令
roslaunch prometheus_demo siamrpn_track_all.launch
  1. 等待程序全部启动完成,2个终端窗口,1个图像窗口

使用步骤

  1. 框选目标

  2. 遥控器解锁无人机,并切换到RC_POS_CONTROL模式,等待无人机起飞并保持悬停(或手动飞行到一定高度)

  3. 遥控器切换到COMMAND_CONTROL。无人机接受程序控制指令,靠近目标,并在距离目标一定距离后保持悬停

程序运行逻辑

image.png 视觉与控制分离为不同的ros节点。视觉节点从图像数据上提取目标信息(如目标类别,位姿等)并将消息发送出来;控制节点从视觉节点中拿到数据,控制无人机执行相应指令,实现视觉、控制的功能复用。

加载siamrpn跟踪模型接收图像话题,发布Modules/common/prometheus_msgs/msg/DetectionInfo.msg消息。

Modules/object_detection/py_nodes/siamrpn_tracker/siam_rpn.py

接收发布的目标消息,控制无人机跟踪框选目标。

Modules/tutorial_demo/advanced/siamrpn_track/src/siamrpn_track.cpp

Modules/common/prometheus_msgs/msg/DetectionInfo.msg: 包含对目标位置,姿态,视角的估计值。

无人机控制

在视觉节点中,我们假设框选到的目标是人并且假定人的身高为1.7m。结合相机内参,目标框的高度估算相机到目标到直线距离,再根据目标中心到画面中心的像素误差计算,获得目标载相机坐标系下的位置。控制节点接收到消息后,结合相机质心到无人机质心的距离,转换为机体惯性系下的坐标。无人机根据目标的坐标动态控制x、y、z方向的速度跟踪目标,最后在目标前方保持悬停。

无人机目标检测模块教学例程 - YOLOv5+SiamRPN点击跟踪(没有Nvidia显卡无法使用)

YOLOv5.gif

提示

建议阅览以下内容:

YOLOv5算法概述

SiamRPN算法概述

YOLOv5自定义数据模型训练

已支持YOLOv7(动图见末尾)

此demo以支持使用使用YOLOv7作为目标识别,即YOLOv7+SiamRPN点击跟踪。 拥有更好的demo交互逻辑:
  • 同时支持框选跟踪和点击跟踪,可点击目标框,也可框选目标进行目标跟踪
  • 双击恢复目标检测,跟踪过程中双击可以恢复目标检测,停止目标跟踪

使用流程:

# 获取最新代码
git pull
# 切换Prometheus分支
git checkout yolov7
# 更新submodule获取yolov7代码,完成后就能在Modules/obect_detection/yolov7路径下看到相关代码
git submodule update --init --recursive  
# 重新编译
./complie_detection.sh
# 运行测试
./Scripts/simulation/tutorial_demo/yolov7_track.sh

安装说明

  • 进入Prometheus根目录,运行如下脚本
./Scripts/installation/object_detection/install_detection_yolov5tensorrt.sh

注意:确保以上脚本成功完成

运行

  • 打开终端进入Prometheus根目录,执行以下命令
roslaunch prometheus_demo yolov5_track_all.launch
# 另外开一个窗口运行进入Modules/object_detection_YOLOv5tensorrt路径
# 注意在prometheus_python3环境下执行领命,比如我的就是:
# (prometheus_python3) onx@onx:~$ python3 yolov5_tensorrt_client.py
python3 yolov5_trt_ros.py  --image_topic /prometheus/sensor/monocular_front/image_raw
  • 等待程序全部启动完成,2个终端窗口,1个图像窗口

使用步骤

  1. 点击目标

  2. 遥控器解锁无人机,并切换到RC_POS_CONTROL模式,等待无人机起飞并保持悬停(或手动飞行到一定高度)

  3. 遥控器切换到COMMAND_CONTROL。无人机接受程序控制指令,靠近目标,并在距离目标一定距离后保持悬停

程序核心逻辑

检测与跟踪模型加载

检测模型(YOLOv5的TensorRT版本)和跟踪模型(SiamRPN)在如下程序中加载(可自行修改替换):

Modules/object_detection_yolov5tensorrt/yolov5_trt_ros.py

注意:由于仿真环境,本程序的YOLOv5使用的x86分支版本,如果想要在NX等ARM的设备上使用切换分支。

程序支持从摄像头获取图像和从ros话题中获取图像(两种方式),如需测试,可使用如下命令:

python3 yolov5_trt_ros.py --no_tcp

程序运行逻辑

image.png

程序首先使用YOLOv5进行目标识别,在鼠标点击相应目标框后,将目标框的图像截取放入SiamRPN进行目标跟踪

注意:识别和跟踪的区别:识别,同一时刻,区分不同类别。跟踪,当前时刻与上时刻是否同一个物体,但不一定知道类别。

对于检测&跟踪的信息通过TCP协议发送,信息主要包括,类别、所在图像位置、当前所出状态(检测/跟踪)。

与ROS的接口定义

  • yolov5_tensorrt_client.py接收yolov5_trt_ros.py发送的TCP数据,转换为Modules/common/prometheus_msgs/msg/DetectionInfo.msgROS消息发送。

  • Modules/tutorial_demo/advanced/siamrpn_track/src/siamrpn_track.cpp接受目标信息控制无人机接近目标。

无人机控制

SiamRPN框选跟踪相同

YOLOv7演示

small.gif yolov7跟踪.gif

1 使用教程

Prometheus二维码检测使用教程如下图所示:

tutorial_aruco_1.jpg

具体请参考相应链接:

2 算法原理与参数说明

Aruco二维码检测的主要步骤如下:

  • 检测候选框
  • 四边形识别
  • 对检测到的靶标进行过滤、角点修正
  • 位姿估计

2.1 候选框检测

Aruco靶标外部由正方形框构成,因此,首先肯定要检测出候选框,因为图像受到透视变换的影响,导致正方形在图像上的投影可以为任意4边形,唯一可以知道的性质就是,这个4变形一定是具有凸性的,代码也是利用这个性质进行筛选的。如下图所示,该阶段检测绿色所示的4边形。

image-20210427175010713.png

OpenCV中检测目标候选框的代码为:

_detectCandidates(grey, candidates, contours, params);

其中,grey为输入的灰度图,candidates为候选框的4个顶点,是一个vector变量,每个vector元素就存了4个点。contours为候选框对应的轮廓像素集合,也是个vector变量,每个元素存储的是对应矩形框的像素集。params为算法的对应参数集合。contourscandidates个数一致,表示检测出的候选四边形个数。

候选4边形检测算法分为三个阶段:

  • 候选检测
  • 角点排序
  • 去除相似框

下面对每个阶段进行流程说明。

2.1.1 候选检测

候选检测阶段仅利用目标的凸性检测出4边形集合,对应函数为

_detectInitialCandidates(grey, candidates, contours, _params);

因为靶标的颜色仅有黑白,且与周围有明显的区分。因此,直接使用自适应二值化方法adaptiveThreshold提取候选目标,这个函数为OpenCV自带的函数,需要制定二值化窗口,和一个常数。

在这个阶段,算法使用了多种不同的窗口大小来检测4边形,这个时候adaptiveThreshWinSizeMin控制的是最小窗口,adaptiveThreshWinSizeMax控制的是最大窗口,adaptiveThreshWinSizeStep控制窗口步长,adaptiveThreshConstant是这个函数需要的一个常数。举例来说,算法设置的窗口范围为[3, 23],步长为10,那么最后选择的窗口大小就为:3、13、23,记住,窗口最好设置为奇数。

在得到二值化窗口之后呢,利用

findContours(contoursImg, contours, RETR_LIST, CHAIN_APPROX_NONE);

查找这个二值化图的所有轮廓,每个轮廓存在contours里面。下面对每一个轮廓进行如下的一个过程。

  • 特别大特别小的轮廓一般都不会是目标,最小周长阈值为minPerimeterPixels = minPerimeterRate * max(rows, cols),最大周长阈值为maxPerimeterPixels = maxPerimeterRate * max(rows, cols)
  • 对这个轮廓进行多边形逼近approxPolyDP(contours[i], approxCurve, double(contours[i].size()) * polygonalApproxAccuracyRate, true);approxCurve是这个轮廓的逼近点,double(contours[i].size()) * polygonalApproxAccuracyRate是对应的逼近精度,简单来说,越大的轮廓具有更大的逼近阈值,主要还是防止算法收到噪声影响。
  • 轮廓逼近点必须为4个点(四边形),且这个4边形一定是凸的,否则这个轮廓就一定不是目标轮廓。
  • 四边形的4个角点之间的最小距离minDistSq必须大于轮廓周长*minCornerDistanceRate,否则就不是候选。
  • 判断4边形是否存在一个角点离图像的边界非常近,打个比方,角点的坐标为(1, 1),与图像边界非常近,如果有那么这个就扔掉,边界距离阈值为minDistanceToBorder
  • 到这,就说明找到一个候选,存储对应的4个角点和对应的轮廓像素集。

2.1.2 角点排序

角点排序使用函数_reorderCandidatesCorners(candidates);,保证角点的顺序是顺时针方向,仅此而已。

2.1.3 去除相似四边形

距离特别近的4边形应该被扔掉,在

_filterTooCloseCandidates(candidates, candidatesOut, contours, contoursOut, _params->minMarkerDistanceRate);

实现这个功能。

对于两个4边形,其4个角点之间的最短平均距离如果小于两个矩形的最小周长*minMarkerDistanceRate,那么就认为这两个矩形是相似的。矩形的周长就是轮廓像素个数,两个相似4边形,周长小的会被扔掉。

到这,将会得到一组候选的四边形集合,然后下一步对其进行精准识别。

2.2 二维码识别

下图是一个Aruco码标,一个黑色方块或白色方块就叫做一个比特,码标周围用了一圈黑色框围着,框的宽度为markerBorderBits,这里值为1。下图是一个6x6的码标套上一个宽度为1的框,所以实际上比特区域是8x8

image-20210427190810389.png

每个检测出的四边形,算法利用多线程对其进行解码,解码成功这说明这个是个靶标,解码流程如下所示啦。

  1. 对每个四边形利用getPerspectiveTransformwarpPerspective进行透视变换,透视变换的目标为方形,其边长为perspectiveRemovePixelPerCell*码标的比特边长
  2. 判断四边形内部是否为全黑或全白。先移除1/2边框,然后利用meanStdDev计算区域的均值和方差,如果方差小于minOtsuStdDev,说明是全黑或全白,如果均值大于127,则认为是全白,否则全黑。
  3. 利用大津阈值对透视变换后的图像做个二值化threshold(resultImg, resultImg, 125, 255, THRESH_BINARY | THRESH_OTSU);
  4. 因为已经知道码标的边长的比特数,那么就直接对二值化图像提取出对应的图像块。图像块的四周靠近边界部分肯定有噪声,所以四周边界部分扔掉,那么这个边界宽度为cellMarginPixels = perspectiveRemoveIgnoredMarginPerCell * perspectiveRemovePixelPerCell
  5. 利用countNonZero统计比特块的非0个数,如果非0个数超过图像一般,则认为这个块是白色,否则是黑色,最后将这个码标用一个8x8的bits矩阵存储。
  6. 码标边界都是黑色,因此利用int _getBorderErrors(const Mat &bits, int markerSize, int borderSize)统计边界黑色的个数,如果错误块个数大于编码块总数*maxErroneousBitsInBorderRate,则认为边界错误,导致编码错误。
  7. 剔除边界信息,提取码标比特信息存进onlyBits输入dictionary->identify(onlyBits, idx, rotation, params->errorCorrectionRate)进行解码,解码失败就说明这个不是目标,解码成功,并返回一个值,来确定哪个角点是左上第一个角点。

到这码标识别结束,返回码标信息和对应的轮廓及角点。

2.3 对检测出的靶标进行过滤

检测结果中可能会出现两个码标ID一样,且其中一个码标在另一个码标里面,属于包含关系(OpenCV源码说双边框情况会出现这个问题,算是算法的一个Bug)。

那么针对这个情况就要先找出具有包含关系的矩形,判断ID是否一样,一样就删掉。函数声明如下所示。

void _filterDetectedMarkers(vector< vector< Point2f > >& _corners, vector< int >& _ids, vector< vector< Point> >& _contours)

角点修正

前面步骤检测出的角点都是像素级的,用于后续位姿估计时候可能会有误差,因此检测出角点之后,需要对其进行细化,得到亚像素角点,细化方法有两种,分别为:

  • 角点细化(CORNER_REFINE_SUBPIX)
  • 拟合直线细化(CORNER_REFINE_CONTOUR)

细化方法的选择,指定参数cornerRefinementMethod即可,算法默认是不细化的。

角点细化方法

利用opencv自带函数cv::cornerSubPix()可将像素级角点细化为亚像素,其中涉及到三个参数,cornerRefinementWinSize细化窗口大小,cornerRefinementMaxIterations细化最大迭代数,cornerRefinementMinAccuracy细化误差。

拟合直线细化方法

该细化方法是对4边形的每个边进行拟合,然后利用拟合直线的交点作为最终细化的角点。

  1. 如果相机有畸变,利用undistortPoints对四边形像素点进行校正。
  2. 提取两个角点之间的像素集,也就是4边形的每个边
  3. 对每个边进行直线拟合
  4. 计算交点

最终的交点就作为亚像素角点。

详细的参数定义如下图所示:

image-20210428103802528.png

2.4 位姿估计

PnP(Perspective-n-Point)是求解3D到2D点对运动的方法。它描述了已知n个3D空间点及其图像上的投影位置时,如何估计相机的位姿。

PnP问题有很多种求解方法,例如,用3对点估计位姿的P3P、直接线性变换(DLT)、EPnP、UPnP,等等。此外,还能用非线性优化的方法,构建最小二乘问题并迭代求解,也就是万金油的Bundle Adjustment。

Bundle Adjustment是一个最小化重投影误差(Reprojection error)问题。

1 使用教程

Prometheus二维码检测使用教程如下图所示:

tutorial_aruco_1.jpg

具体请参考相应链接:

2 算法原理与参数说明

Aruco二维码检测的主要步骤如下:

  • 检测候选框
  • 四边形识别
  • 对检测到的靶标进行过滤、角点修正
  • 位姿估计

2.1 候选框检测

Aruco靶标外部由正方形框构成,因此,首先肯定要检测出候选框,因为图像受到透视变换的影响,导致正方形在图像上的投影可以为任意4边形,唯一可以知道的性质就是,这个4变形一定是具有凸性的,代码也是利用这个性质进行筛选的。如下图所示,该阶段检测绿色所示的4边形。

image-20210427175010713.png

OpenCV中检测目标候选框的代码为:

_detectCandidates(grey, candidates, contours, params);

其中,grey为输入的灰度图,candidates为候选框的4个顶点,是一个vector变量,每个vector元素就存了4个点。contours为候选框对应的轮廓像素集合,也是个vector变量,每个元素存储的是对应矩形框的像素集。params为算法的对应参数集合。contourscandidates个数一致,表示检测出的候选四边形个数。

候选4边形检测算法分为三个阶段:

  • 候选检测
  • 角点排序
  • 去除相似框

下面对每个阶段进行流程说明。

2.1.1 候选检测

候选检测阶段仅利用目标的凸性检测出4边形集合,对应函数为

_detectInitialCandidates(grey, candidates, contours, _params);

因为靶标的颜色仅有黑白,且与周围有明显的区分。因此,直接使用自适应二值化方法adaptiveThreshold提取候选目标,这个函数为OpenCV自带的函数,需要制定二值化窗口,和一个常数。

在这个阶段,算法使用了多种不同的窗口大小来检测4边形,这个时候adaptiveThreshWinSizeMin控制的是最小窗口,adaptiveThreshWinSizeMax控制的是最大窗口,adaptiveThreshWinSizeStep控制窗口步长,adaptiveThreshConstant是这个函数需要的一个常数。举例来说,算法设置的窗口范围为[3, 23],步长为10,那么最后选择的窗口大小就为:3、13、23,记住,窗口最好设置为奇数。

在得到二值化窗口之后呢,利用

findContours(contoursImg, contours, RETR_LIST, CHAIN_APPROX_NONE);

查找这个二值化图的所有轮廓,每个轮廓存在contours里面。下面对每一个轮廓进行如下的一个过程。

  • 特别大特别小的轮廓一般都不会是目标,最小周长阈值为minPerimeterPixels = minPerimeterRate * max(rows, cols),最大周长阈值为maxPerimeterPixels = maxPerimeterRate * max(rows, cols)
  • 对这个轮廓进行多边形逼近approxPolyDP(contours[i], approxCurve, double(contours[i].size()) * polygonalApproxAccuracyRate, true);approxCurve是这个轮廓的逼近点,double(contours[i].size()) * polygonalApproxAccuracyRate是对应的逼近精度,简单来说,越大的轮廓具有更大的逼近阈值,主要还是防止算法收到噪声影响。
  • 轮廓逼近点必须为4个点(四边形),且这个4边形一定是凸的,否则这个轮廓就一定不是目标轮廓。
  • 四边形的4个角点之间的最小距离minDistSq必须大于轮廓周长*minCornerDistanceRate,否则就不是候选。
  • 判断4边形是否存在一个角点离图像的边界非常近,打个比方,角点的坐标为(1, 1),与图像边界非常近,如果有那么这个就扔掉,边界距离阈值为minDistanceToBorder
  • 到这,就说明找到一个候选,存储对应的4个角点和对应的轮廓像素集。

2.1.2 角点排序

角点排序使用函数_reorderCandidatesCorners(candidates);,保证角点的顺序是顺时针方向,仅此而已。

2.1.3 去除相似四边形

距离特别近的4边形应该被扔掉,在

_filterTooCloseCandidates(candidates, candidatesOut, contours, contoursOut, _params->minMarkerDistanceRate);

实现这个功能。

对于两个4边形,其4个角点之间的最短平均距离如果小于两个矩形的最小周长*minMarkerDistanceRate,那么就认为这两个矩形是相似的。矩形的周长就是轮廓像素个数,两个相似4边形,周长小的会被扔掉。

到这,将会得到一组候选的四边形集合,然后下一步对其进行精准识别。

2.2 二维码识别

下图是一个Aruco码标,一个黑色方块或白色方块就叫做一个比特,码标周围用了一圈黑色框围着,框的宽度为markerBorderBits,这里值为1。下图是一个6x6的码标套上一个宽度为1的框,所以实际上比特区域是8x8

image-20210427190810389.png

每个检测出的四边形,算法利用多线程对其进行解码,解码成功这说明这个是个靶标,解码流程如下所示啦。

  1. 对每个四边形利用getPerspectiveTransformwarpPerspective进行透视变换,透视变换的目标为方形,其边长为perspectiveRemovePixelPerCell*码标的比特边长
  2. 判断四边形内部是否为全黑或全白。先移除1/2边框,然后利用meanStdDev计算区域的均值和方差,如果方差小于minOtsuStdDev,说明是全黑或全白,如果均值大于127,则认为是全白,否则全黑。
  3. 利用大津阈值对透视变换后的图像做个二值化threshold(resultImg, resultImg, 125, 255, THRESH_BINARY | THRESH_OTSU);
  4. 因为已经知道码标的边长的比特数,那么就直接对二值化图像提取出对应的图像块。图像块的四周靠近边界部分肯定有噪声,所以四周边界部分扔掉,那么这个边界宽度为cellMarginPixels = perspectiveRemoveIgnoredMarginPerCell * perspectiveRemovePixelPerCell
  5. 利用countNonZero统计比特块的非0个数,如果非0个数超过图像一般,则认为这个块是白色,否则是黑色,最后将这个码标用一个8x8的bits矩阵存储。
  6. 码标边界都是黑色,因此利用int _getBorderErrors(const Mat &bits, int markerSize, int borderSize)统计边界黑色的个数,如果错误块个数大于编码块总数*maxErroneousBitsInBorderRate,则认为边界错误,导致编码错误。
  7. 剔除边界信息,提取码标比特信息存进onlyBits输入dictionary->identify(onlyBits, idx, rotation, params->errorCorrectionRate)进行解码,解码失败就说明这个不是目标,解码成功,并返回一个值,来确定哪个角点是左上第一个角点。

到这码标识别结束,返回码标信息和对应的轮廓及角点。

2.3 对检测出的靶标进行过滤

检测结果中可能会出现两个码标ID一样,且其中一个码标在另一个码标里面,属于包含关系(OpenCV源码说双边框情况会出现这个问题,算是算法的一个Bug)。

那么针对这个情况就要先找出具有包含关系的矩形,判断ID是否一样,一样就删掉。函数声明如下所示。

void _filterDetectedMarkers(vector< vector< Point2f > >& _corners, vector< int >& _ids, vector< vector< Point> >& _contours)

角点修正

前面步骤检测出的角点都是像素级的,用于后续位姿估计时候可能会有误差,因此检测出角点之后,需要对其进行细化,得到亚像素角点,细化方法有两种,分别为:

  • 角点细化(CORNER_REFINE_SUBPIX)
  • 拟合直线细化(CORNER_REFINE_CONTOUR)

细化方法的选择,指定参数cornerRefinementMethod即可,算法默认是不细化的。

角点细化方法

利用opencv自带函数cv::cornerSubPix()可将像素级角点细化为亚像素,其中涉及到三个参数,cornerRefinementWinSize细化窗口大小,cornerRefinementMaxIterations细化最大迭代数,cornerRefinementMinAccuracy细化误差。

拟合直线细化方法

该细化方法是对4边形的每个边进行拟合,然后利用拟合直线的交点作为最终细化的角点。

  1. 如果相机有畸变,利用undistortPoints对四边形像素点进行校正。
  2. 提取两个角点之间的像素集,也就是4边形的每个边
  3. 对每个边进行直线拟合
  4. 计算交点

最终的交点就作为亚像素角点。

详细的参数定义如下图所示:

image-20210428103802528.png

2.4 位姿估计

PnP(Perspective-n-Point)是求解3D到2D点对运动的方法。它描述了已知n个3D空间点及其图像上的投影位置时,如何估计相机的位姿。

PnP问题有很多种求解方法,例如,用3对点估计位姿的P3P、直接线性变换(DLT)、EPnP、UPnP,等等。此外,还能用非线性优化的方法,构建最小二乘问题并迭代求解,也就是万金油的Bundle Adjustment。

Bundle Adjustment是一个最小化重投影误差(Reprojection error)问题。

1 使用教程

Prometheus目标框选跟踪使用教程如下图所示:

image.png

具体请参考相应链接:

2 算法原理

Siamese-RPN 框架由用于特征提取的孪生子网络(Siamese Net)和用于目标生成的区域建议子网络(Region Proposal Network,RPN)组成。其中,RPN子网中有两个分支,一个分支负责前景-背景分类,另一个分支用于建议区域微调。含有待跟踪目标的图像块被送入该框架中,整个系统能够以端到端的方式进行训练。

20220125171813524.png

相机标定

创建一个标定板,运行后会在当前目录创建一个名为board_charuco_d6.png的图片(已经内置在Modules/object_detection/shell/board_charuco_d6.png),使用A4进行打印

./Modules/object_detection/shell/create_board_charuco.sh

board_charuco_d6.png

运行标定程序,程序会读取相机id为0的画面,根据画面提示,按c键添加标定图像(建议添加20张以上),然后按esc键程序开始根据获取到图像进行相机内参计算(画面会卡住,此时正在计算),等待计算完成

./Modules/object_detection/shell/calibrate_camera_charuco_cam0.sh

将生成的文件重命名为calib_webcam_640x480.yaml替换掉Modules/object_detection/shell/calib_webcam_640x480.yaml中的文件

使用方式可以参考Modules/object_detection/launch/aruco_det.launch文件对标定参数的使用

对于create_board_charuco中参数含义如下

"{w        |       | Number of squares in X direction }"
"{h        |       | Number of squares in Y direction }"
"{sl       |       | Square side length (in meters) }"
"{ml       |       | Marker side length (in meters) }"
"{d        |       | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,"
"DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, "
"DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"
"DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"
"{@outfile |<none> | Output file with calibrated camera parameters }"
"{v        |       | Input from video file, if ommited, input comes from camera }"
"{ci       | 0     | Camera id if input doesnt come from video (-v) }"
"{dp       |       | File of marker detector parameters }"
"{rs       | false | Apply refind strategy }"
"{zt       | false | Assume zero tangential distortion }"
"{a        |       | Fix aspect ratio (fx/fy) to this value }"
"{pc       | false | Fix the principal point at the center }"
"{sc       | false | Show detected chessboard corners after calibration }"
"{cw       |       | (MIPI parameter) Camera width }"
"{ch       |       | (MIPI parameter) Camera height }"
"{dw       |       | (MIPI parameter) Display width }"
"{dh       |       | (MIPI parameter) Display height }"
"{fr       |       | (MIPI parameter) Framerate }"
"{fm       |       | (MIPI parameter) Flip method }";

图像输入话题

理论上,Prometheus目标检测模块允许来自任意ROS图像话题的输入。这里仅给出Prometheus目标检测模块内置的3种图像话题输入节点:USB摄像头、MIPI摄像头、视频文件

USB摄像头

lg_camera

购买链接:https://item.jd.com/4206044.html

使用方式(插入USB摄像头后开启节点即可):

# 首先启动相机节点,如下命令启动相机ID=0
roslaunch prometheus_detection web_cam0.launch

注意查看相机的ID号,lsusb

  • 默认输出话题:/prometheus/camera/rgb/image_raw

MIPI摄像头

mipi_camera

购买链接:https://www.arducam.com/product/b0183-arducam-imx219-distortioin-m12-mount-camera-module-raspberry-pi-compute-module/

使用方式(确认连接MIPI相机并重启后):

roslaunch prometheus_detection mipi_cam_720p.launch
  • 默认输出话题:/prometheus/camera/rgb/image_raw

视频文件

运行视频文件主要是为了方便对算法进行调试,使用方式如下:

roslaunch prometheus_detection video_replay.launch
  • 注意修改launch的输入参数:input_video_dir
  • 会顺序播放input_video_dir文件夹中的所有视频
  • 默认输出话题:/prometheus/object_detection/video_replay

1 使用教程

Prometheus通用目标检测使用教程如下图所示:

tutorial_objdet_1.jpg

具体请参考相应链接:

2 算法原理

YOLOv5结构如下:

YOLOv5.jpg

其主要创新如下:

2.1 CSPNet(Cross Stage Partial Network)网络模块

翻译为跨阶段局部网络,主要目的是缓解以前需要大量推理计算的问题:

  • 增强了CNN的学习能力,能够在轻量化的同时保持准确性。
  • 降低计算瓶颈
  • 降低内存成本

CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。

2.2 Neck尺度特征融合模块

YOLOv5的Neck和YOLOv4中一样,都采用FPN+PAN的结构。FPN是自顶向下,将高层的强语义特征传递下来,对整个金字塔进行增强,不过只增强了语义信息,对定位信息没有传递。PAN就是针对这一点,在FPN的后面添加一个自底向上的金字塔,对FPN补充,将低层的强定位特征传递上去,又被称之为“双塔战术”。

2.3 损失函数的改进

20220125160256992.png

2.4 数据集

2.4.1 行人检测数据集

  • Caltech行人数据库:该库是目前规模较大的行人数据库,库中的图像来源于车载摄像机,与现实生活中图像的实际遮挡频率一致,其中包含质量不太好的图像。数据集分为训练集和测试集,但测试集的标注信息尚未公开。该数据库为评估已有的行人检测器的性能提供了一个较好的平台。地址:http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/
  • WiderPerson数据集:WiderPerson数据集是一个行人检测基准数据集,其中的图像从各种场景中选择,不再局限于交通场景。该数据集一共包含13382张图像,并用各种遮挡标记了大约40万条注释。其中8000、1000、4382张图像分别作为训练、验证和测试子集。地址:http://www.cbsr.ia.ac.cn/users/sfzhang/WiderPerson/
  • 夜间行人数据集NightOwls:与白天条件相比,夜间行人检测更具挑战性,因为光照、反射、模糊和对比度不断变化。NightOwls由40个序列中的27.9万帧组成,由行业标准相机在3个国家/地区的夜间记录,包括不同的季节和天气条件。所有帧都经过完全标注,并包含额外的目标属性,例如遮挡、姿势和难度,以及用于跨多个帧识别同一目标的跟踪信息。地址:https://www.nightowls-dataset.org/
  • EuroCity-Persons数据集:EuroCity-Persons在超过47300张图像中手动标记了超过238200个行人实例,比以前用于基准测试的行人数据集大了近一个数量级。该数据集在整个欧洲范围采集得到,以保证多样性。地址:https://eurocity-dataset.tudelft.nl/eval/overview/home

2.4.2 车辆检测数据集

  • UA-DETRAC数据集:UA-DETRAC是一个具有挑战性的真实世界多目标检测和多目标跟踪基准。该数据集包括在中国北京和天津的24个不同地点使用Cannon EOS 550D相机拍摄的10小时视频。视频以每秒25帧(fps)的速度录制,分辨率为960×540像素。UA-DETRAC数据集中有超过14万个帧,手动注释了8250个车辆,总共有121万个标记的对象边界框。地址:http://detrac-db.rit.albany.edu/
  • VisDrone数据集:VisDrone数据集覆盖了中国从北到南14个不同城市的不同城市/郊区。作为有史以来最大的此类数据集,VisDrone能够在无人机平台上对视觉分析算法进行广泛的评估和研究。地址:http://aiskyeye.com/
  • UAVDT数据集:无人机数据集对于目标跟踪而言是一大挑战,近年来,正对无人机的数据集也越来越多,UAVDT是ICCV2018提出的一个数据集,共包含80000帧图片,不仅可以用于目标跟踪,也可以用于目标检测等。地址:https://paperswithcode.com/dataset/uavdt

2.5 训练方案

16430954657571.jpg

训练流程如上图所示,分为2种方式,也可以结合使用:

  • 采集图像,用SpireImageTools进行标注
  • 将已有数据集转换为Spire格式,方便查看修改

具体图像标注与训练过程,后面会录制一个视频详细说明。

目标检测模块教程-训练检测模型

1.数据标注

下载数据集标注工具,下载地址,数据集管理软件SpireImageTools:gitee地址或者github地址

  • 解压,打开标注软件 SpireImageTools_x.x.x.exe

首先点击Tools->Setting...,填写一个 save path (所有的标注文件都会存储在这个文件夹中)

spire-tools-save-path.jpg

  • 将拍摄的视频转为图像 (如果采集的是图像,则跳过这一步骤),点击 Input->Video, 选择要标注的视频。

spire-tools-open-video.jpg

然后,点击Tools->Video to Image

spire-tools-image2video.jpg

点击OK 后,等待完成,结果会存储在:

spire-tools-20200430182601.jpg

  • 打开需要标注的图像,点击菜单Input->Image Dir, 找到需要标注的图像所在文件夹 ,按Ctrl+A,全选,打开所有图像:

spire-tools-20200430182620.jpg

  • 点击菜单Tools->Annotate Image->Box Label,开始标注图像

image-20210404154814396.png

label中填写待标注目标名称,然后将对话框拖到一边。

  • 开始标注,在主窗口中开始标注,鼠标滚轮放大缩小图像按住左键移动可视图像区域不断点击左键将目标框包围,使用YOLO训练时,点击2个点即可

image-20210404155716652.png

标注时,如果点错,按鼠标右键可以取消。标注完成后,如果不满意,可以点击绿色边框(边框会变红,如下图所示),按Delete删除

image-20210404160443123.png

  • 继续标注行人类别:

image-20210404161102231.png

  • 全部标注完成后,将标注输出为YOLO格式,准备训练——在标注完成之后,按下Ctrl+o

image-20210404161654460.png

点击OK即可,需要等待转换。

  • 注意,如下两个文件夹是我们训练YOLOv5需要的

image-20210404162131412.png

2. 开始训练YOLOv5

在准备好scaled_imagesyolo_labels两个文件夹之后,我们就可以训练YOLOv5了。首先,创建一个car_person.yaml,将其放到<path-to-Prometheus>/Modules/object_detection_yolov5tensorrt/data/文件夹下。car_person.yaml的具体内容如下:

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: data/car_person/images/train/
val: data/car_person/images/train/

# number of classes
nc: 2

# class names
names: ['car', 'person']

注意1car_person是自定义名称,我们这次标注的数据集仅有这2个类别。 注意2names: ['car', 'person']这里的类别顺序需要跟yolo_categories.names里的类别顺序一致。

  • 将训练图像与标注拷贝到对应位置

首先,在<path-to-Prometheus>/Modules/object_detection_yolov5tensorrt/data/下新建一个文件夹car_person然后,在car_person下再新建2个文件夹imageslabels最后,将准备好的scaled_images拷贝到images下,并重命名为train;将准备好的yolo_labels拷贝到labels下,并重命名为train

结合car_person.yaml里的内容,我想你应该明白上面目录结构的含义啦。

  • 开始训练
cd <path-to-Prometheus>/Modules/object_detection_yolov5tensorrt/
python3 train.py --img 640 --batch 16 --epochs 5 --data data/car_person.yaml --weights weights/yolov5s.pt

image-20210404171722755.png

显示以上内容说明训练成功!可以增加训练期数(--epochs 5)提升效果。

  • 部署训练好的模型

刚刚训练好的模型会保存在<path-to-Prometheus>/Modules/object_detection_yolov5tensorrt/runs/exp?/weights/best.pt?需根据自己的情况而定(最新训练的模型?为最大的数字),将best.pt重命名为yolov5s.pt,拷贝到<path-to-Prometheus>/Modules/object_detection_yolov5tensorrt/下,然后执行:

cd <path-to-prometheus>/Modules/object_detection_yolov5tensorrt
python3 gen_wts.py

配置目标的实际长宽

如果想输出目标位置,需要在类别描述文件中填写目标的高度与宽度(单位:m)同时需要完成相机标定,具体位置如下:

<path-to-Prometheus>/Modules/object_detection/py_nodes/yolov5_tensorrt_client/class_desc/coco.txt

如下图所示:

image-20210403231019265.png

如上图,以人(person)为例,设置宽度0.5m,高度1.8m

然后,需要修改源代码,这里以高度估计人距离摄像机的距离,并以此估计目标位置,所在源码位置如下:

<path-to-Prometheus>/Modules/object_detection/py_nodes/yolov5_tensorrt_client/yolov5_tensorrt_client.py
# 112-114行

如下图所示:

image-20210403231510904.png

cls==0用来判断是否为类别personcls_hs[cls]用来读取目标高度(读到的数就是我们写在coco.txt里的1.8m),camera_matrix[1][1]为垂直方向像素焦距(由相机标定参数文件决定),h物体的像素高度(为实时检测结果,并被归一化到[0,1]

附录:目标位置测量原理

image-20210404002310773.png

Demo学习-路径规划模块

分为三个模块

  • 仿真组件模块
  • motion_planning模块
  • ego_planner模块

目前模块逐步完善中,敬请期待!

仿真组件模块-simulator_utils

本模块为仿真组件模块,可用于辅助路径规划仿真,功能包括

  • 点云地图生成(map_generator)
  • 虚拟无人机(fake_odom)
  • rviz辅助显示(rviz_visualization)

map_generator

提示

map_generator节点可用于模拟真实环境中的感知信息,生成用于路径规划的全局点云和局部点云地图。

map_generator节点对应的源码文件路径如下,分别对应有map_generator.cpp和map_generator_node.cpp

/Prometheus/Modules/simulator_utils/map_generator

如何运行

全局点云

launch运行:

roslaunch prometheus_simulator_utils map_generator.launch
  • 启动后可以在rivz中看到绿色的全局点云
  • map_name为地图名称,注意选择与地图对应的gazebo world
  • 如果不需要启动gazebo显示,可以将gazebo_enable设置为false
  • swarm_num为无人机数量,默认为1
  • 与地图相关的参数可以在map_generator.cpp文件中修改,也可以引出到launch文件中修改,具体说明见代码注释
  • 此时由于没有发布无人机odom,因此在rviz中只能订阅到全局点云信息,而没有局部点云信息

image.png

运行结果展示

image.png

运行终端信息

默认的launch参数配置为

image.png

map_name和gazebo world应遵循如下对应关系

  • planning_test 对应 planning_test.world
  • planning_test2 对应 planning_test2.world

局部点云

launch运行:

roslaunch prometheus_simulator_utils map_generator.launch

image.png

运行结果

  • 启动之后可以在rviz中看到绿色的全局点云以及橙色的局部点云
  • 局部点云必须要使用到无人机的odom数据,这个launch启动也加载了fake_odom,会在下一章节中详细介绍fake_odom模块。

节点详解

image.png

节点图

gazebo节点与map_generator相互独立

  • 内置planning_test,planning_test2,random,test四种地图(可通过参数配置选择地图种类或自行构建地图,PS:如果需要gazebo显示,自行构建的地图需要自行构建gazebo环境)

定时发布全局点云数据

  • 话题名称:/map_generator/global_cloud
  • 话题类型:sensor_msgs::PointCloud2
  • 发布频率可通过参数配置,默认为1Hz

image.png

定时发布局部点云数据

  • 发布局部点云需提供无人机的odom信息,订阅话题为:/uav(id)/prometheus/odom
  • 话题名称:/uavid/map_generator/local_cloud
  • 话题类型:sensor_msgs::PointCloud2
  • 发布频率可通过参数配置,默认为10Hz

image.png

TODO

  • 目前laser_sim_node.cpp仍在测试阶段,功能为模拟激光雷达数据

Prometheus地面站

本章将为大家介绍Prometheus地面站。

简介

Prometheus地面站是使用Qt开发的基于Prometheus系统的人机交互界面,地面站采用TCP/UDP通信,避免了ROS1多机通信繁琐的配置。该地面站可以更快的让用户复现Prometheus系统的各种功能,并且同时适用于真机和仿真系统。

该地面站主要是配合Prometheus系统中控制模块( uav_control )开发的一个版本,支持无人机的起飞、降落、悬停、以及惯性系和机体系的移动控制,同时实现实时监控无人机的各种数据状态,同时在操作过程会有从机载端发送的反馈信息来提醒用户。

其他介绍

下载地址

注意

请将Prometheus更新到最新版本并下载最新地面站。

下载地址

目前支持版本:windows版本、ubuntu-x86版本

ubuntu版本需要手动添加权限:

#可执行文件为下载文件
chmod a+x 可执行文件

功能介绍

数据监控

地面站会实时显示无人机的状态,包括以下两个话题的数据:

  • 无人机状态:/uav*/prometheus/state
  • 无人机控制状态:/uav*/prometheus/control_state

具体数据内容可以参考Prometheus中common模块的prometheus_msgs功能包的msg,UAVState.msgUAVControlState.msg

信息反馈

地面站会根据用户操作、触发不同的信息反馈,根据信息反馈的提示可以更好的操作地面站。信息反馈话题如下:

  • 信息反馈:/uav*/prometheus/text_info

具体数据内容可以参考Prometheus中common模块的prometheus_msgs功能包的msg,TextInfo.msg

单机控制

地面站会根据用户的操作,发送不同的指令,其中起飞、降落、悬停是将指令数据已经封装好的按钮、点击即可发送对应数据。而移动则不同,需要配合移动模式的选择、共6种移动模式、分别为惯性系和机体系的位置、速度、定高,根据提示输入对应的预期位置或者预期速度,然后点击移动按钮即可。控制话题如下:

  • 无人机控制:/uav*/prometheus/command

具体数据内容可以参考Prometheus中common模块的prometheus_msgs功能包的msg,UAVCommand.msg

通信配置

编译通信模块

进入Prometheus路径。编译脚本文件,指令如下:

#编译
./compile_communication.sh
#注意:如果遇到找不到x264.h头文件
sudo apt-get install libx264-dev

检查通信状态

编译完成后,需要重启一下终端或者输入下列指令:

source devel/setup.bash

不然会导致通信节点启动失败。

# 启动通信节点
roslaunch prometheus_communication_bridge bridge.launch

通信节点启动完成后,打开地面站,输入对应ID以及IP点击添加即可。

检查上行数据

点击添加后运行通信节点出现下图所示表示正确:

通信成功.png

出现该打印信息说明地面站上传没问题。

检查下行数据

点击添加按钮后,地面站反馈框中只要有打印数据,说明下行数据没有问题。如下图所示:

反馈信息.png

界面说明及使用

Prometheus地面站UI展示

UI演示.png

上图为地面站UI界面,下面一一为大家介绍各个模块以及功能的使用。注:如果遇到输入框不能输入情况,请检查输入格式是否规范,因为所有输入框均已匹配正则表达式,所以不能输入无效数据。

无人机数据监控

无人机数据监控1.png

无人机数据监控2.png

上述两图均为数据监控。包括无人机的基本状态以及控制状态。

无人机反馈信息

无人机反馈信息.png

上图为Prometheus端反馈的消息打印而成,分为四个等级,分别为INFO、WARM、ERROR和FATAL。用于对自己的操作进行反馈提示,方便使用。

无人机添加、重置

无人机添加、重置.png

默认情况下打开地面站,ID和IP输入框都是可输入的,并且添加按钮也不会失效,上图为已成功添加无人机的图示。

在ID和IP输入完成后,在点击添加按钮前,请先保证通信节点的正常运行。正确添加完成后,无人机反馈信息界面中会有打印提示信息。

重置按钮为断开当前连接,并使输入框和添加按钮重新生效。

无人机控制

无人机控制.png

上图为地面站无人机控制模块。最上方三个按钮,起飞、降落、悬停直接点击即可使用。而移动按钮则需要配合移动模式的选择以及最下方期望位置或者期望速度的配合使用。

使用手册

以下使用,以仿真举例。真机的操作方式基本类似。

首先保证通信配置没有问题。

仿真节点启动

# 启动仿真
roslaunch prometheus_gazebo sitl_outdoor_1uav.launch

控制节点启动

# 启动控制节点
roslaunch prometheus_uav_control uav_control_main_outdoor.launch

通信节点启动

#启动通信节点
roslaunch prometheus_communication_bridge bridge.launch

以上三个节点没有固定的启动顺序。

地面站连接

无人机添加、重置.png

ID默认情况下(第一次使用,没有修改过launch文件)为1。也可通过查看Prometheus中launch文件确定,如果对Prometheus代码不熟悉,也可以通过通过rostopic list指令进行查看,如图:

id查看.png

此时就可以看到很多话题前缀均为 /uav 开头其中后面跟的数字就是ID。

IP是通信节点启动端的IP。

注意:如果地面站和通信节点不是运行在同一个电脑上,需要修改通信节点launch文件。

通信模块launch文件路径:/Prometheus/Modules/communication/launch

因为通信节点launch文件默认地面站IP为:127.0.0.1,修改如下:

launch文件修改.png

ID和IP输入完成后,点击添加按钮后,如果信息反馈框有数据打印说明连接成功。

在ID和IP输入完成后,点击添加按钮后,如果信息反馈框有数据打印说明连接成功。

地面站使用

注意:地面站控制需要当前无人机处于 COMMAND_CONTROL 模式。

起飞、降落、悬停不用多讲。

主要讲一下移动按钮,移动需要配合移动模式下拉框和x、y、z三轴位置或者速度进行控制。 下拉框可以选择6种模式,分别是惯性系和机体系下的位置、速度、定高模式。 单位为:[ m ] 或者 [ m/s ]

地面站移动.png

注:移动模式中最后为BODY为机体坐标系控制,没有的是惯性坐标系。

小提示:在进行速度控制时,可以通过点击悬停按钮进行停止。

Prometheus真机教程

本章真机教程内容仅提供基础教程,并且是以阿木实验室配套无人机Z410来进行讲解,其余无人机需要适当做出一定修改。

如果想实现更多功能需要自行移植Prometheus项目到无人机上或购买Prometheus配套无人机

警告

真机教程内容并不完善,也缺乏代码测试。目前该章节内容仅供参考

无人机组装

该无人机组装教程以阿木实验室推出的Z410机型为参考,如需购买,请点击下面购买链接

阿木实验室-Z410

无人机安装配套有视频教程—Z410无人机安装教程

安装流程

安装分电板、电调

准备物料

  1. 环氧板
  2. 机架碳板
  3. 分电板
  4. 电调
  5. 配套螺丝、螺丝柱、线材等其它材料
  6. 配套螺丝刀、电烙铁等其它工具

安装步骤

  1. 在环氧板上安装螺丝以及螺柱为分电板以及电调模块预留安装位置
  2. 将分电板和电调模块的安装孔位与环氧板上的螺丝对准后用螺母拧紧
  3. 使用电烙铁将电机线与电调模块连接为后续的电机连接做准备
  4. 将电机线从固定孔位穿过,并通过胶布或扎带等工具将电机线固定在环氧板凹槽内
  5. 将配套螺丝安装到机架碳板上
  6. 将电机安装螺丝安装到环氧板上,为机架碳板和电机安装预留安装位置

安装电机

准备物料

  1. 无人机主体(未安装完毕)
  2. 电机
  3. 配套螺丝、螺丝柱、线材、热缩管等其它材料
  4. 配套螺丝刀、电烙铁、热风枪、剥线钳等其它工具

安装步骤

  1. 将热缩管套进电机线中
  2. 使用电烙铁将电机与电机线连接
  3. 将热缩管移动至线材焊接点,并保证完全遮蔽焊接部位
  4. 使用热风枪加热热缩管使热缩管与线材紧密接触
  5. 将电机线多余部分塞入环氧板与机架碳板夹层中
  6. 将电机安装到机架碳板上
  7. 安装机臂螺丝

安装降压模块、电压回传模块

准备物料

  1. 无人机主体(未安装完毕)
  2. 降压模块
  3. 电压回传模块
  4. 配套线材等其它材料
  5. 配套螺丝刀、电烙铁等其它工具

安装步骤

  1. 使用电烙铁焊接降压模块以及配套线材
  2. 使用电烙铁焊接电压回传模块以及配套线材
  3. 使用电烙铁将降压模块与分电板连接
  4. 使用电烙铁将电压回传模块与分电板连接

安装脚架

准备物料

  1. 脚架碳板
  2. 减震绵
  3. 配套螺丝、螺丝柱等其它材料
  4. 配套螺丝刀等其它工具

安装步骤

  1. 在环氧板以及机架碳板上安装螺丝及螺丝柱为脚架预留安装接口
  2. 将一块脚架碳板安装上螺丝
  3. 将减震绵裁剪成合适大小后安装到脚架底部螺丝上
  4. 将两块脚架碳板连接,将海绵夹在两块脚架碳板中间
  5. 重复以上操作制作第二个脚架
  6. 将减震绵拆剪成合适大小,用长螺柱穿过减震绵,需要做两个
  7. 将带有减震绵的长螺柱将两块脚架连接
  8. 将脚架与无人机主体连接

安装飞控以及机载计算机

准备物料

  1. 飞控
  2. 减震板
  3. 机载计算机
  4. TTL转USB模块
  5. 配套螺丝、螺丝柱、碳板、3M胶、线材、碳板等其它材料
  6. 配套螺丝刀等其它工具

安装步骤

  1. 通过3M胶将飞控与减震板连接
  2. 将机载计算机安装到碳板上
  3. 将机载计算机和飞控模块安装到无人机主体上
  4. 通过TTL转USB模块一端连接至飞控telem2端口,另一端连接至机载计算机USB端口
  5. 通过电源线将飞控与分电板连接
  6. 通过电调线将飞控与电调模块连接

安装GPS模块、安全开关、蜂鸣器、数传模块、遥控器接收器、螺旋桨

准备物料

  1. GPS模块
  2. 安全开关
  3. 蜂鸣器
  4. 数传模块
  5. 遥控器接收器
  6. 配套螺丝、螺丝柱、碳板、3M胶、线材、碳板等其它材料
  7. 配套螺丝刀等其它工具

安装步骤

  1. 将GPS模块连接至飞控GPS Module端口,并固定在无人机主体上
  2. 将安全开关连接至飞控SWTICH端口,并固定在无人机主体上
  3. 将蜂鸣器连接至飞控BUZZER端口,并固定在无人机主体上
  4. 将数传模块连接至飞控TELEM1端口,并固定在无人机主体上
  5. 将遥控器接收器连接至飞控侧面的RC端口,并固定在无人机主体上
  6. 将螺旋桨安装到无人机电机上,需要区分顺时针和逆时针方向

整机检查

检查安装模块是否正常连接,相关连线通断是否正常

PX4固件以及参数配置

刷写PX4固件

准备内容:

1、一台装有QGC的电脑

2、数据线

3、Z410无人机

提示

prometheus_px4固件位于Prometheus/Experiment文件夹下,找到名为prometheus_Z410.px4文件,该文件为刷写的PX4固件。

QGC下载链接

将QGC打开,点击左上角按钮,点击设置,进入固件刷写界面

image.png

image.png

通过数据线将无人机飞控与电脑连接,QGC会弹出固件刷写提示框,点击高级设置,选择自定义固件

image.png

选择prometheus_px4.px4文件,等待刷写完毕即可

PX4参数修改

运行Prometheus真机示例demo前需要确认无人机飞控参数是否正确

将数据线断开后再重新打开QGC,再次插上数据线QGC会自动连接无人机

image.png

依然点击左上角按钮,点击设置,点击参数设置界面

image.png

  • EKF2_AID_MASK

    该参数为选择无人机定位数据来源参数,在搜索框内搜索aid可快速找到该参数,点击参数进入参数设置界面,选择use GPS,将定位数据来源设置为GPS。

image.png

  • EKF2_HGT_MODE

    该参数为选择无人机高度数据来源参数,在搜索框内搜索hgt可快速找到该参数,点击参数进入参数设置界面,选择Barometric pressure,将高度数据来源设置为气压计

image.png

  • MAV_0_CONFIG

    该参数为选择mavlink消息输出的接口,在搜索框内搜索mav可快速找到该参数,点击参数进入参数设置界面,选择TELEM2

image.png

  • SER_TEL2_BAUD

    该参数为选择TELM2接口波特率的参数,在搜索框内搜索tel2可快速找到该参数,点击参数进入参数设置界面,选择921600 8N1

image.png

注意

MAV_0_CONFIGSER_TEL2_BAUD两个参数的设置,是因为Prometheus项目代码默认为飞控与无人机通信采用TELEM2口,波特率为921600,如果机载计算机端与飞控连接方式改变,则相应地需要修改飞控参数以及Prometheus项目代码

机载计算机与飞控连接

硬件连接

下图为Pixhawk2.4.8的接口示意图,其中TELM2口引脚从左到右依次为5VTXRXCTSRTSGND

image.png

使用TTL转USB模块将飞控与机载计算机连接,需要连接TXRXGND

飞控TELEM2口的TX与TTL转USB模块的RX连接

飞控TELEM2口的RX与TTL转USB模块的TX连接

飞控TELEM2口的GND与TTL转USB模块的GND连接

IMG_20220711_143524.jpg

IMG_20220711_143348.jpg

软件连接

在上一节中PX4参数修改已经提到MAV_0_CONFIG以及SER_TEL2_BAUD两个连接相关的参数,飞控连接的软件设置按照教程内容设置即可。

在机载计算机端,需要确认Prometheus项目对应的MAVROS启动参数是否配置正确,文件位于Prometheus/Experiment/launch文件夹下,打开文件夹下的prometheus_experiment.launch文件,确认fcu_url参数是否为/dev/ttyUSB0:921600

image.png

真机实验

前提准备

  1. Z410无人机

Z410无人机已完全安装完毕并刷写完PX4固件相关内容,机载计算机上已安装配置好Prometheus系统(无需搭建仿真环境,核心组件包含Prometheus以及mavros)

  1. 地面端电脑

    地面端电脑运行Windows系统,需要安装有NoMachine以及QGC软件

  2. 无人机电池以及遥控器电池

    一块4S电池以及4节5号电池

  3. 无人机配套遥控器

    富斯I6-S遥控器

  4. 安全绳

调试阶段

  1. 数传模块通信测试

    按照阿木实验室官网提供的Z410-4B无人机使用手册连接上数传模块提供的wifi

  2. 软件程序运行测试

    输入以下命令,启动相关软件程序

    $ cd ${your prometheus path}/Prometheus/Scripts/experiment/tutorial_demo
    # 第一次启动该脚本时,需要添加可执行权限
    $ chmod +x takeoff_land.sh
    $ ./takeoff_land.sh
    

    该脚本会启动mavros、uav_control以及takeoff_land三个节点,通过查看脚本命令运行情况,确认各节点运行正常。

室外飞行测试

  1. 将无人机放置在室外环境中

  2. 将地面端电脑启动,连接上数传提供的wifi

  3. 地面端电脑通过NoMachine远程连接到无人机

  4. 在地面端电脑上启动QGC连接无人机飞控

  5. 确认无人机定位数据是否正常

    无人机在GPS定位良好情况下,无人机启动后如果没有移动过,无人机定位数据会有一定波动,但一般情况下为±3米内

  6. 在NoMachine中启动demo功能脚本文件

  7. 遥控器控制切换无人机控制模式为command_control(与仿真demo中遥控器操作一致)

建议先在Prometheus仿真系统当中熟悉相关程序运行以及遥控器控制相关内容

场景建模

一、介绍

  1. 打开场景编辑器
  2. UI介绍

二、导入平面图

三、添加特征

  1. 墙壁
  2. 添加门窗
  3. 添加楼梯
  4. 添加层
  5. 编辑建筑物 变更层数 编辑墙体 编辑门窗 添加颜色和纹理 保存场景 退出

四、模型编辑

  1. 保存退出
  2. 导出world

参考视频:

一、介绍

  • 在gazebo中,我们不仅可以对无人机建模,还可以对场景建模(即机器人所在环境),以下给大家介绍如何在gazebo中创建一栋房子,作为无人机的活动空间。

1、打开场景编辑器

启动gazebo,依次点击 Edit -> Building Editor, 或者使用快捷键 Ctrl+B 打开编辑器。界面如下:

image.png

2、UI介绍

该编辑器由以下3个区域组成:

  1. 调色板,在这里你可以选择你的建筑特征和材料。
  2. 2D视图,你可以导入楼层平面图,编辑器会根据平面图自动插入插入墙壁,门窗和楼梯。
  3. 3D视图,在这里你可以看到你的建筑物的预览。您还可以在其中为建筑物的不同部分分配颜色和纹理。

image.png

3、场景

  • 场景是模拟器的主要部分,是仿真模型显示的地方,你可以在这操作仿真对象,使其与环境进行交互。

图片.png

4、左右面板

图片.png

  • 左面板 启动Gazebo时,默认情况下界面会出现左侧面板。面板左上方有三个选项卡:

    • WORLD:“世界”选项卡,显示当前在场景中的模型,并允许你查看和修改模型参数,例如它们的姿势。你还可以通过展开“GUI”选项并调整相机姿势来更改摄像机视角。
    • INSERT:“插入”选项卡,向模拟添加新对象(模型)。要查看模型列表,您可能需要单击箭头以展开文件夹。在要插入的模型上单击(和释放),然后在场景中再次单击以添加它。
    • LAYER:“图层”选项卡可组织和显示模拟中可用的不同可视化组(如果有)。图层可以包含一个或多个模型。打开或关闭图层将显示或隐藏该图层中的模型。这是一个可选功能,因此在大多数情况下此选项卡将为空。要了解有关图层的更多信息,请查看gazebo官网。
  • 右侧面板 默认情况下Gazeb界面隐藏右侧面板。单击并拖动栏以将其打开。右侧面板可用于与所选模型(joint)的移动部件进行交互。如果未在场景中选择任何模型,则面板不会显示任何信息。

5、工具栏

  • Gazebo界面有两个工具栏。一个位于场景上方,另一个位于下方。 图片.png

  • 上部工作栏是Gazebo的主工具栏,它包含一些最常用的与模拟器交互的选项,例如:选择,移动,旋转和缩放对象等按钮; 创造一些简单的形状(如立方体,球体,圆柱体); 复制/粘贴模型选项。 -选择模式(select mode):在场景中导航

    • 翻译模式(translate mode):选择要移动的模型
    • 旋转模式(rotate mode):选择要旋转的模型
    • 缩放模式(scale mode):选择要缩放的模型
    • 撤消/重做(undo/redo):撤消/重做场景中的操作
    • 简单形状(simple shape):将简单形状插入场景中
    • 灯光(lights):为场景添加灯光
    • 复制/粘贴(copy/paste):在场景中复制/粘贴模型
    • Align:将模型彼此对齐
    • Snap:将一个模型与另一个模型对齐
    • 更改视图(change view):从各个角度查看场景
  • 底部工具栏 图片.png

  • 底部工具栏显示有关模拟的数据,如模拟时间及其与实际时间的关系。

    • “模拟时间”是指模拟运行时模拟器中时间流逝的速度。模拟时间可以比实时更慢或更快,具体取决于运行模拟所需的计算量。
    • “实时”是指模拟器运行时在现实生活中经过的实际时间。模拟时间和实时之间的关系称为“实时因子”(RTF)。它是模拟时间与实时的比率。RTF衡量模拟运行与实时相比的速度或速率。
    • Gazebo的世界状况每迭代一次,计算一次。你可以在底部工具栏的右侧看到迭代次数。每次迭代都会将模拟推进固定的秒数,称为步长。默认情况下,步长为1 ms。您可以按暂停按钮暂停模拟,并使用步骤按钮逐步执行几个步骤。

6、菜单栏

  • 像大多数应用程序一样,Gazebo顶部有一个应用程序菜单。某些菜单选项会显示工具栏中。在场景中,右键单击上下文菜单选项,可查看各种菜单。

图片.png

  • 注意: 一些 Linux 桌面隐藏应用程序菜单。 如果没有看到菜单,将光标移动到应用程序窗口的顶部,菜单就会出现。 图片.png

7、鼠标

鼠标操作方法,一般常用的就是“shift+鼠标左键”转换视角,“鼠标左键”平移视角,“滚轮”缩放大小

图片.png

二、导入平面图

  • 您可以从零开始创建建筑场景(参考第三、添加特征,来确定特征信息即可),也可以使用现有图像作为模板进行追溯。该图像可以是例如建筑物的2D激光扫描。
  • 这里给出示例平面图:

mmexport1680229529576.png

  • 然后按以下步骤操作:
  1. 点击调色板下方的 Import按钮。然后将会弹出 Import Image对话框。 image.png
  2. 选择平面图所在路径,然后单击 Nextimage.png image.png image.png
  3. 为确保在图像上绘制的墙以正确的比例显示,必须以像素/米(px/m)设置图像的分辨率。如果知道分辨率,则可以直接在对话框中输入分辨率,然后单击 Ok。在此示例中,我们不知道分辨率,但是我们知道图像中两点之间的真实距离(例如10米的墙壁),因此我们可以使用它来计算分辨率:
  • 点击墙的一端,然后在另一端释放。当您移动鼠标时,将显示橙色线,如下所示。 image.png image.png image.png
  • 现在,在对话框中输入以米为单位的距离(在这种情况下为10 m)。分辨率将根据您绘制的线条自动为您计算。 image.png
  • 最后,单击 Ok

三、添加特征

墙壁

  • 我们接下来会根据平面图绘制所有的墙壁。值得注意的是,稍后我们会将门窗附加到墙壁上,因此现阶段可以直接忽略门窗位置。如果你觉得墙壁不完美,不用担心,稍后我们将对其进行更加细致的编辑。
  1. 在调色板上,单击 Wall

image.png 2. 在2D视图上,在任意墙角单击开始绘制墙体。随着鼠标的移动,墙的长度也会跟着显示。

image.png

  1. 再次单击可以结束当前墙体的绘制,转而进入相邻墙体的绘制,如果想要取消绘制可以单击右键或者按下 esc。(这里跟cad sw的绘制直线有点类似)。 image.png

默认情况下,墙体会以15°和0.25 m递增,并且还会捕捉到现有墙的端点。如果不希望自动补抓,可在绘图时按住 Shift

添加门窗

注意:目前,门窗是墙上的简单孔。 让我们在平面图上所示的位置插入门窗。

在面板上,单击Window或Door。
在2D视图中移动鼠标时,要插入的特征会随之移动,在3D视图中其对应物也会随之移动。
单击所需位置以放置特征。![image.png](https://qiniu.md.amovlab.com/img/m/202303/20230331/1829474390216002965504000.png)

提示:将鼠标悬停在门上时,门窗会自动与墙壁对齐。移动时会显示到墙端的距离。![image.png](https://qiniu.md.amovlab.com/img/m/202303/20230331/1831154758321300009549824.png)

提示:在墙壁上添加了相关特征之后,可能很难看到其在平面图中的位置。为了简化操作,您可以在2D视图的顶部选择查看或隐藏当前级别的平面图或特征。您还可以使用热键来切换可见性,F对应floor和G对应特征。

image.png

编辑墙体

我们之前画了很多墙,但是也许它们并没有完全按照我们想要的方式绘制。我们有以下方式可以进行修改:

1、在2D视图中,单击要编辑的墙。

  • 通过将墙拖动到新位置来平移墙。
  • 通过拖动墙的端点之一来调整墙的大小或旋转墙。

2、在2D视图中双击墙以打开带有配置选项的检查器。或者,右键单击并选择 Open Wall Inspector。编辑你想要修改的内容,然后按 Apply预览更改。

3、选中你想要删除的墙体,按下键盘上的 Delete键,或在2D视图中右键单击墙体,选择 Delete

编辑门窗

  • 现在让我们一起编辑门窗。正如我们编辑墙体那样,也可以通过以下几种不同的方式更精确地控制门窗属性。
  1. 在2D视图中,单击要编辑的特征。 图片.png 图片.png

图片.png 图片.png

  • 通过将特征拖动到新位置来对其进行变换。
  • 拖动特征的旋转手柄来旋转特征。当前,只要将它们附着在墙上,它们的方向就不会改变。
  • 通过拖动端点之一来调整特征的宽度。
  1. 双击2D视图中的特征以打开带有配置选项的检查器。或者,右键单击并选择Open Window/Door Inspector
  2. 选中想要删除的特征,按下键盘的Delete键,或在2D视图中右键单击并选择Delete。

添加颜色和纹理

  • 现在,一切都已正确放置并确定大小,您可以为墙壁,地板和楼梯分配颜色和纹理。请记住,门窗只是墙上的孔,因此不能有任何材料。 有两种方法可以为建筑物添加颜色和纹理:
  1. 您可以从Wall Inspector、Stairs Inspector和Level Inspector分别为墙壁,楼梯和地板添加颜色和纹理。只需打开检查器,选择材料,然后按Apply
  2. 可以从调色板中选择颜色和纹理,然后通过在3D视图中单击将其分配给建筑物中的项目。

图片.png

a、单击调色板中的颜色或纹理。 b、在3D视图中移动鼠标时,悬停的功能将突出显示,显示所选材质的预览。 c、单击突出显示的功能会为其分配选定的材料。您可以根据需要单击任意数量的功能。 d、完成所选材质的操作后,右键单击3D视图,或在任何要素外部单击以退出材质模式。

保存场景

图片.png

在选用板上给您的建筑物起个名字。 图片.png

退出

注意:一旦退出场景编辑器后,场景就不能够再次编辑了。 完成创建建筑物并保存之后,请转到File,然后单击Exit Building Editor,您的建筑物将显示在主窗口中。您可以在Insert标签中找到该场景。

图片.png

图片.png

图片.png

模型编辑

  • 打开模型编辑
  1. 点击edit
  2. 点击model editor 图片.png
  • 插入制作的模型
    • 插入位置可以通过工具调整,不需要第一次插入时通过鼠标调整位置。
  1. 点击insert
  2. 找到创建的模型
  3. 放置模型到场景中 图片.png
  • 使用translate mode移动模型
  1. 点击translate mode
  2. 选择要移动的模型
  3. 选择要移动的方向
  4. 正负X移动
  5. 正负Y移动
  6. 正负Z移动

图片.png

  • 使用rotate mode旋转模型
  1. 点击rotate mode
  2. 选择要旋转的模型
  3. 蓝色绕Z轴旋转模型,绿色绕Y轴旋转模型,红色绕X轴旋转模型

图片.png

  • 将模型抬高以增加地板 图片.png
  1. 插入正方体
  2. 放置到场景中
  3. 点击scale mode缩放模型
  4. 选择正方体

图片.png

  1. 将正方体缩放到合适大小
  2. 将正方形缩放模型放到之前模型下做为地板

图片.png

  • 将地板向上移动贴合第一个模型

图片.png

  • 插入其他模型
  1. 选择插入的模型
  2. 放置到场景中
  3. 选择移动工具
  4. 移动到地板之上合适位置

图片.png

保存退出

  1. 点击file保存文件
  2. 推出编辑(之后就不可以编辑模型,只能导出world)

图片.png

图片.png

图片.png

导出world

  • 将模型调整好位置后,即可导出world文件
  1. 点击file

  2. 点击save world as 图片.png

  3. 选择保存位置

  4. 保存文件名(文件名以 .world 结尾保存)

  5. 保存save 图片.png

  • 打开保存的world文件,即可复制数据到仿真文件中。

图片.png

其他

本章内容将介绍与Prometheus相关内容,包括Prometheus项目使用当中的常见问题、科学上网指引、PX4参数大纲、ROS常见指令。

ROS常见指令

  • roscore

    启动ROS核心程序,包含master主节点,ros参数服务器,ros日志记录节点

  • rosrun

    启动任意ros功能包中的可执行节点,运行rosrun命令需要确保ROS主节点已经启动

    # 用法示例
    rosrun package_name executable_name
    
  • roslaunch

    启动任意ros功能包中的launch文件,launch文件可启动多个ROS节点以及设置ROS参数,在启动launch文件时,会自动检测是否运行roscore,如果没有将自动运行

    # 用法示例
    roslaunch package_name launch_file.launch
    
  • rosnode

    显示ROS节点相关信息

    rosnode info    # 打印有关节点信息
    rosnode kill    # 杀死一个正在运行的节点
    rosnode list    # 列出所有正在运行的节点列表
    rosnode machine # 列出在特定机器上运行的节点或列出机器
    rosnode ping    # 测试节点的连接状态
    rosnode cleanup # 清除不可达节点的注册信息
    
  • rostopic

    显示ROS话题相关信息

    rostopic bw     # 显示话题的带宽
    rostopic delay  # 显示话题通信的延迟
    rostopic echo   # 打印话题中的消息内容
    rostopic find   # 按消息类型查找话题
    rostopic hz     # 话题发布消息的频率
    rostopic info   # 话题发布的信息
    rostopic list   # 显示话题列表
    rostopic pub    # 发布消息到某一话题
    rostopic type   # 打印话题消息类型
    
  • rosmsg

    显示ROS消息相关信息

    rosmsg show    # 显示消息的具体数据类型以及变量名
    rosmsg list    # 显示消息列表
    
  • rosservice

    显示ROS服务相关信息

    rosservice call # 使用提供的参数调用服务
    rosservice find # 按服务类型查找服务
    rosservice info # 打印服务的信息
    rosservice list # 显示服务列表
    rosservice type # 打印服务消息类型
    
  • rossrv

    rossrv show # 显示服务消息的具体数据类型以及变量名
    rossrv list # 显示服务消息列表
    
  • rosparam

    显示ROS参数相关信息

    rosparam list   # 显示参数列表
    rosparam get    # 获取参数变量
    rosparam set    # 设置某一参数值
    rosparam delete # 删除某一参数变量
    
  • rosclean

    清除ROS日志,超过1GB时,ROS系统会出现红字提醒

    rosclean check # 检查ROS日志文件的磁盘使用情况
    rosclean purge # 删除存储的ROS日志文件
    
  • roscd

    直接通过功能包名搜寻到目标功能包路径,也可以搜寻其他ROS文件或文件夹

  • rosbag

    记录ROS相关话题信息

    rosbag record # 记录某一话题信息
    rosbag info   # 总结一个bag文件的内容
    rosbag play   # 播放一个bag文件的话题信息
    rosbag check  # 确定一个bag文件在当前系统中是否可以播放或迁移
    rosbag fix    # 修复bag文件的信息,使其可以在当前系统中播放
    
  • catkin_init_workspace

    声明终端当前路径所在文件夹为ROS工作空间

  • catkin_create_pkg

    创建一个ros功能包,改命令后第一个参数为新建功能包名字,后面的参数为依赖功能包名

    # 用法示例
    catkin_create_pkg package_name depend1 depend2 depend3
    

ubuntu系统软件推荐

常用软件推荐

  • 安装Chrome浏览器
    • 安装包下载网址:http://www.ubuntuchrome.com/
    • 同步账户需要翻墙,需要先装个翻墙小工具,附上网址:https://github.com/getlantern/lantern
  • 安装搜狗输入法
    • 安装包下载网址:https://pinyin.sogou.com/linux/
    • 教程:https://blog.csdn.net/scuping/article/details/86697287
  • 安装VScode
    • 强推的IDE,下载地址:https://code.visualstudio.com/#alt-downloads
    • deb安装方式,下载后配合一些插件使用,更加高效!
  • 安装sublime
    • 轻量化的IDE,下载地址:http://www.sublimetext.com/
  • 安装Typora
    • MD文档编辑工具,下载地址:https://www.typora.io/
  • 安装GitKraken(推荐)
    • git GUI工具,下载地址https://www.gitkraken.com/
    • 部分功能需要付费,但是很好用
  • 安装Matlab2018a
    • 下载安装包:https://www.52pojie.cn/thread-713126-1-1.html
    • 安装教程:https://www.cnblogs.com/iwuqing/p/9833292.html
  • CPU温度检测插件
    • https://blog.csdn.net/yjt1325/article/details/84639500(似乎有点问题)
    • https://jingyan.baidu.com/article/a17d5285f043c38098c8f21d.html
  • AX200无线网卡驱动安装
    • 可能需要更新内核
    • 下载并安装驱动https://www.intel.com/content/www/us/en/support/articles/000005511/network-and-i-o/wireless-networking.html
  • 其他
    • 使ubuntu支持exfat格式的移动硬盘
      • sudo apt-get install exfat-utils

ubuntu系统美化

  • ubuntu美化之GNOME Shell插件 (强烈推荐)
    • 参考教程:https://linux.cn/article-9447-1.html
    • 推荐的GNOME Shell插件有
      • User Themes 管理主体
      • Dash to dock
      • Drop from terminal 下拉式终端
      • Netspeed 网速监控插件
      • Sound Input & Output Device Chooser 声音输入输出设备选择
      • Clipboard Indicator 剪切板管理
      • Screenshot Tool 截图插件
      • Removable Driver Menu U盘可插拔提示
      • EasyScreenCast 录屏插件
  • ubuntu美化之自定义主题
    • 前提是已经装好tweak工具,下载对应主题,并解压至home/.theme目录中,便可在tweak中选择相应的主题
    • 主题下载网址 https://www.pling.com/s/Gnome

其他

安装sudo rosdep init 下载失败解决方案:https://blog.csdn.net/u013468614/article/details/102917569

科学上网指引

梯子工具推荐:https://stellar.dog/

网友教程:https://doc.fastgit.org/zh-cn/guide.html#web-%E7%9A%84%E4%BD%BF%E7%94%A8

常见问题

  • Q: 英伟达的板子能否跑仿真?

    A: 仿真不能在tx2和NX上跑,更加不推荐。仿真的合理配置是高性能的台式机。

  • Q: Prometheus镜像下载安装地址?

    A: 镜像地址 : https://mp.weixin.qq.com/s/rAtXVP2S5b1nGyHiY0eXgQ##

  • Q: 运行PX4仿真出现一些红字报错?

    A: 某些报错并不影响仿真运行,主要看某型有没有正常加载和运行。

  • Q: 树莓派4B可以运行Prometheus项目吗?

    A: 控制模块应该可以运行,但视觉模块应该不行。

  • Q: Prometheus支持ardupilot(APM)吗?

    A: Prometheus项目基于PX4,APM和PX4用mavros实现和飞控通信,但是需要一定量的改动。

PX4常用参数大纲以及说明

PX4无人机有非常多的参数,在仿真开发测试过程中,根据不同功能以及应用场景,都需要对无人机参数进行调整,常见的px4无人机参数可以参考以下资料,用户可根据自身开发以及测试需求更改无人机参数。

注意:不同PX4固件中参数略有差异,以下参数选择的PX4固件为1.12.3版本

传感器任务定义参数

  • COM_DL_LOSS_T

    参数说明:数据链路丢失时间阈值,在数据丢失时间达到阈值后,数据链路丢失模式触发

    单位: 秒(S)

    默认值:10.0

    最小值:5.0

    最大值:300.0

    备注:无

  • COM_RC_LOSS_T

    参数说明:RC丢失时间阈值,在RC丢失时间达到阈值后,它被认为丢失并且不再使用

    单位: 秒

    默认值:0.5

    最小值:0.0

    最大值:35.0

    备注:无

  • NAV_RCL_ACT

    参数说明:设置RC丢失故障保护模式

    单位:无

    默认值:0

    最小值:1

    最大值:6

    备注:1 - Hold 2 - Return 3 - Land 5 - Terminate 6 - Lockdown

  • COM_DISARM_LAND

    参数说明:降落后触发自动上锁时间,设置为非零的正值将会在降落后达到阈值后自动上锁,设置为0或负数为禁止该功能。

    单位: 秒

    默认值:2

    最小值:无

    最大值:无

    备注:无

  • COM_DISARM_PRFLT

    参数说明:不起飞时自动上锁时间,设置为一个非零时间,在该时间内预计无人机将起飞,如果无人机没有起飞则进行上锁,设置为负值则禁用。

    单位: 秒

    默认值:2

    最小值:无

    最大值:无

    备注:无

  • COM_ARM_WO_GPS

    参数说明:是否允许在无GPS的情况下进行解锁,默认允许在无GPS情况下进行解锁。

    单位:无

    默认值:10

    最小值:无

    最大值:无

    备注:0 - 需要GPS LOCK才能解锁,1 - 允许在无GPS情况下进行解锁

  • COM_LOW_BAT_ACT

    参数说明:电池故障保护模式,BAT_CRIT_THR和BAT_EMERGEN_THR可定义电池状态。

    单位:无

    默认值:0

    最小值:无

    最大值:无

    备注:0 - Warning,2 - Land mode 3 - 电池电量临界水平返航,紧急水平降落

  • COM_OF_LOSS_T

    参数说明:触发机载计算机控制信号丢失操作时间阈值,在板载计算机控制信号丢失时间达到该阈值后将触发信号丢失操作,配合COM_OBL_ACT以及COM_OBL_RC_ACT来使用

    单位:秒

    默认值:0

    最小值:0

    最大值:60

    备注:无

  • COM_OBL_ACT

    参数说明:设置机载计算机控制信号丢失故障保护模式

    单位:无

    默认值:0

    最小值:无

    最大值:无

    备注:-1 - 禁用 0 - Land 1 - Hold 2 - Return 3 - Terminate 4 - Lockdown

  • COM_OBC_LOSS_T

    参数说明:机载计算机连接丢失超时,发出连接丢失警告

    单位:秒

    默认值:5

    最小值:0

    最大值:60

    备注:无

  • COM_ARM_EKF_POS

    参数说明:允许解锁的 EKF position innovation test radio 值,高于该值则不能解锁

    单位:无

    默认值:0.5

    最小值:0.1

    最大值:1.0

    备注:无

  • COM_ARM_EKF_VEL

    参数说明:允许解锁的 EKF velocity innovation test radio 值,高于该值则不能解锁

    单位:无

    默认值:0.5

    最小值:0.1

    最大值:1.0

    备注:无

  • COM_ARM_EKF_HGT

    参数说明:允许解锁的 EKF height innovation test radio 值,高于该值则不能解锁

    单位:无

    默认值:1.0

    最小值:0.1

    最大值:1.0

    备注:无

  • COM_ARM_EKF_YAW

    参数说明:允许解锁的 EKF yaw innovation test radio 值,高于该值则不能解锁

    单位:无

    默认值:0.5

    最小值:0.1

    最大值:1.0

    备注:无

  • COM_ARM_IMU_ACC

    参数说明:IMU与加速度计差值最大值,高于该值则不能解锁

    单位:无

    默认值:0.7

    最小值:0.1

    最大值:1.0

    备注:无

  • COM_ARM_IMU_GYR

    参数说明:IMU与陀螺仪差值最大值,高于该值则不能解锁

    单位:无

    默认值:0.25

    最小值:0.02

    最大值:0.3

    备注:无

  • COM_ARM_MAG_ANG

    参数说明:磁场角度差值最大值,高于该值则不能解锁

    单位:度

    默认值:45

    最小值:3

    最大值:180

    备注:无

  • COM_ARM_MAG_STR

    参数说明:启动磁力强度预检检查,如果估算器检测到强磁场,则拒绝启动,EKF2_MAG_CHECK可启动检查

    单位:无

    默认值:1

    最小值:无

    最大值:无

    备注:无

  • COM_RCL_EXCEPT

    参数说明:指定忽略RC丢失且未触发故障保护动作的模式(额外的模式)

    单位:无

    默认值:2

    最小值:0

    最大值:31

    备注:bit0 - Mission bit1 - Hold bit2 - Offboard

  • COM_KILL_DISARM

    参数说明:触发kill之后多长时间后进行上锁

    单位:秒

    默认值:5

    最小值:0

    最大值:30

    备注:无

地理围栏

  • GF_MAX_HOR_DIST

    参数说明:无人机飞行范围的最大水平距离

    单位: 米

    默认值:0

    最小值:0

    最大值:10000

    备注:无

  • GF_MAX_VER_DIST

    参数说明:无人机飞行范围的最大垂直距离

    单位: 米

    默认值:0

    最小值:0

    最大值:10000

    备注:无

  • GF_ACTION

    参数说明:地理围栏违规行为,当无人机飞行超过地理围栏后触发的模式

    单位: 无

    默认值:2

    最小值:0

    最大值:5

    备注:0 - 不操作 1 - Warning 2 - Hold mode 3 - Return mode 4 - Terminate 5 - Land mode

返航

  • RTL_RETURN_ALT

    参数说明:返航模式飞行的高度

    单位: 米

    默认值:60

    最小值:0

    最大值:150

    备注:无

EKF2参数

  • EKF2_AID_MASK

    参数说明:控制数据融合和辅助方法(定位数据来源)

    单位: 无

    默认值:1

    最小值:0

    最大值:511

    备注: bit0 - 使用GPS bit1 - 使用光流 bit2 - 禁止IMU偏差估计 bit3 - 视觉位置融合 bit4 - 视觉偏航融合 bit5 - multi-rotor drag fusion bit6 - rotate external vision bit7 - GPS偏航融合 bit8 - 视觉速度融合

  • EKF2_HGT_MODE

    参数说明:确认EKF使用的高度数据的主要来源

    单位: 无

    默认值:0

    最小值:无

    最大值:无

    备注:0 - 气压计 1 - GPS 2 - 距离传感器 3 - 视觉

  • EKF2_EV_DELAY

    参数说明:相对于IMU测量的视觉位置估计器延迟

    单位: 毫秒

    默认值:175

    最小值:0

    最大值:300

    备注:无

  • EKF2_REQ_NSATS

    参数说明:使用GPS所需的最小卫星数量

    单位: 无

    默认值:6

    最小值:4

    最大值:12

    备注:无

  • EKF2_ACC_NOISE

    参数说明:用于协方差预测的加速度计噪声

    单位: m/s^2

    默认值:0.35

    最小值:0.01

    最大值:1.0

    备注:无

  • EKF2_GYR_NOISE

    参数说明:用于协方差预测的陀螺仪噪声

    单位: 无

    默认值:0.015

    最小值:0.0001

    最大值:0.1

    备注:无

  • EKF2_GPS_V_NOISE

    参数说明:GPS水平速度的测量噪声

    单位: m/s

    默认值:0.3

    最小值:0.01

    最大值:5.0

    备注:无

  • EKF2_GPS_P_NOISE

    参数说明:GPS位置的测量噪声

    单位: 无

    默认值:0.5

    最小值:0.01

    最大值:10.0

    备注:无

CBRK系列

  • CBRK_SUPPLY_CHK

    参数说明:电源检查使能

    单位: 无

    默认值:0

    最小值:0

    最大值:894281

    备注:该参数设置为894281将禁用电源有效检查

  • CBRK_RATE_CTRL

    参数说明:速率控制器输出使能

    单位: 无

    默认值:0

    最小值:0

    最大值:140253

    备注:参数设置为140253将禁用速率控制器uORB发布

  • CBRK_IO_SAFETY

    参数说明:IO安全使能

    单位: 无

    默认值:22027

    最小值:0

    最大值:22027

    备注:参数设置为22027将禁用IO安全

  • CBRK_AIRSPD_CHK

    参数说明:空速传感器使能

    单位: 无

    默认值:0

    最小值:0

    最大值:162128

    备注:参数设置为162128将禁用空速传感器检查

  • CBRK_FLIGHTTERM

    参数说明:飞行终止使能

    单位: 无

    默认值:121212

    最小值:0

    最大值:121212

    备注:此参数设置为121212将在触发失效保护操作或FMU丢失时禁用飞行终止动作

  • CBRK_ENGINEFAIL

    参数说明:电机故障检测使能

    单位: 无

    默认值:284953

    最小值:0

    最大值:284953

    备注:参数设置为284953将禁用电机故障检测

  • CBRK_BUZZER

    参数说明:蜂鸣器使能

    单位: 无

    默认值:0

    最小值:0

    最大值:782097

    备注:参数设置为782097将禁用蜂鸣器

  • CBRK_USB_CHK

    参数说明:USB连接检查使能

    单位: 无

    默认值:197848

    最小值:0

    最大值:197848

    备注:参数设置为197848将禁用USB连接检查

  • CBRK_VELPOSERR

    参数说明:位置检查使能

    单位: 无

    默认值:0

    最小值:0

    最大值:201607

    备注:设置为201607将禁用位置和速度检查

  • CBRK_VTOLARMING

    参数说明:固定翼模式解锁使能

    单位: 无

    默认值:0

    最小值:0

    最大值:159753

    备注:参数设置为159753将为VTOL启动固定翼模式解锁

多旋翼控制器参数

  • MPC_THR_MIN

    参数说明:自动推力控制中的最小推力

    单位: 无

    默认值:0.12

    最小值:0.05

    最大值:1.0

    备注:建议设置>0避免零推力自由落体

  • MPC_THR_MAX

    参数说明:自动推力控制中的最大推力

    单位: 无

    默认值:1.0

    最小值:0.0

    最大值:1.0

    备注:无

  • MPC_THR_HOVER

    参数说明:悬停推力

    单位: 无

    默认值:0.5

    最小值:0.1

    最大值:0.8

    备注:该参数对于降落检测的正常工作有影响

  • MPC_USE_HTE

    参数说明:悬停推力源选择器

    单位: 无

    默认值:1

    最小值:无

    最大值:无

    备注:设置为false使用固定参数MPC_THR_HOVER,设置为true使用悬停推力估计器估计的值

位置控制参数

  • MPC_POS_MODE ​ 参数说明:手动位置控制子模式

    单位:无

    默认值:4

    最小值:无

    最大值:无

    备注:0 - 简单位置控制 3 - 平滑位置控制(Jerk优化) 4 - 基于加速度的输入

  • MPC_Z_P

    参数说明:垂直位置误差的比例增益

    单位: 无

    默认值:1.0

    最小值:0.0

    最大值:1.5

    备注:无

  • MPC_Z_VEL_P_ACC

    参数说明:垂直速度误差的比例增益

    单位: 无

    默认值:4.0

    最小值:2.0

    最大值:15.0

    备注:无

  • MPC_Z_VEL_I_ACC

    参数说明:垂直速度误差的积分增益

    单位: 无

    默认值:4.0

    最小值:0.2

    最大值:3.0

    备注:无

  • MPC_Z_VEL_D_ACC

    参数说明:垂直速度误差的微分增益

    单位: 无

    默认值:0.0

    最小值:0.0

    最大值:2.0

    备注:无

  • MPC_VELD_LP

    参数说明:低通滤波器截止频率

    单位: HZ

    默认值:5.0

    最小值:0.0

    最大值:10.0

    备注:无

  • MPC_XY_P

    参数说明:水平位置误差的比例增益

    单位: 无

    默认值:0.95

    最小值:0.0

    最大值:2.0

    备注:无

  • MPC_XY_VEL_P_ACC

    参数说明:水平速度误差的比例增益

    单位: 无

    默认值:1.8

    最小值:1.2

    最大值:5.0

    备注:无

  • MPC_XY_VEL_I_ACC

    参数说明:水平速度误差的积分增益

    单位: 无

    默认值:0.4

    最小值:0.0

    最大值:60.0

    备注:无

  • MPC_XY_VEL_D_ACC

    参数说明:水平速度误差的微分增益

    单位: 无

    默认值:0.2

    最小值:0.1

    最大值:2.0

    备注:无

  • MPC_LAND_SPEED

    参数说明:降落速度

    单位: m/s

    默认值:0.7

    最小值:0.6

    最大值:无

    备注:-

  • MPC_TKO_SPEED

    参数说明:起飞速度

    单位: m/s

    默认值:1.5

    最小值:1

    最大值:5

    备注:无

位置控制限制参数

  • MPC_XY_VEL_MAX

    参数说明:最大水平速度

    单位: m/s

    默认值:12.0

    最小值:0.0

    最大值:20.0

    备注:无

  • MPC_Z_VEL_MAX_UP

    参数说明:最大垂直上升速度

    单位: m/s

    默认值:3.0

    最小值:0.5

    最大值:8.0

    备注:无

  • MPC_Z_VEL_MAX_DN

    参数说明:最大垂直下降速度

    单位: m/s

    默认值:1.0

    最小值:0.5

    最大值:4.0

    备注:无

  • MPC_XY_ERR_MAX

    参数说明:轨迹发生器允许的最大水平误差

    单位: 无

    默认值:2.0

    最小值:0.1

    最大值:10.0

    备注:无

  • MPC_TILTMAX_AIR

    参数说明:空中最大倾斜角

    单位: 度

    默认值:45

    最小值:20

    最大值:89

    备注:无

  • MPC_TILTMAX_LND

    参数说明:着陆时的最大倾斜角

    单位: 度

    默认值:12

    最小值:10

    最大值:89

    备注:无

  • MPC_ACC_UP_MAX

    参数说明:速度控制模式下的最大垂直上升加速度

    单位: m/s^2

    默认值:4.0

    最小值:2.0

    最大值:15.0

    备注:-

  • MPC_ACC_DOWN_MAX

    参数说明:速度控制模式下的最大垂直下降加速度

    单位: m/s^2

    默认值:3.0

    最小值:2.0

    最大值:15.0

    备注:无

  • MPC_JERK_MAX

    参数说明:最大加加速度限制

    单位: m/s^3

    默认值:8.0

    最小值:0.5

    最大值:500.0

    备注:仅在MPC_POS_MODE设置为3或4时使用,设置为最大值实际上会禁用限制

  • MPC_LAND_RC_HELP

    参数说明:自主降落例行程序启用用户辅助下降速度,0选择MPC_LAND_SPEED固定速度,1选择用户辅助下降速度

    单位: 无

    默认值:0

    最小值:0

    最大值:1

    备注:摇杆最顶端速度为0,摇杆中间速度为MPC_LAND_SPEED, 摇杆最底部速度为 2 * MPC_LAND_SPEED

角度控制参数

  • MC_ROLL_P

    参数说明:横滚角度控制的比例增益

    单位: 无

    默认值:6.5

    最小值:0.0

    最大值:12

    备注:无

  • MC_PITCH_P

    参数说明:俯仰角度控制的比例增益

    单位: 无

    默认值:6.5

    最小值:0.0

    最大值:12

    备注:无

  • MC_YAW_P

    参数说明:偏航角度控制的比例增益

    单位: 无

    默认值:2.8

    最小值:0.0

    最大值:5.0

    备注:无

角度控制限制参数

  • MC_ROLLRATE_MAX

    参数说明:横滚最大角速度

    单位: deg/s

    默认值:220

    最小值:0.0

    最大值:1800.0

    备注:无

  • MC_PITCHRATE_MAX

    参数说明:俯仰最大角速度

    单位: deg/s

    默认值:220

    最小值:0

    最大值:1800

    备注:无

  • MC_YAWRATE_MAX

    参数说明:偏航最大角速度

    单位: deg/s

    默认值:200

    最小值:0.0

    最大值:1800.0

    备注:无

角速度控制参数

  • MC_ROLLRATE_P

    参数说明:横滚角速度的比例增益

    单位: 无

    默认值:0.15

    最小值:0.01

    最大值:0.5

    备注:无

  • MC_ROLLRATE_I

    参数说明:横滚角速度的积分增益

    单位: 无

    默认值:0.2

    最小值:0.0

    最大值:无

    备注:无

  • MC_ROLLRATE_D

    参数说明:横滚角速度的微分增益

    单位: 无

    默认值:0.003

    最小值:0.0

    最大值:0.1

    备注:无

  • MC_ROLLRATE_FF

    参数说明:横滚加速度的前馈

    单位: 无

    默认值:0.0

    最小值:0.0

    最大值:无

    备注:无

  • MC_ROLLRATE_K

    参数说明:横滚角速度控制器增益,控制器的全局增益

    单位: 无

    默认值:1.0

    最小值:0.01

    最大值:5.0

    备注:无

  • MC_PITCHRATE_P

    参数说明:俯仰角速度的比例增益

    单位: 无

    默认值:0.15

    最小值:0.01

    最大值:0.6

    备注:无

  • MC_PITCHRATE_I

    参数说明:俯仰角速度的积分增益

    单位: 无

    默认值:0.2

    最小值:0.0

    最大值:无

    备注:无

  • MC_PITCHRATE_D

    参数说明:俯仰角速度的微分增益

    单位: 无

    默认值:0.003

    最小值:0.0

    最大值:无

    备注:无

  • MC_PITCHRATE_FF

    参数说明:俯仰角速度前馈

    单位: 无

    默认值:0.0

    最小值:0.0

    最大值:无

    备注:无

  • MC_PITCHRATE_K

    参数说明:俯仰角速度控制器增益,控制器的全局增益

    单位: 无

    默认值:1.0

    最小值:0.01

    最大值:5.0

    备注:无

  • MC_YAWRATE_P

    参数说明:偏航角速度的比例增益

    单位: 无

    默认值:0.2

    最小值:0.0

    最大值:0.6

    备注:无

  • MC_YAWRATE_I

    参数说明:偏航角速度的积分增益

    单位: 无

    默认值:0.1

    最小值:0.0

    最大值:无

    备注:无

  • MC_YAWRATE_D

    参数说明:偏航角速度的微分增益

    单位: 无

    默认值:0.0

    最小值:0.0

    最大值:无

    备注:无

  • MC_YAWRATE_FF

    参数说明:偏航角速度的前馈

    单位: 无

    默认值:0.0

    最小值:0.0

    最大值:无

    备注:无

  • MC_YAWRATE_K

    参数说明:俯仰角速度控制器增益,控制器的全局增益

    单位: 无

    默认值:1.0

    最小值:0.0

    最大值:5.0

    备注:无

角速度控制限制参数

  • MC_RR_INT_LIM

    参数说明:横滚角速度积分限制

    单位: 无

    默认值:0.3

    最小值:0.0

    最大值:无

    备注:无

  • MC_PR_INT_LIM

    参数说明:俯仰角速度积分限制

    单位: 无

    默认值:0.3

    最小值:0.0

    最大值:无

    备注:无

  • MC_YR_INT_LIM

    参数说明:偏航角速度积分限制

    单位: 无

    默认值:0.3

    最小值:0.0

    最大值:无

    备注:无