rviz--显示类型-Marker

本文介绍了如何使用ROS中的visualization_msgs/Marker消息来在3D显示中添加各种基本形状,包括发布marker消息的方法、marker消息的参数含义及各种类型的marker(如球体、立方体、箭头等)的具体使用细节。

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

marker显示允许各种基本形状的可编程添加到3D显示,通过发送visualization_msgs/Marker 或者 visualization_msgs/MarkerArray消息。

1. Marker消息

1.1 使用例子(C++/roscpp)
首先,发布话题visualization_marker:

ros::Publisher vis_pub = node_handle.advertise<visualization_msgs::Marker>( "visualization_marker", 0 );

然后简单的填充visualization_msgs/Marker 消息并且发布它:

visualization_msgs::Marker marker;
marker.header.frame_id = "base_link";
marker.header.stamp = ros::Time();
marker.ns = "my_namespace";
marker.id = 0;
marker.type = visualization_msgs::Marker::SPHERE;
marker.action = visualization_msgs::Marker::ADD;
marker.pose.position.x = 1;
marker.pose.position.y = 1;
marker.pose.position.z = 1;
marker.pose.orientation.x = 0.0;
marker.pose.orientation.y = 0.0;
marker.pose.orientation.z = 0.0;
marker.pose.orientation.w = 1.0;
marker.scale.x = 1;
marker.scale.y = 0.1;
marker.scale.z = 0.1;
marker.color.a = 1.0; // Don't forget to set the alpha!
marker.color.r = 0.0;
marker.color.g = 1.0;
marker.color.b = 0.0;
//only if using a MESH_RESOURCE marker type:
marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
vis_pub.publish( marker );

这也是个visualization_msgs/MarkerArray消息,这允许一次性发布很多marker。

注意,时间戳将marker消息关联到ros::Time(),这是时间Zero(0)。这个被rviz和其他时间区别对待。如果使用ros::Time::now()或者其他非零值,rviz将仅仅显示距离当前时间很近的marker,其中足够近依据的是TF。然而对于0时间,不管是不是当前时间,都会显示marker。

不要忘记设置color.a=1,否则marker将会不可见。

1.2 消息参数

uint8 ARROW=0
uint8 CUBE=1
uint8 SPHERE=2
uint8 CYLINDER=3
uint8 LINE_STRIP=4
uint8 LINE_LIST=5
uint8 CUBE_LIST=6
uint8 SPHERE_LIST=7
uint8 POINTS=8
uint8 TEXT_VIEW_FACING=9
uint8 MESH_RESOURCE=10
uint8 TRIANGLE_LIST=11

uint8 ADD=0
uint8 MODIFY=0
uint8 DELETE=2
uint8 DELETEALL=3

Header header                        # 时间和坐标系信息
string ns                            # 这些markers的名称空间。这给marker加上一个唯一的id
int32 id                             # 分配给marker的唯一的id。
int32 type                         # maker的类型。可用的类型在消息定义中有说明
int32 action                           # 0=add/modify an object, 1=(deprecated), 2=deletes an object, 3=deletes all objects
geometry_msgs/Pose pose                 # marker的位姿,内容是3维坐标和一组方向四元数
geometry_msgs/Vector3 scale             # marker的尺寸,在位姿/方向之前应用,[1,1,1]意思是尺寸是1m*1m*1m
std_msgs/ColorRGBA color             # 物体的颜色,由r/g/b/a指定,取值范围是[0,1]。不要忘记设置a否则它会默认是0,导致marker不可见。
duration lifetime                    # 一个区间值,在这段时间之后自动删除marker,这个向下计数器被重置,如果另一个同样namespace/id 的marker被接收到时。0的意思是不会删除这个marker
bool frame_locked                    # 告知rviz每次更新循环重新发布变换到指定坐标系的当前位置。

#Only used if the type specified has some use for them (eg. POINTS, LINE_STRIP, ...)
geometry_msgs/Point[] points  #
#Only used if the type specified has some use for them (eg. POINTS, LINE_STRIP, ...)
#number of colors must either be 0 or equal to the number of points 
#NOTE: alpha is not yet used
std_msgs/ColorRGBA[] colors  #仅限使用点成员的marker,指定每个定点颜色。

# NOTE: 仅限于text markers
string text  #文本字符串

