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

news2025/2/22 16:20:09

本文通过 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 / 2
        Eigen::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 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_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.coloradmin.cn/o/1029274.html

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

相关文章

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

PostgreSQL设置主键为自增

1、创建自增序列 CREATE SEQUENCE table_name_id_seq START 1; 2、设置字段默认值 字段默认值中设置 nextval(table_name_id_seq) 3、常用查询 -- 查询所有序列 select * from information_schema.sequences where sequence_schema public; -- 查询自增序列的当前值 select cu…

【分布式计算】七、同步 synchronization 重难点

两个协议&#xff1a; 1、NTP&#xff08;Network Time Protocal)–>广泛使用    机器周期向时间服务器获取准确时间   2、没有协议名称 − > -> −>没有广泛使用    时间服务器周期扫描所有机器&#xff0c;计算时间平均值&#xff1b;导致时间服务器负载…

Mac使用sz/rz

从使用体验上说,sz/rz要比scp要好得多.但Mac上使用这两个命令需要进行相应配置. sz&#xff1a;将选定的文件发送&#xff08;send&#xff09;到本地机器 rz&#xff1a;运行该命令会弹出一个文件选择窗口&#xff0c;从本地选择文件上传到Linux服务器 下载安装lrzsz brew i…

小红书“不误正夜”指南丨2023夜间营销数据报告

对于当代年轻人来说&#xff0c;白天的 8 小时需要献给工作、学习和社交&#xff0c;夜晚时光才真正属于自己。“下班后开始新的一天”&#xff0c;越来越多人开始认同这个概念&#xff0c;告别“报复性熬夜”&#xff0c;重新掌握晚间生活的方向盘&#xff0c;多样化的生活方式…

芯片核数造假,华为不装了,网友直呼这一波赚翻了!

首先说一下之前以为华为是青岛新恩制作的芯片&#xff0c;但是在最新的一个消息中发现&#xff0c;麒麟芯片其实是华为子公司自主研发生产的。 2个重量级消息&#xff0c;华为突破芯片封锁后&#xff0c;美国科技界惊出一身冷汗&#xff01; 华为麒麟9000s是中芯国际做的吗&…

Linux-Nginx安装

一、Nginx下载 官网下载地址&#xff1a; https://nginx.org/en/download.html 国内镜像地址&#xff1a; https://mirrors.huaweicloud.com/nginx 二、Nginx安装 1. 将下载的Nginx安装包上传到Linux服务器指定安装盘符下&#xff0c;解压zip包 tar -zxvf nginx-1.23.3.ta…

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着 Android 应用程序和游戏变得越来越丰富&#xff0c;其中有些甚至比 PC 上的软件更易于使用和娱乐&#xff0c;因此许多人希望能够在云上运行 Android 游戏或应用程序&#xff0c;而在 EC2 实例上运行 Android 的解决方案可以让开发人员更轻松地测试和运行 Android 应用程序…

京东商品详情数据采集接口

使用京东商品详情接口的具体流程如下&#xff1a; 注册账号并登录。填写应用相关信息&#xff0c;包括应用名称、应用描述、应用回调地址等&#xff0c;然后提交申请。审核通过后&#xff0c;进入应用管理页面&#xff0c;点击“应用信息”&#xff0c;获取应用Key和应用Secre…

Kubernetes(k8s)上搭建一主两从的mysql8集群

Kubernetes上搭建一主两从的mysql8集群 环境准备搭建nfs服务器安装NFS暴露nfs目录开启nfs服务器 安装MySQL集群创建命名空间创建MySQL密码的Secret安装MySQL主节点创建pv和pvc主节点的配置文件部署mysql主节点 安装第一个MySQL Slave节点创建pv和pvc第一个从节点配置文件部署my…

Python实现Redis缓存MySQL数据并支持数据同步

简介 本文讲讲如何用Redis做MySQL的读缓存&#xff0c;提升数据库访问性能。 MySQL是一种很常用的关系型数据库&#xff0c;用于持久化数据&#xff0c;并存放在磁盘上。但如果有大数据量的读写&#xff0c;靠MySQL单点就会捉襟见肘&#xff0c;尽管可以在MySQL本身做优化&am…

【Python大纲】S0 系列博文大纲

系列博文大纲 Python 环境建议系列博文相关书籍系列博文大纲阶段进展 Python 环境建议 “工欲善其事、必先利其器”&#xff0c;“三分手艺、七分家伙”&#xff0c;选择一个好用的开发环境对于编程而言至关重要。博主不过多赘述&#xff0c;提出的建议是&#xff1a;Anaconda…

Invalid prop: custom validator check failed for prop “percentage

在使用element 进度条时出现如下报错&#xff1a; Invalid prop: custom validator check failed for prop “percentage 这是因为percentage的取值范围为0-100 检查下自己的值是否超出这个范围了

eclipse svn插件安装

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

想要精通算法和SQL的成长之路 - 预测赢家

想要精通算法和SQL的成长之路 - 预测赢家 前言一. 预测赢家二. 石子游戏&#xff08;预测赢家的进阶版&#xff09;2.1 博弈论 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 预测赢家 原题链接 主要思路&#xff1a; 我们定义dp[i][j]&#xff1a;在区间 [i, j] 之间先…

QT 6.5下载安装及配置教程

一、下载 今天打算换一个QT安装版本,去官网看了一眼发现变成了在线安装。 本来官方下载的就慢,现在更是雪上加霜,现在给大家推荐几种下载方式。 1、国内镜像 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;https://mirrors.tuna.ts…

基于强化学习的节能路由(Matlab代码实现)

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

员工电脑怎么监控(怎样远程监控员工电脑)

随着科技的发展&#xff0c;企业对于员工电脑的监控已经成为了企业管理的重要手段。通过监控员工电脑&#xff0c;企业可以更好地管理员工的工作效率、保护企业数据安全以及维护企业的正常运营。本文将详细介绍如何监控公司员工电脑的方法和步骤。 监控员工电脑的目的 提高工作…

Selenium-介绍下其他骚操作

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

vsc使用flake8的一个小问题

当单行写入代码长度过长时候PEP8会直接提示报错&#xff0c;在flake8中的单行代码限制是小于80但是对于一些需要精准import的代码来说远不够用&#xff0c;网络上有人说直接在josn文件中做变动&#xff0c;但是当导入相关命令的时候&#xff0c;会显示该命令不可用&#xff0c;…