ROS1和ROS2RVIZ 代码详解

本文详细介绍了ROS1和ROS2中使用RVIZ进行视觉标记的代码实现,包括头文件引用、对象创建、DELETEALL操作、坐标系、时间戳、命名空间、ID、生命周期、类型和操作、位姿、尺寸大小、颜色设置、点集及文字标记等内容。通过示例代码展示了如何创建和管理不同类型的标记,如实线、虚线、立方体、箭头等,并提供了设置文字内容的方法。
摘要由CSDN通过智能技术生成

ROS1和ROS2 RVIZ 代码详解


参考wiki.ros.org的教材: http://wiki.ros.org/rviz/Tutorials/Markers%3A%20Basic%20Shapes

1、 头文件

ros1, 不用include 头文件 geometry_msgs/Point.h, 但是依赖了geometry_msgs功能包

#include <ros/ros.h>
//单独一个marker的头文件
#include <visualization_msgs/Marker.h>
//marker vector的头文件
#include <visualization_msgs/MarkerArray.h>

ros2

#include <rclcpp/rclcpp.hpp>
//单独一个marker的头文件
#include <visualization_msgs/msg/marker.hpp>
//marker vector的头文件
#include <visualization_msgs/msg/marker_array.hpp>
//形点的头文件
#include <geometry_msgs/msg/point.hpp>

2、创建对象

visualization_msgs::MarkerArray markerArray;
visualization_msgs::Marker marker;
geometry_msgs::Point pt;
markerArray.markers.reserve(n);//根据需求确定n的值

3、DELETEALL 操作,防止重影

marker.action=visualization_msgs::Marker::DELETEALL;
markerArray.markers.emplace_back(marker);

DELETEALL 操作是在ROS Indigo版本中新增加的,用来删除某个topic前一周期中的所有的Marker显示,所以一般在MarkerArray的第一个元素就push这个marker_delete。注意删除的是所有的,无论namespace 和id是多少。action设置了这个操作后不需要设置其他参数,

4、坐标系、时间戳、命名空间、id、生命周期

//选择系统自带的基础坐标系
 marker.frame_id="base_link";
 //ros1的获取方式ros::Time::now()
 //ros2的获取方式 node.get_clock()->now()
 marker.header.stamp=ros::Time::now();
 //生命周期,ROS1时间段函数ros::Duration(1),单位秒
 //ROS2时间段函数rclcpp::Duration::from_nanoseconds(1*10^9),单位纳秒
 marker.lifetime = ros::Duration();//这里没有设置时间参数,表示无限长,系统不会自动删除。
 //命名空间
 marker.ns="hdmap_lines";
 //id
 marker.id=0;

注意:

  1. 若rviz收到相同命名空间和id的marker,会覆盖掉之前的marker,所以若不是同一个marker,需要保证命名空间和id不能都相同。
  2. 若markerArray第一个元素操作的是DELETEALL,那么其他元素可以设置生命周期无限长,也就是系统不会自己删除,当收到新的消息时就会自动删除这个topoic之前的全部显示。

5、类型和操作

//类型
marker.type=visualization_msgs::Marker::LINE_STRIP;
 //操作:ADD,DELETE,DELETEALL,一共三种
marker.action=visualization_msgs::Marker::ADD;

类型有:LINE_STRIP 实线、 LINE_LIST 虚线 CUBE 圆柱体、 ARROW 箭头、CYLINDER SPHERE、TEXT_VIEW_FACING文字
注意:

  1. 实线最少需要两个点,因为一个点无法确定一条线的,没有方向。一个点时RVIZ会报ERROR,但是不影响显示。
  2. 虚线必须是偶数个点,否则会报错,但是不影响显示。这是因为虚线的一个线段是两个点连起来的,所以必须是偶数。
  3. 文字显示、圆柱体之类需要设置marker.pose ,见标题6,不需要往marker.points里面push点。相反实线和虚线不用设置pose,但是需要push point。

操作:ADD,DELETE,DELETEALL
注意:DELETEALL是用来删除一个topic中所有的marker,DELETE是删除指定命名空间和id的marker.

6、位姿

    //位置
    marker.pose.position.x = 0;
    marker.pose.position.y = 0;
    marker.pose.position.z = 0;
    //朝向
    marker.pose.orientation.x = 0.0;
    marker.pose.orientation.y = 0.0;
    marker.pose.orientation.z = 0.0;
    marker.pose.orientation.w = 1.0;//一般是1

注意:

  1. 文字显示、圆柱体之类需要设置marker.pose ,见标题6,不需要往marker.points里面push点。相反实线和虚线不用设置pose,但是需要push point;
  2. 对于车道线,文字显示之类,朝向一般只设置w,值为1,其它若是0,可以不设置,默认为0

7、尺寸大小

    marker.scale.x = 1.0;
    marker.scale.y = 1.0;
    marker.scale.z = 1.0;

该数字表示各个方向的尺寸大小,单位是m, 都取1表示一立方米的大小

8、颜色设置

    marker.color.r = 0.0f;
    marker.color.g = 1.0f;
    marker.color.b = 0.0f;
    marker.color.a = 1.0;//设置透明度

注意:color.a等于0时,marker是完全透明的,无法看见

9、LINE_STRIP/LINE_LIST的形点集marker.points

pt.x=1;
pt.y=1;
marker.points.emplace_back(pt);
pt.y+=1;
marker.points.emplace_back(pt);
markerArray.emplace_back(std::move(marker));

注意:用了std::move后,marker里面的字符串以及容器类变量就变成空的了,需要重新赋值。

10、文字marker设置显示内容

如果marker的action选择TEXT_VIEW_FACING,那么需要给marker.text赋值,是个string,若是显示固定的字符串,那么可以直接用如下赋值

marker.text="adbcd";//直接赋值

若是想实时地显示某个变量地值,那么可以用stringstream类对象来将变量的值转换成字符串,若是多次转换用同一个对象,记得每次要提前清空,用str(" ")或clear()

int count=6;
int value=7;
std::stringstream context;//定义一个字符串流
context<<"count: "<<count<<std::endl
       <<"value: "<<value<<std::endl;
//str()成员函数用来获取内容,或者重设内容,str("")表示清空内容
marker.text=context.str();
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值