由浅到深理解ROS(4)
消息和消息類型
節點能相互傳遞消息,節點之間通信也是基于消息。消息類型也就是數據類型數據類型,理解消息的類型很重要,因為它決定了消息的內容。也就是說,一個話題的消息類型能告訴你該話題中每個消息攜帶了哪些信息,以及這些信息是如何組織的。正如開篇提到的geometry_msg/Twist ,Twist就是消息類型。
利用rosmsg show geometry_msg/Twist?查看消息類型的詳情如下:
?
geometry_msgs/Vector3 linear
? float64 x
? float64 y
? float64 z
geometry_msgs/Vector3 angular
? float64 x
? float64 y
? float64 z
?
該例中,linear?和?angular?都是復合域,其數據類型是?geometry_msgs/Vector3。縮進格式表示命名為x,y和z的域,是對應的上級兩個域之一的成員。也就是說,geometry_msgs/Twist 消息包含六個成員,并且以兩個向量的形式組織,分別為?linear?和?angular。其中每個數值都是基本數據類型 float64,即每個數值都
是 64位浮點型 數據。一般來說,一個復合域是由簡單的一個或者多個子域組合而成,其中的每一個子域可能是另一個復合域或者獨立的域,而且它們一般也都由基本數據類型組成。同樣的思想也出現在?C++以及其他面向對象的編程語言中,即對象的數據成員可能是其他對象。
此外,上述復合域本身也可以作為消息類型。例如,一個具有消息類型?geometry_msgs/Vecotr3?的話題是完全符合語法的假如利用命令?rosmsg show geometry_msgs/Vecotr3 則類型的詳情是:
?
? float64 x
? float64 y
? float64 z
?
每行一個元素,每個域由基本數據類型(float64)以及域名稱(x、y和z)定義。該類型的消息包含三個頂層域,即x、y和z。這種嵌套組織方法有助于提高代碼的復用率,尤其是在該系統中很多消息類型共享相同的數據類型。一個常見的例子是?std_msgs/Header?消息類型,其包含一些基本的序列號,時間戳以及坐標系等信息。這種類型將作為一個復合域(一般稱作?header)出現在在上百個其他的消息類型中。幸運地是,?rosmsg show?命令在顯示消息類型時自動向下展開復合域直到基本類型為止,同時使用縮進的形式來展示這種嵌套結構,因此一般沒有必要直接查看這些內層結構的消息類型。
消息類型同樣可以包含固定或可變長度的數組(用中括號[]表示)和常量(一般用來解析其他非常量域)。比如在 3Dslam 中會用到點云,表示點云的消息?sensor_msgs/PointCloud??則類型的詳情是:
?
Header header
geometry_msgs/Point32[] ?points ?
ChannelFloat32[] ? ? ? channels ? ? ? ? ??
這個消息包含3 d點的集合,加上可選的額外的每一點信息,在給定的幀頭每個Point32應解釋為一個3 d點。也許表示激光雷達數據的類型rosmsg show?sensor_msgs/LaserScan會更好理解,但是這里不再熬述。
理解消息類型的命名:
和ROS里其他的程序一樣,每條消息類型都屬于一個特定的包。消息類型名總會包含一個斜杠"/",斜杠前面的名字是包含它的包,例如?geometry_msgs/Twist
功能包名:geometry_msgs ?類型名稱:Twist ?消息類型:geometry_msgs/Twist
這種命名方式的好處是把包的名字包含在消息類型名里能避免命名沖突。
舉個例子比如:geometry_msgs/Pose?和?turtlesim/Pose?是有區別的消息類型,它們包含了不同的(但概念上是類似的)數據。這也有助于猜測它的含義。例如,消息類型?ModelState?單獨出現可能會讓人產生迷惑,但是以?gazebo/ModelState?的形式出現后,就會指明這個消息類型是?Gazebo?仿真器中的一部分,而且很有可能包含了這個仿真器中某個模型的狀態信息。
?
今后筆者會結合簡單的開發程序繼續講解。
總結
以上是生活随笔為你收集整理的由浅到深理解ROS(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注解由谁读取并解析的?
- 下一篇: Java 10 常用集合继承关系图