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

news2024/9/27 9:22:43

文章主要讲述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 / 2
        Eigen::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 2Hz
    ros::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.coloradmin.cn/o/1236199.html

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

相关文章

ES7-ES13有何新特性?

目录 ES7 ES8 ES9 ES10 ES11 ES12 ES13 hello&#xff0c;大家好呀&#xff01;之前发布的两篇关于ES6新特性的文章学习完了吗&#xff1f;今天来给大家介绍ES6之后&#xff0c;截止到2022年的ES13每个时期新增的一些新特性&#xff01;快来一起学习吧&#xff01; ES7 …

html滑动文章标题置顶

position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如&#xff1a;AAA组件&#xff08;注意&#xff0c;只能有一层盒子&#xff0c;不能在外面继续包一层div&#xff09; <template><div class"box">{{title}}</div> </templa…

Docker 单节点部署 Consul

Docker 单节点部署Consul 1 Docker 拉取 Consul 镜像2 Docker 创建 Consul 容器3 启动 Consul 容器 CAP 原则是由计算机科学家 Eric Brewer 提出的&#xff0c;用于描述分布式系统中的一致性、可用性和分区容忍性之间的权衡关系&#xff0c;CAP 是三个概念的首字母缩写。 原则…

dolphinscheduler任务莫名重跑

dolphinscheduler运行了一段时间&#xff0c;忽然发现一个流程下某个任务一直在自动重跑&#xff0c;把工作流删了&#xff0c;任务删了&#xff0c;下线等等&#xff0c;都不能阻止他重复的运行&#xff0c;每秒1次&#xff0c;真是见了鬼 1、把zookeeper停掉发现不再重跑了 …

基于SSM的校内互助交易平台设计

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

idea开发jface、swt环境搭建

背景 jface、swt很难找到合适的maven仓库来下载配套的版本idea对eclipse套件不友好eclipse的windowbuilder固然很好&#xff0c; 但本人更喜欢idea编程&#xff0c; 互相取长补短 下载套件 进入swt下载界面 以当前最新的4.29为例&#xff0c; 点击&#xff1a; 找到全部并…

02-微服务的拆分规则和基于RestTemplate的远程调用

微服务的拆分与远程调用 创建父工程 任何分布式架构都离不开服务的拆分, 微服务也是一样 , 微服务的拆分遵守三个原则 微服务需要根据业务模块拆分,不同微服务不要重复开发相同业务每个微服务都有自己独立的数据库, 不要直接访问其他微服务的数据库微服务可以将自己的业务暴…

第28期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

多样式按钮

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

使用 ClickHouse 做日志分析

原作&#xff1a;Monika Singh & Pradeep Chhetri 这是我们在 Monitorama 2022 上发表的演讲的改编稿。您可以在此处找到包含演讲者笔记的幻灯片和此处的视频。 当 Cloudflare 的请求抛出错误时&#xff0c;信息会记录在我们的 requests_error 管道中。错误日志用于帮助解…

OpenHarmony 4.1计划明年Q1发布, 5.0预计Q3发布

据HarmonyOS官方组织透露&#xff0c;OpenHarmony 4.0 版本已于 10 月 26 日正式发布&#xff0c;开发套件同步升级到 API 10。开放原子开源基金会现更新了 OpenHarmony 4.1&5.0 版本路线图。据介绍&#xff0c;OpenHarmony 4.1 Beta 版本预计将于年底完成测试并发布&#…

如何用 GPTs 帮你写科研项目申请书?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 需求 学生们往往会觉得&#xff0c;写开题报告是个苦差事。但他们或许不知道&#xff0c;老师们写起科研项目申请书&#xff0c;压力远比他们…

RK3568平台开发系列讲解(Linux系统篇)kernel config 配置解析

🚀返回专栏总目录 文章目录 一、图形化界面的操作二、Kconfig 语法简介三、.config 配置文件介绍四、deconfig 配置文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig 是一套图形化的配…

Kafka 控制器(controller)

Kafka 控制器&#xff08;controller&#xff09; 在kafka集群中 会存在一个或者多个broker&#xff08;一个服务器就是一个broker&#xff09;&#xff0c;其中有一个broker会被选举为控制器 kafka controller &#xff0c;负责管理整个集群中所有副本、分区的状态&#xff0…

2021秋招-数据结构-栈、队列、数组、列表

栈、队列、数组、列表 实现方式 队列 class Queue:def __init__(self):self.items []def enqueue(self, item):self.items.append(item)def dequeue(self):return self.items.pop(0)def empty(self):return self.size() 0def size(self):return len(self.items)应用: 约瑟…

shell 脚本语句

目录 条件语句 test 命令 比较整数数值 字符串比较 命令举 条件逻辑测试操作 组合写法 举例 双中括号 ​编辑 ( ) / { } if 语句的结构 case 语句 脚本举例 识别 yes 和 no 脚本 检查磁盘使用情况脚本 新建用户以及随机设置用户密码的脚本 补充命令 [RANDOM…

Python+Qt虹膜检测识别

程序示例精选 PythonQt虹膜检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt虹膜检测识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推…

【C++进阶之路】第十一篇:C++的IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4.stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。prin…

京东数据分析(京东数据采集):2023年10月京东平板电视行业品牌销售排行榜

鲸参谋监测的京东平台10月份平板电视市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;10月份&#xff0c;京东平台上平板电视的销量将近77万&#xff0c;环比增长约23%&#xff0c;同比则下降约30%&#xff1b;销售额为21亿&#xff0c;环…

大数据Doris(二十七):Routine Load数据导入演示

文章目录 Routine Load数据导入演示 一、启动kafka集群(三台节点都启动) 二、创建topic