# NOTE: only used for MESH_RESOURCE markers
string mesh_resource  #MESH_RESOURCE markers的源位置。任何rviz支持的mesh类型都可以使用。格式是被resource_retriever使用的URI-form。
bool mesh_use_embedded_materials

1.3 物体类型

1.3.1 箭头(ARROW=0)
箭头类型提供两个不同指定起点和终点的方法:
Position/Oriention
中心点在箭头尾部。定义方向点沿着+X轴。scale.x 是箭头长度,scale.y是箭头宽度和scale.z是箭头高度。
Start/End Points
可以使用点成员指定箭头的起点和终点。如果将点放入点成员,会假设你想要按照如下方式初始化点成员:

  • 在指数0处的点被认为是起点,在指数1处的点被认为是终点。
  • scale.x是箭头柄的直径,scale.y是头的直径,如果scale.z不为零,表示的是箭头的长度。

1.3.2 立方体(CUBE=1)

中心点在立方体的中心。

1.3.3 球体(SPHERE=2)

中心点在球心。

1.3.4 圆柱体(CYLINDER=3)

中心点在圆柱体的中心。
scale.x是x方向的半径,scale.y是y方向的半径,通过设置这两个参数可以获得椭圆形,scale.z指定高度。

1.3.5 线带(LINE_STRIP=4)

线带使用 visualization_msgs/Marker消息的点成员。它将会在每两个连续的点间画一条线,0-1,1-2,2-3…

线带也有一些尺寸的特殊处理,仅仅scale.x被使用并且它控制线段的宽度。

注意,位姿仍然被使用(在线中的点通过位姿变换),并且线将会针对在头中指定的坐标系进行矫正。

1.3.6 线列表(LINE_LIST=5)

线列表使用 visualization_msgs/Marker消息的点成员。它会在每对点间画一条线 ,0-1,2-3,4-5…

线列表也有对尺寸特殊的处理:仅仅scale.x被使用并且它控制线段的宽度。

注意,位姿仍然使用,和线带一样。

1.3.7 立方体列表(CUBE_LIST=6)

立方体列表是一系列立方体,除了位姿所有的属性都一样。使用这个物体类型替代 visualization_msgs/MarkerArray允许rviz批处理显示,这让他们的显示更快。附加说明是它们所有都必须有相同的颜色/尺寸。

1.3.8 球体列表(SPHERE_LIST=7)

球体列表除了位姿具有相同的属性。使用这个物体类型替代 visualization_msgs/MarkerArray允许rviz批处理显示,这让他们的显示更快。附加说明是它们所有都必须有相同的颜色/尺寸。

visualization_msgs/Marker消息的点成员被用作每个球体的位置。

注意,位姿仍然被使用(在线中的点通过位姿变换),并且线将会针对在头中指定的坐标系进行矫正。

1.3.9 点(POINT=8)

使用visualization_msgs/Marker的点成员。点有一些尺寸的特殊处理:scale.x是点的宽度,scale.y是点的高度。 注意,位姿仍然被使用(在线中的点通过位姿变换),并且线将会针对在头中指定的坐标系进行矫正。

1.3.10 可视的有方向的文本(TEXT_VIEW_FACING=9)

这个marker显示文本在世界内的3D点。这个文本总是随着视角变化。在marker中使用这个文本域。

仅仅scale.z被使用,用作指定大写字母“A”的高度。

1.3.11 Mesh源(MESH_RESOURCE=10)

在marker中使用mesh_resource。任何mesh类型都能够被rviz支持。格式是resource_retreiever 。

一个mesh使用的例子:

marker.type = visualization_msgs::Marker::MESH_RESOURCE;
marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";

mesh的尺寸是相对的。(1.0,1.0,1.0)这个尺寸意思是mesh将会以在mesh文件中指定的准确的尺寸显示。(1.0,1.0,2.0)意思是与配置文件中同样的宽/深,但是两倍的高度显示。

如果mesh_use_embedded_materials 标志位被设置为true并且mesh类型支持植入材料(例如COLLADA),定义在文件中的材料将会用作替代在marker中定义的颜色。

自从1.8版本,甚至当mesh_use_embedded_materials 被设置为true时,如果marker颜色被设置为任何数值而不是r=0,g=0,b=0,a=0,颜色和alpha将会被用来给材料着色。

