px4+vio实现无人机室内定位

文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。

文章基于以下软、硬件展开。

硬件软件
机载电脑: Intel NUC系统:Ubuntu 20.04
相机: Intel Realsense D435iros:noetic
飞控:Pixhawk 2.4.8固件:PX4 1.14.0

完整vins_to_mavros 功能包地址:
https://github.com/rotorcraftman/px4ctrl

随着slam开源技术的普及,px4 要实现室内定位,实现方式很多,如文章使用的vins-fusion等视觉里程计,激光里程计等。
本质上,要实现无人机的室内定位有两个方法:
1.提供室内位置信息
室外可以用gps提供位置信息,实现定位,而室内因为gps没有信号,所以朴素的想法是只要提供位置信息给飞控就可实现像室外gps定位的效果了。
思路:
vio提供里程计—>(/mavros/vision_posion/pose)mavros(mavlink)—>px4
可以看出mavros起到了连接vio和px4的桥梁作用。
2.offboard
外部计算机遵守照MAVLink 协议提供的位置,速度或姿态设定值。 设定值可以由机载计算机上运行的 MAVLink API(例如 MAVSDK (opens new window) 或 MAVROS (opens new window))提供(通常通过串口或 wifi 连接)。
3.光流、UWB等。

接下来详细讲述第一种实现方式,vio以vins_fusion为例。

文章叙述展开方式默认已完成了px4飞控的建立、mavros的安装,未完成的同志可参考上一篇文章:
gazebo11+px4联合仿真测试

一、Pixhawk MAVLink Ports配置

配置Pixhawk Telem2作为与机载电脑数据交互的MAVLINK端口

MAV_1_CONFIG= TELEM 2
MAV_1_MODE = Onboard
SER_TEL2_BAUD = 921600 8N1

设置前参数里可能只有MAV_1_CONFIG,搜不到其他的参数,将MAV_1_CONFIG设置为TELEM 2,然后把飞控重启后其他参数就有了。
Pixhawk 2.4.8硬件,设置为102,参数对应关系如下。
在这里插入图片描述
详细参数介绍参见:https://docs.px4.io/main/en/advanced_config/parameter_reference.html

Pixhawk 2.4.8 TELEM1/TELEM2端口设置如下:

TELEM1TELEM2
MAV_0_CONFIG = TELEM 1MAV_1_CONFIG = TELEM 2
MAV_0_MODE = NormalMAV_1_MODE = Onboard
MAV_0_RATE= 1200 Bytes/sMAV_1_RATE= 0 (Half maximum)
MAV_0_FORWARD = TrueMAV_1_FORWARD = Disabled
SER_TEL1_BAUD = 57600SER_TEL2_BAUD = 921600

详细端口设置参见:https://docs.px4.io/main/en/peripherals/mavlink_peripherals.html

配置好端口后,需要做一根连接机载电脑和Pixhawk TELEM 2 端口的线,我这边直接用一个USB转TTL模块。
Pixhawk TELEM1 / TELEM2 端口线序图如下:

PinSignalVolt
1 (red)VCC+5V
2 (blk)TX (OUT)+3.3V
3 (blk)RX (IN)+3.3V
4 (blk)CTS (IN)+3.3V
5 (blk)RTS (OUT)+3.3V
6 (blk)GNDGND

其它端口详见:https://docs.px4.io/main/en/flight_controller/pixhawk.html#where-to-buy

展示一张做好的端子连接线如下:
在这里插入图片描述

在qgc上测试通信是否正常。

qgc-Application Settings-通讯连接-添加,设置如下。
在这里插入图片描述
正常情况下,就可通过TELEM 2连上QGC了。

二、在机载电脑上启动MAVROS

我这里用的是nuc的usb,设备名称:dev/ttyUSB0,按照自己实际情况配置。921600是波特率,就是前面设置的SER_TEL2_BAUD参数,改成设置值就行。

roslaunch mavros px4.launch fcu_url:=serial:=/dev/ttyUSB0:921600 gcs_url:=udp://@172.16.7.210

gcs_url:运行qgc主机的IP地址。
如果不想设置ip,可以设置为以下参数自动寻址。

roslaunch mavros px4.launch fcu_url:=serial:=/dev/ttyUSB0:921600 gcs_url:=udp-b://@

