PX4 通过 Vision 实现 Position、Altitude 和 Offboard 模式

本文通过 VINS-Fusion 的里程计信息为 PX4 提供视觉信息,从而达到 视觉定高和定点 的目的

主要工作为创建一个将 vins 里程计信息发布给 Mavros 的 /mavros/vision_pose/pose 话题

首先创建一个工作空间

mkdir -p ~/catkin_ws/src/vision_to_mavros/src/
cd ~/catkin_ws/src/vision_to_mavros/src/

然后创建一个名为 vision_to_mavros 的功能包

catkin_create_pkg vision_to_mavros roscpp std_msgs geometry_msgs mavros_msgs nav_msgs tf2_eigen tf

在 ~/catkin_ws/src/vision_to_mavros/src/vision_to_mavros/src/ 目录下创建一个 vision_to_mavros 节点,其内容如下

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <nav_msgs/Odometry.h>
#include <Eigen/Eigen>Eigen::Vector3d p_vins;
Eigen::Quaterniond q_vins;void vins_callback(const nav_msgs::Odometry::ConstPtr &msg)
{if(msg->header.frame_id == "world"){// // vins 的坐标轴方向, y 轴朝前, x 轴朝右, z 轴朝上// p_vins = Eigen::Vector3d(msg->pose.pose.position.x, msg->pose.pose.position.y, msg->pose.pose.position.z);// q_vins = Eigen::Quaterniond(msg->pose.pose.orientation.w, msg->pose.pose.orientation.x, msg->pose.pose.orientation.y, msg->pose.pose.orientation.z);// vins 的坐标轴方向, y 轴朝前, x 轴朝右, z 轴朝上// 转化为 x 轴朝前, y 轴朝左, z 轴朝上p_vins = Eigen::Vector3d(msg->pose.pose.position.y, -msg->pose.pose.position.x, msg->pose.pose.position.z);q_vins = 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_vins = roll * pitch * yaw;q_vins = q_vins * _q_vins;}
}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_vins[0];vision.pose.position.y = p_vins[1];vision.pose.position.z = p_vins[2];vision.pose.orientation.x = q_vins.x();vision.pose.orientation.y = q_vins.y();vision.pose.orientation.z = q_vins.z();vision.pose.orientation.w = q_vins.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_vins[0],p_vins[1],p_vins[2],q_vins.x(),q_vins.y(),q_vins.z(),q_vins.w());ros::spinOnce();rate.sleep();}return 0;
}

然后在 ~/catkin_ws/src/vision_to_mavros/src/vision_to_mavros/launch/ 下创建一个 launch 文件用于启动该节点,其内容如下

<launch><node pkg="vision_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>

最后配置 CMakeList.txt 文件,在相应位置添加两行

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

完成后编译该功能包

cd ~/catkin_ws/src/vision_to_mavros/
catkin_make

编译完成后启动 d435i 相机和 vins 节点,以及刚刚编译好的 vision_to_mavros 功能包

注意到 vision_to_mavros 节点已经开始打印位置信息了

输入 rostopic list 打印当前话题

