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
可以使用点成员指定箭头的起点和终点。如果将点放入点成员,会假设你想要按照如下方式初始化点成员:
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…
注意位姿和尺寸仍然使用。