若出现报错
FCU: DeviceError:serial:open: Permission denied

解决方法是给对应的串口权限

sudo chmod 777 /dev/ttyUSB0

三、vins_fusion、mavros建立连接

思考vins_fusion的里程计数据如何发布给px4?
这也是实现室内定位的关键。实现这一步只需将vins_fusion里程计数据以话题 /mavros/vision_pose/pose 发布,mavros 收到/mavros/vision_pose/pose话题后,转化成mavlink通过TELEM 2传给飞控。于是就完成了vins_fusion和px4的连接。

接下来创建发布 /mavros/vision_pose/pose 话题的功能包过程了

1.创建工作空间px4ctrl

mkdir -p px4ctrl/src/
cd px4ctrl/src/

2.创建功能包vins_to_mavros

catkin_create_pkg vins_to_mavros roscpp std_msgs geometry_msgs mavros_msgs nav_msgs tf2_eigen tf

在px4ctrl/src/vins_to_mavros/src/ 目录下创建一个 vins_to_mavros 节点,主要功能:
(1)将 VINS-Fusion 的 body 坐标系在 world 坐标系下为位姿转化为 base_link 在 map 坐标系中的位姿;
(2)将转化后的位姿信息以话题 /mavros/vision_pose/pose 发布。

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <nav_msgs/Odometry.h>
#include <Eigen/Eigen>Eigen::Vector3d p_mav;
Eigen::Quaterniond q_mav;void vins_callback(const nav_msgs::Odometry::ConstPtr &msg)
{if(msg->header.frame_id == "world"){p_mav = Eigen::Vector3d(msg->pose.pose.position.y, -msg->pose.pose.position.x, msg->pose.pose.position.z);q_mav = Eigen::Quaterniond(msg->pose.pose.orientation.w, msg->pose.pose.orientation.x, msg->pose.pose.orientation.y, msg->pose.pose.orientation.z);Eigen::AngleAxisd roll(M_PI/2,Eigen::Vector3d::UnitX()); // 绕 x 轴旋转 pi / 2Eigen::AngleAxisd pitch(0,Eigen::Vector3d::UnitY());Eigen::AngleAxisd yaw(0,Eigen::Vector3d::UnitZ());Eigen::Quaterniond _q_mav = roll * pitch * yaw;q_mav = q_mav * _q_mav;}
}int main(int argc, char **argv)
{ros::init(argc, argv, "vins_to_mavros");ros::NodeHandle nh("~");ros::Subscriber slam_sub = nh.subscribe<nav_msgs::Odometry>("odom", 100, vins_callback);ros::Publisher vision_pub = nh.advertise<geometry_msgs::PoseStamped>("vision_pose", 10);// the setpoint publishing rate MUST be faster than 2Hzros::Rate rate(20.0);ros::Time last_request = ros::Time::now();while(ros::ok()) {geometry_msgs::PoseStamped vision;vision.pose.position.x = p_mav[0];vision.pose.position.y = p_mav[1];vision.pose.position.z = p_mav[2];vision.pose.orientation.x = q_mav.x();vision.pose.orientation.y = q_mav.y();vision.pose.orientation.z = q_mav.z();vision.pose.orientation.w = q_mav.w();vision.header.stamp = ros::Time::now();vision_pub.publish(vision);ROS_INFO("\nposition:\n   x: %.18f\n   y: %.18f\n   z: %.18f\norientation:\n   x: %.18f\n   y: %.18f\n   z: %.18f\n   w: %.18f", \p_mav[0],p_mav[1],p_mav[2],q_mav.x(),q_mav.y(),q_mav.z(),q_mav.w());ros::spinOnce();rate.sleep();}return 0;
}

3.配置 CMakeList.txt 文件

找到相应位置添加

add_executable(vins_to_mavros_node src/vins_to_mavros.cpp)
target_link_libraries(vins_to_mavros_node  ${catkin_LIBRARIES})

4.创建vins_to_mavros节点的launch文件

在目录px4ctrl/src/launch/ 创建vins_to_mavros.launch

<launch><node pkg="vins_to_mavros"  type="vins_to_mavros_node" name="vins_to_mavros" output="screen"><remap from="~vision_pose" to="/mavros/vision_pose/pose" /><remap from="~odom" to="/vins_estimator/odometry" /></node>
</launch>

5.编译

cd px4ctrl
catkin_make
source devel/setup.bash

6.验证

启动vins_to_mavros节点

roslaunch vins_to_mavros vins_to_mavros.launch

查看话题

rostopic list

显示如下:
在这里插入图片描述

PS:此处坐标系转化适配的是Realsense D435i相机,如其它相机需要根据相机imu坐标系与px4坐标系进行相应的转换。

四、联调测试

联调测试的基础是:
1.vins_fusion里程计精度尚可,且具有一定的鲁棒性;
2.px4飞控在自稳模式下手动可控、达到可飞条件。

关于vins_fusion的相关调试参见系列文章:
https://blog.csdn.net/u010196944/article/details/127240169

1.px4飞控设置

将px4定位数据源设置为vinsion,参数EKF2_AID_MASK设置为24,具体如下:

在这里插入图片描述

2.在终端依次输入:

在这里插入图片描述
此时qgc已连上,可在qgc作如下验证。

Analyze Tools-MAVlink检测,出现了LOCAL_POSITION_NED数据,如下:

在这里插入图片描述
验证:
(1)前后左右移动飞机,看看位置是否正确。
(2)前后移动飞机后,放回原位置看位置数据偏差是否大。

验证没问题之后,就可以起飞,通过qgc或者遥控器切换定位模式了。

在这里插入图片描述

完结,希望你一切顺利,不“炸鸡”。

参考

1.https://blog.csdn.net/u010196944/article/details/127240169
2.https://docs.px4.io/main/en/
3.https://zhuanlan.zhihu.com/p/364390798
4.https://blog.csdn.net/qq_44998513/article/details/133144421?spm=1001.2014.3001.5502

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

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

相关文章

服务器系列之 成功解决 com.jcraft.jsch.JSchException: Auth fail

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

如何使用rclone将腾讯云COS桶中的数据同步到华为云OBS

在多云策略与数据迁移趋势下&#xff0c;企业往往需要将数据在不同云服务提供商之间进行迁移。本文介绍如何使用rclone工具同步腾讯云COS&#xff08;Cloud Object Storage&#xff09;桶中的数据到华为云OBS&#xff08;Object Storage Service&#xff09;。先决条件是您已经…

Python---函数的应用案例(多个)

案例&#xff1a;使用print方法打印一条横线 print(- * 40) 案例&#xff1a;对上个案例进行升级&#xff0c;可以根据输入的num数值&#xff0c;生成指定数量的横线 def print_lines(num, length):""" print_lines函数主要作用用于生成多条指定长度的横线&…

快速幂极简写法快速幂求逆元

快速幂原理介绍 快速幂模板 int qmi(int a, int k, int p) {int res 1;while (k) {//后面的a其实是底数与其指数的运算结果了&#xff0c;是不断迭代的//第一个a其实就是a的2的0次方if (k & 1) res (res * a) % p;a (a * a) % p;//注意&#xff0c;a是一个不断变化的过…

Linux操作系统使用及C高级编程-D9D10Linux 服务搭建与使用

TFTP服务器 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;即简单文件传输协议&#xff0c;是TCP/IP协议中一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69 1、使用客户服务器方式和使用UDP数据…

python趣味编程-5分钟实现一个简单弹跳球游戏(含源码、步骤讲解)

简单的Python弹跳球程序是使用Python编程语言开发的。 Python 中的弹跳球游戏是 使用 Tkinter 和图形用户界面 (GUI) 设计的,它是一个桌面应用程序。 Python 中的弹跳球游戏代码使用Canvas 在 Python 中绘制对象和随机模块。

UVM项目笔记——通过寄存器模型实现AHB接口的寄存器读写(内含源码)

目录 1.前言 2.DRIVER实现 2.1 AHB二级流水时序 2.2 “队列错位法”实现driver 2.3 driver代码 2.4 仿真log与波形 2.5 多级流水拓展方法 1.前言 UVM driver在接口协议的实现中起着非常重要的作用&#xff0c;因为它一端处理基于类的事务级sequence&#xff0c;另一端处…

Pytorch从零开始实战10

Pytorch从零开始实战——ResNet-50算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50算法实战环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…

QT专栏2 -Qt for Android

#2023年11月18日 # Qt version 6.6 JDK17 JDK 安装 Java Downloads | Oracle 设置环境变量 鼠标右键我的电脑&#xff0c;出现如下界面 Qt配置 改用JDK18&#xff0c;没有乱码&#xff0c;由于不影响APK产生。 做了好多尝试&#xff0c;更换JDK版本(11,18,19,21)&…

labelImg

labelImg 在anaconda虚拟环境中安装labelImg 进入conda虚拟环境DL2中 输入命令&#xff1a; pip install PyQt5 pip install pyqt5-tools pip install lxml pip install labelimg PyQt5:是用于创建GUI应用程序的跨平台工具包&#xff0c;它将Python与Qt库融为一体 Lxml&#…

GDB Debugging Notes

1 Debugging programs using gdb 1.1 gdb简介 gdb是一个功能强大的调试工具&#xff0c;可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0c;主要涉及下面几个方面的操作&#xff1a; 启动程序:在启动程序时&#xff0c;可以设置程序运行环境。设置断点:程序…

Double 4 VR智能互动系统在轨道交通实训教学中的应用

Double 4 VR智能互动系统是一种集成了虚拟现实技术、人工智能和物联网技术的教学系统。计算机通过模拟真实的轨道交通环境&#xff0c;为学生提供了一个高度仿真的学习环境&#xff0c;帮助他们更好地理解和掌握轨道交通的相关知识和技能。 首先&#xff0c;Double 4 VR智能互动…

composer切换全局镜像源的方法

composer 默认配置中的镜像地址为国外的&#xff0c;在下载一些依赖包的时候会感觉很慢。当然国内也有很多composer镜像地址的&#xff0c;比如阿里云&#xff0c;腾讯云等。下面的博文73so博客就和大家说说&#xff0c;如何将composer的默认镜像改为国内镜像源的方法。 compo…

Redis跳跃表

前言 跳跃表(skiplist)是一种有序数据结构&#xff0c;它通过在每一个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。 跳跃表支持平均O(logN)&#xff0c;最坏O(N)&#xff0c;复杂度的节点查找&#xff0c;还可以通过顺序性来批量处理节点…

2021秋招-算法-递归

算法-递归 教程: ⭐告别递归&#xff0c;谈谈我的一些经验 LeetCode刷题总结-递归篇 基础框架 leetcode刷题 1.leetcode-101. 对称二叉树-简单 101. 对称二叉树 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。…

子虔与罗克韦尔自动化合作 进博会签约自动化净零智造联创中心

11月6日进博会现场&#xff0c;漕河泾罗克韦尔自动化净零智造联创中心合作协议签约暨合作伙伴&#xff08;第一批&#xff09;授牌仪式举办&#xff0c;子虔科技作为联创中心合作伙伴签约&#xff0c;携手共建智能制造&#xff0c;引领行业可持续发展。 图示&#xff1a;子虔科…

【电路笔记】-电源电压

电源电压 文章目录 电源电压1、概述1.1 交流发电机1.2 电池1.3 理想电压源1.4 实际电压源1.5 连接规则 2、相关源2.1 压控电压源 (VCVS)2.2 电流控制电压源 (CCVS) 3、总结 在本文中&#xff0c;我们详细介绍了称为电源电压的重要电子元件的架构、功能和使用。 我们首先提出理想…

从零开始学习typescript——数据类型

数据类型 以前我们用js编写代码的时候&#xff0c;都是直接使用let、var、const 来定义数据类型&#xff1b;js会在运行时来确定数据类型&#xff0c;但是在ts中&#xff0c;可以在声明时就可以指定数据类型。如果你学过其他编程语言&#xff0c;比如c、java就能更好的理解了。…

什么是神经网络(Neural Network,NN)

1 定义 神经网络是一种模拟人类大脑工作方式的计算模型&#xff0c;它是深度学习和机器学习领域的基础。神经网络由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0c;这些节点在网络中相互连接&#xff0c;可以处理复杂的数据输入&#xff0c;执行各种任务…

Docker安装Zookeeper

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…