ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)

这么好的文章怎么能不转发…无改动~~
参考(九)ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)

如何在rviz中如何实时显示轨迹呢?
本文分析nav_msgs/Path结构,实现在rviz中画出圆形轨迹。

1.使用参考代码画轨迹效果展示(hector_slam)

google rviz中如何实时显示轨迹?会有以下重要资料。
参考资料
参考http://answers.ros.org/question/209224/show-robot-trajectory-in-rviz-real-time/
hector_slam中实现了画轨迹。
网址http://wiki.ros.org/hector_slam/Tutorials/MappingUsingLoggedData
那么先用bag数据来跑一跑。
步骤如下:
(1)启动包

roslaunch hector_slam_launch tutorial.launch

(2)回放bag
rosbag play Team_Hector_MappingBox_RoboCup_2011_Rescue_Arena.bag --clock
(3)效果
在这里插入图片描述
(4)查看发送的topic

rostopic echo /trajectory

在这里插入图片描述

2.实现在rviz中画出圆形轨迹

以上的包太复杂,本文实现最简单的画轨迹功能。

2.1分析nav_msgs/Path.msg结构

nav_msgs/Path.msg结构

std_msgs/Header header
geometry_msgs/PoseStamped[] poses

将以上结构展开如下:
std_msgs/Header结构

uint32 seq
time stamp
string frame_id

geometry_msgs/PoseStamped[]结构

std_msgs/Header header
geometry_msgs/Pose pose

geometry_msgs/Pose pose结构

# This represents an orientation in free space in quaternion form.
float64 x
float64 y
float64 z
float64 w

2.2实现画出圆形轨迹

(1)新建工程

mkdir -p showpath/src
cd src
catkin_create_pkg showpath roscpp rospy sensor_msgs std_msgs nav_msgs tf
cd ..
catkin_make 

(2)编辑主函数showpath.cpp

#include <ros/ros.h>
#include <ros/console.h>
#include <nav_msgs/Path.h>
#include <std_msgs/String.h>
#include <geometry_msgs/Quaternion.h>
#include <geometry_msgs/PoseStamped.h>
#include <tf/transform_broadcaster.h>
#include <tf/tf.h>

main (int argc, char **argv)
{
    ros::init (argc, argv, "showpath");

    ros::NodeHandle ph;
    ros::Publisher path_pub = ph.advertise<nav_msgs::Path>("trajectory",1, true);

    ros::Time current_time, last_time;
    current_time = ros::Time::now();
    last_time = ros::Time::now();

    nav_msgs::Path path;
    //nav_msgs::Path path;
    path.header.stamp=current_time;
    path.header.frame_id="odom";


    double x = 0.0;
    double y = 0.0;
    double th = 0.0;
    double vx = 0.1;
    double vy = -0.1;
    double vth = 0.1;

    ros::Rate loop_rate(1);
    while (ros::ok())
    {

        current_time = ros::Time::now();
        //compute odometry in a typical way given the velocities of the robot
        double dt = 0.1;
        double delta_x = (vx * cos(th) - vy * sin(th)) * dt;
        double delta_y = (vx * sin(th) + vy * cos(th)) * dt;
        double delta_th = vth * dt;

        x += delta_x;
        y += delta_y;
        th += delta_th;


        geometry_msgs::PoseStamped this_pose_stamped;
        this_pose_stamped.pose.position.x = x;
        this_pose_stamped.pose.position.y = y;

        geometry_msgs::Quaternion goal_quat = tf::createQuaternionMsgFromYaw(th);
        this_pose_stamped.pose.orientation.x = goal_quat.x;
        this_pose_stamped.pose.orientation.y = goal_quat.y;
        this_pose_stamped.pose.orientation.z = goal_quat.z;
        this_pose_stamped.pose.orientation.w = goal_quat.w;

        this_pose_stamped.header.stamp=current_time;
        this_pose_stamped.header.frame_id="odom";
        path.poses.push_back(this_pose_stamped);

        path_pub.publish(path);
        ros::spinOnce();               // check for incoming messages

        last_time = current_time;
        loop_rate.sleep();
    }

    return 0;
}

(3)编辑CMakeLists.txt
在最后加入

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

(4)编译和运行
编译

cd /home/topeet/workspace/showpath
catkin_make

运行

source ./devel/setup.bash
rosrun showpath showpath

查看/trajectory 信息

rostopic echo /trajectory

3.rviz实验结果

运行

rosrun rviz rviz

在globel option的Fixed Fram输入odom
左边点击add
选中path
在path的topic选项中选
/trajectory
在这里插入图片描述

  • 16
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ROS,我们可以使用tf库来管理坐标系之间的转换关系。要将`nav_msgs/Path`消息转换为tf,需要按照以下步骤进行操作: 1. 首先,我们需要在代码包含必要的头文件: ```cpp #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <nav_msgs/Path.h> ``` 2. 接下来,我们需要定义一个回调函数来处理`nav_msgs/Path`消息。在这个回调函数,我们可以使用`tf::TransformBroadcaster`类来广播tf变换信息。 ```cpp void pathCallback(const nav_msgs::Path::ConstPtr& msg) { static tf::TransformBroadcaster broadcaster; for (int i = 0; i < msg->poses.size(); ++i) { const geometry_msgs::PoseStamped& pose = msg->poses[i]; tf::Vector3 position(pose.pose.position.x, pose.pose.position.y, pose.pose.position.z); tf::Quaternion orientation(pose.pose.orientation.x, pose.pose.orientation.y, pose.pose.orientation.z, pose.pose.orientation.w); tf::Transform transform(orientation, position); broadcaster.sendTransform(tf::StampedTransform(transform, pose.header.stamp, pose.header.frame_id, "path_frame")); } } ``` 在上面的代码,我们使用`tf::Vector3`和`tf::Quaternion`类来创建位置和旋转信息。然后,我们使用这些信息创建一个`tf::Transform`对象,并使用`tf::TransformBroadcaster`类的`sendTransform`方法将其广播到ROS系统。 3. 最后,我们需要在`main`函数创建一个ROS节点,并订阅`nav_msgs/Path`消息。 ```cpp int main(int argc, char** argv) { ros::init(argc, argv, "path_to_tf"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe<nav_msgs::Path>("path_topic", 10, pathCallback); ros::spin(); return 0; } ``` 在上面的代码,我们使用`ros::Subscriber`类订阅`nav_msgs/Path`消息,并将其传递给`pathCallback`回调函数进行处理。`ros::spin()`函数将一直运行,直到节点被关闭。 注意:在广播tf变换信息时,我们将目标框架设置为`"path_frame"`。这意味着我们需要在代码创建一个名为`"path_frame"`的坐标系。如果您还没有创建这个坐标系,请参考ROS文档有关tf库的教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值