ROS-Marker和MarkerArray使用方法

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 );
  • 1

然後簡單的填充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 );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

這也是個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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

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";
  • 1
  • 2

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…

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章