1.3.12 三角形列表(TRIANGLE_LIST=11)

使用点并且随便的颜色成员。每一个三点的集合被看成是一个三角形,0-1-2,3-4-5…

注意位姿和尺寸仍然使用。

### 如何在 ROS RVIZ 中发布 Marker 要在 ROSRVIZ 中发布自定义 Marker,通常需要完成以下几个部分的工作:创建一个 ROS 节点并编写代码用于发布 Marker 数据;配置 RVIZ 来订阅该主题以显示 Marker。 #### 创建 `using_markers` 包 首先,按照标准流程创建一个新的 ROS 包。此包将包含所有必要的依赖项以及 Marker 发布逻辑的源文件。 ```bash catkin_create_pkg using_markers roscpp visualization_msgs geometry_msgs std_msgs[^1] ``` #### 安装和编译项目 确保工作空间已正确设置,并执行以下命令来构建整个 Catkin 工作区: ```bash cd ~/catkin_ws/ catkin_make -j4[^2] ``` #### C++ 实现示例 下面是一个简单的 C++ 示例程序,展示如何向 RVIZ 发送基本形状类型Marker: ```cpp #include "ros/ros.h" #include "visualization_msgs/Marker.h" int main(int argc, char **argv){ ros::init(argc, argv, "basic_shapes"); ros::NodeHandle n; ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 10); // 设置循环频率为 2Hz ros::Rate loop_rate(2); int count = 0; while (ros::ok()){ visualization_msgs::Marker marker; // 初始化 Marker 参数 marker.header.frame_id = "/my_frame"; marker.header.stamp = ros::Time::now(); marker.ns = "basic_shapes"; marker.id = count++; marker.type = visualization_msgs::Marker::CUBE; // 使用立方体类型 marker.action = visualization_msgs::Marker::ADD; // 尺寸参数 marker.scale.x = 1.0; marker.scale.y = 1.0; marker.scale.z = 1.0; // 颜色参数 marker.color.r = 0.0f; marker.color.g = 1.0f; marker.color.b = 0.0f; marker.color.a = 1.0f; // 位置参数 marker.pose.position.x = sin(count * M_PI / 8); // 动态变化的位置 marker.pose.position.y = cos(count * M_PI / 8); marker.pose.position.z = 0.0; marker.pose.orientation.w = 1.0; // 生命周期(秒) marker.lifetime = ros::Duration(); // 发布 Marker 到指定话题 marker_pub.publish(marker); ros::spinOnce(); loop_rate.sleep(); } } ``` 上述代码展示了如何动态更新 Marker 的位置,并将其颜色设为绿色。 #### Python 实现示例 如果更倾向于使用 Python,则可以参考如下脚本实现相同的功能: ```python #!/usr/bin/env python import rospy from visualization_msgs.msg import Marker def publish_marker(): pub = rospy.Publisher('visualization_marker', Marker, queue_size=10) rospy.init_node('marker_publisher') rate = rospy.Rate(2) counter = 0 while not rospy.is_shutdown(): marker = Marker() marker.header.frame_id = "/my_frame" marker.header.stamp = rospy.Time.now() marker.ns = "basic_shapes_py" marker.id = counter % 10 marker.type = marker.CYLINDER marker.action = marker.ADD marker.scale.x = 0.5 marker.scale.y = 0.5 marker.scale.z = 1.5 marker.color.a = 1.0 marker.color.r = 1.0 marker.color.g = 0.0 marker.color.b = 0.0 marker.pose.position.x = 0 marker.pose.position.y = 0 marker.pose.position.z = counter * 0.1 marker.pose.orientation.w = 1.0 pub.publish(marker) counter += 1 rate.sleep() if __name__ == '__main__': try: publish_marker() except rospy.ROSInterruptException: pass ``` 这段代码会不断改变圆柱的高度坐标,从而形成一种上升效果[^3]。 #### 自定义消息类型与插件扩展 对于更加复杂的场景需求,比如 SLAM 过程中的特殊标记物(如反光板或 QR 码),则可能涉及定制化消息结构或者开发新的 RVIZ 插件。例如,通过继承基础类 `rviz::Display` 并重写其虚函数接口来自定义渲染行为[^4][^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值