lilabws001@lilabws001:~$ rostopic list
/camera/accel/imu_info
/camera/gyro/imu_info
/camera/imu
/camera/infra1/camera_info
/camera/infra1/image_rect_raw
/camera/infra1/image_rect_raw/compressed
/camera/infra1/image_rect_raw/compressed/parameter_descriptions
/camera/infra1/image_rect_raw/compressed/parameter_updates
/camera/infra1/image_rect_raw/compressedDepth
/camera/infra1/image_rect_raw/compressedDepth/parameter_descriptions
/camera/infra1/image_rect_raw/compressedDepth/parameter_updates
/camera/infra1/image_rect_raw/theora
/camera/infra1/image_rect_raw/theora/parameter_descriptions
/camera/infra1/image_rect_raw/theora/parameter_updates
/camera/infra1/metadata
/camera/infra2/camera_info
/camera/infra2/image_rect_raw
/camera/infra2/image_rect_raw/compressed
/camera/infra2/image_rect_raw/compressed/parameter_descriptions
/camera/infra2/image_rect_raw/compressed/parameter_updates
/camera/infra2/image_rect_raw/compressedDepth
/camera/infra2/image_rect_raw/compressedDepth/parameter_descriptions
/camera/infra2/image_rect_raw/compressedDepth/parameter_updates
/camera/infra2/image_rect_raw/theora
/camera/infra2/image_rect_raw/theora/parameter_descriptions
/camera/infra2/image_rect_raw/theora/parameter_updates
/camera/infra2/metadata
/camera/motion_module/parameter_descriptions
/camera/motion_module/parameter_updates
/camera/realsense2_camera_manager/bond
/camera/rgb_camera/parameter_descriptions
/camera/rgb_camera/parameter_updates
/camera/stereo_module/auto_exposure_roi/parameter_descriptions
/camera/stereo_module/auto_exposure_roi/parameter_updates
/camera/stereo_module/parameter_descriptions
/camera/stereo_module/parameter_updates
/diagnostics
/feature_tracker/feature
/mavros/vision_pose/pose
/rosout
/rosout_agg
/tf
/tf_static
/vins_estimator/camera_pose
/vins_estimator/camera_pose_right
/vins_estimator/camera_pose_visual
/vins_estimator/extrinsic
/vins_estimator/image_track
/vins_estimator/imu_propagate
/vins_estimator/key_poses
/vins_estimator/keyframe_point
/vins_estimator/keyframe_pose
/vins_estimator/margin_cloud
/vins_estimator/odometry
/vins_estimator/path
/vins_estimator/point_cloud
/vins_estimator/rectify_pose_left
/vins_estimator/rectify_pose_right

我们发现已经有 /mavros/vision_pose/pose 这个话题了

接下来,只需要将飞控与机载电脑连接,然后启动 mavros 节点

roslaunch mavros px4.launch

具体的配置可以参考

Ubuntu 安装并配置 mavros (USB 连接)_ubuntu安装mavros_想要个小姑娘的博客-CSDN博客

接下来订阅 /mavros/state 话题,

rostopic echo /mavros/state

并查看节点状态,终端输入 rqt_graph

并且 /mavros/state 话题打印结果为

然后将遥控器连接上飞控,在 QGroundControl 中设置遥控器通道

将通道五设置为 模式切换通道,并且设置飞行模式 1 为 自稳模式,飞行模式 4 为位置模式,飞行模式 6 设置为高度模式,设置完成后退出 QGroundControl(启动QGroundControl 会中断 mavros 节点的运行),然后重新启用 mavros 节点

roslaunch mavros px4.launch

并打印输出 /mavros/state 话题信息

rostopic echo /mavros/state

此时将 通道五 拨动到中位,我们发现 模式切换为了 POSCTL,也就是 Position 模式

继续将 通道五 波动到上位,我们发现模式切换为了 ALTCTL,也就是 Altitude 模式

至此就通过 VINS-Fusion 的里程计数据实现了 PX4 的视觉定点和定高功能。

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

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

相关文章

贝叶斯滤波计算4d毫米波聚类目标动静属性

机器人学中有些问题是二值问题&#xff0c;对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门&#xff0c;机器人想判断这个门是开是关。这个二值状态是固定的&#xff0c;并不会随着测量数据变量的改变而改变。就像门…

企业架构LNMP学习笔记46

PHP测试连接代码&#xff1a; php代码测试使用memcached&#xff1a; 示例代码&#xff1a; <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…

python基于轻量级卷积神经网络模型开发构建眼疾识别系统

常见的眼疾包括但不限于以下几种&#xff1a; 白内障&#xff1a;白内障是眼睛晶状体变得模糊或不透明&#xff0c;导致视力下降。它通常与年龄相关&#xff0c;但也可以由其他因素引起&#xff0c;如遗传、外伤、糖尿病等。 青光眼&#xff1a;青光眼是一组引起视神经损伤的眼…

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

