rviz--显示类型-Marker

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学习)