用ROS在RVIZ中同时显示RTK轨迹(GT)和SLAM轨迹(以视觉VINS为例)

本文介绍了如何在ROS环境下安装、测试及创建功能包,展示如何将Odometry数据转换并通过Rviz显示RTK轨迹,以及如何在VSCode中管理项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0、前期准备

首先我们需要安装ROS、并用小乌龟测试是否能正常运行。此外,还需要测试RVIZ是否能正常工作。

1、RTK轨迹(GT)显示

首先,创建工作空间showTrack_ws

mkdir -p showTrack_ws/src
cd showTrack_ws
catkin_make

进入工作空间后,可以用两种方法创建功能包。这里推荐方法二,因为后续都是通过Vscode完成的,更加直观。

方法一:直接创建(showtrack是功能包名字,roscpp、rospy、std_msgs是编译依赖)

catkin_create_pkg showtrack roscpp rospy std_msgs

方法二:进入Vscode创建功能包,在工作空间下执行命令

code .

选择创建功能包

创建功能包后会先设置功能包名称,再给定功能包依赖。名称依赖项如方法一所示。

名称:

依赖:

创建完成后左侧应该是这样子的

我们在showtrack功能包的src下创建showtrack.cpp,并把以下内容复制在cpp文件里:

#include<stdio.h>
#include<ros/ros.h>
#include<nav_msgs/Path.h>
#include<nav_msgs/Odometry.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <cmath>

using namespace std;
using namespace Eigen;

ros::Publisher path_pub;    //发布path的节点
ros::Subscriber odom_sub;   //接收odometry的节点

nav_msgs::Path path;        //发布的路径
bool init_flag=1;             //path初始化标记位

void odomCallback(const nav_msgs::Odometry::ConstPtr& odom){
    if(init_flag){
        path.header=odom->header;
        init_flag=0;
    }

    geometry_msgs::PoseStamped pose_stamped_this;
    pose_stamped_this.header=odom->header;
    pose_stamped_this.header.frame_id="world";
    // 坐标转换xyz,GPS到坐标原点
    // 旋转变化(弧度制)
    double PI = 3.141593;
    double yaw = 5 * PI / 4, pitch = 0, roll =  7 * PI / 4;
    Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ());
    Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY());
    Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX());
 
    Eigen::Quaterniond q = rollAngle * yawAngle * pitchAngle;
    Eigen::Matrix3d R = q.matrix();
    cout << "R = " << R << endl;

    pose_stamped_this.pose.position.x = odom->pose.pose.position.x + 0.2;
    pose_stamped_this.pose.position.y = odom->pose.pose.position.y + 8.6;
    pose_stamped_this.pose.position.z = odom->pose.pose.position.z + 18.8;

    Vector3d pose = {pose_stamped_this.pose.position.x, pose_stamped_this.pose.position.y, pose_stamped_this.pose.position.x};
    pose = R * pose;

    pose_stamped_this.pose.position.x = pose[0];
    pose_stamped_this.pose.position.y = pose[1];
    pose_stamped_this.pose.position.z = pose[2];
    
    path.header.frame_id = "world";

    path.poses.push_back(pose_stamped_this);
    path_pub.publish(path);
}


int main (int argc, char **argv)
{
    ros::init (argc, argv, "odometry2path");
    ros::NodeHandle nh;
    
 //       记得在此处更改odometry消息topic名称     //
    odom_sub  = nh.subscribe<nav_msgs::Odometry>("/USV2/NED_odometry", 10, odomCallback);
    path_pub = nh.advertise<nav_msgs::Path>("/USV2/NED_path",10, true);
 

    
    ros::spin();
    // ros::Rate loop_rate(50);
    // loop_rate.sleep();
    return 0;
}

复制完成后需要修改功能包路径下的CMakeList文件,

之后在直接ctrl+shift+B快捷键调用catkin_make命令编译即可(如果提示需要选择生成的任务类型,选择catkin_make:build即可)。之后在工作空间下执行以下命令运行ros节点:

source ./devel/setup.bash
rosrun showtrack showtrack

2、RVIZ轨迹显示

运行SLAM系统,并运行RVIZ,在RVIZ中根据话题添加可视化组件

运行SLAM系统即数据集之后即可显示对应的轨迹,效果如下:

如果需要修改参数,只需要在showtrack.cpp文件中修改对应的地方即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值