DC/DC开关电源学习笔记(十)Buck降压电路仿真及工程应用实例

(十)Buck降压电路仿真及工程应用实例 1. 仿真应用实例1.1 案例一1.2 案例二2. 工程应用实例2.1 数字DC/DC应用实例2.2 模拟DC/DC应用实例1. 仿真应用实例 1.1 案例一 仿真技术要求输入:输入电压30~90V,输出电压28V,输出电流最大10A,开关频率100KHz。我们按照参数极限工…

【Vue】使用vue-cli搭建SPA项目的路由,嵌套路由

一、SPA项目的构建 1、前期准备 我们的前期的准备是搭建好Node.js,测试&#xff1a; node -v npm -v2、利用Vue-cli来构建spa项目 2.1、什么是Vue-cli Vue CLI 是一个基于 Vue.js 的官方脚手架工具&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;它可以帮助开发者…

Qt(day5)

思维导图 将登录操作和数据库绑定 mywnd.h #ifndef MYWND_H #define MYWND_H#include <QMainWindow> #include<QLabel> #include<QLineEdit> #include<QPushButton> #include<QDebug> #include<QMessageBox> #include"second.h&qu…

零基础转行网络安全可以做什么工作,内附网络安全自学路线

一直在说网络安全行业好就业、薪资高、前景也好&#xff0c;但是大家对网络安全这个行业具体做什么工作可能还一知半解。所以今天来跟大家聊聊&#xff0c;网络安全学完可以找到什么样的工作&#xff0c;顺便把不同岗位的不同技术要求也说一下。 【点击文章末尾卡片&#xff0…

Spring Security 对请求的处理流程

文章目录 前言系统启动Spring Security 对请求的处理总结 前言 分析Spring Security的核心原理&#xff0c;可以从以下几个方面进行&#xff1a; 系统启动的时候Spring Security做了哪些事情&#xff1f;发起一次请求后Spring Security做了哪些事情&#xff1f; 系统启动 当…

Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本

前言 Puppeteer已经听说过很多次了&#xff0c;也见过一些与之相关的文章。但是一直没怎么研究过&#xff0c;现在来简单学习一下。 简介 Puppeteer 是一个 Node 库&#xff0c;它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headles…

【离网逆变器】离网逆变器型号由一个高频DC-DC升压转换器与全桥PI控制电压源逆变器级联组成、逆变器使用带LC滤波器的SPWM调制(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

HTML5+CSS3+JS小实例:鼠标控制飞机的飞行方向

实例:鼠标控制飞机的飞行方向 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conten…

Vue项目前端代码防止被调试

项目背景 被安全测试针对了&#xff0c;总是调试我这不太安全的代码。前端代码深度混淆转成十六进制还不行&#xff0c;仍然找到加密方法&#xff0c;对后端数据进行解密。这次就修改了思路换种方法: 我承认阁下很强&#xff0c;但假如, 我是说假如打开控制台是空白页面&…

森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&#xff0c;甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

eclipse svn插件安装

1.进入eclipse的help->Eclipse Marketplace,如下图所示&#xff1a; 2.输入“svn”,再按回车&#xff0c;如下图&#xff1a; 3.这我选择的是 Subversive,点击后面的“install”按钮&#xff0c;如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…

linux离线安装make

一、下载rpm包 https://pkgs.org/search/?qmake 二、拷贝至服务器 三、安装make rpm -ivh make-3.82-24.el7.x86_64.rpm四、查看是否安装成功 make -v

Docker部署单点Elasticsearch与Kibana

一 、 创建网络 因为需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里创建一个网络&#xff1a; docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…

【面试题】Js数组去重都有哪些方法?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 1. indexOf 定义&#xff1a; indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置…

60从零开始学Java之与数字相关的类有哪些?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在解决实际问题时&#xff0c;会经常对数字、日期和系统设置进行处理&#xff0c;比如在我们的代…