iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

ROS2 及 ROS Porting 自學筆記系列 第 16

Day16 ROS2 Topic 和 Service 指令

  • 分享至 

  • xImage
  •  

本來想在Topic結束先介紹指令,但Service和Topic概念很像,所以等到有Topic和Service時一起寫在這邊。如果有忘記的地方的話,可以回去查前幾天的文章!

Command Line

ROS中我個人認為第二重要的就是要如何活用各種工具,包括圖像介面工具(GUI)和Command Line Interface(CLI),他可以幫助我們Debug,找出為什麼有些Node無法運作或是接收不到訊息,甚至是監看Topic的速度、頻寬和內容等等。

其中最重要也最適用在各個場景的就是CLI,因為ROS到後期常常會需要遠端操作機器人,因此GUI就不適用了,而且GUI的功能也沒有CLI完整,因此熟悉CLI就變得非常重要。

Topic

首先我們可以先把之前的Day9的Publisher範例跑起來:

ros2 run py_pubsub pub_member_function

由於我們自定義message時有改過pub_member_function,可以回去複製Day9的範例,或是開一個新的node,然後把Day9的範例的內容貼上去。

  1. 想必大家都忘記我們的Topic名稱是什麼了,這很常見,於是我們有了第一個工具ros2 topic list,跑起來後應改可以看到:

    /topic
    /rosout
    
  2. 其中/rosoutROS的系統Topic,用來顯示系統的log。另一個/topic就是我們的Topic了。這時我們如果想要看/topic的資訊,包括訊息格式、Publisher和Subscriber的數量等等,可以使用ros2 topic info /topic,應該會看到:

    Type: std_msgs/msg/String
    Publisher count: 1
    Subscription count: 0
    
  3. 再來我們會好奇到底發布了什麼訊息,這時候就可以使用ros2 topic echo /topic,應該會看到:

    data: Hello World: 0
    ---
    data: Hello World: 1
    ---
    data: Hello World: 2
    ...
    
  4. 對於streaming data,通常很介意framerate(幀數),這時可以用ros2 topic hz /topic來看發布的速度,應該會看到:

    average rate: 9.999
        min: 0.100s max: 0.100s std dev: 0.00000s window: 9
    average rate: 9.999
        min: 0.100s max: 0.100s std dev: 0.00000s window: 19
    average rate: 9.999
        min: 0.100s max: 0.100s std dev: 0.00000s window: 29
    ..
    
  5. 當有跨裝置的串流時,遇到FULL HD的UYVY影像,通常會有60MB/s或更高,網路就會被他塞爆。這時候就可以用ros2 topic bw /topic來看頻寬,應該會看到:

    average: 0.000MB/s
        mean: 0.000MB/s, stddev: 0.000MB/s, window: 0.000MB/s
    average: 0.000MB/s
        mean: 0.000MB/s, stddev: 0.000MB/s, window: 0.000MB/s
    average: 0.000MB/s
        mean: 0.000MB/s, stddev: 0.000MB/s, window: 0.000MB/s
    ...
    

    這時候可以看到頻寬是0,因為我們的訊息很小,但如果是影像的話就會看到頻寬很大了。

    所以在做影像串流時會使用image_transport的package或是用h264,h265等技術來壓縮影像,把頻寬降到~2MB/s,這樣就可以在網路上傳輸了。

  6. 上面大多是測試publisher,CLI也可以手動發布訊息來測試subscriber。首先將Publisher關掉,改開ros2 run py_pubsub sub_member_function,這時應該不會看到任何訊息,因為沒有Publisher。

    這時用ros2 topic pub /topic std_msgs/msg/String "{data: Hello World}"來發布訊息,應該會看到:

    publisher: beginning loop
    publishing #1: std_msgs.msg.String(data='Hello World')
    

    同時Subscriber也收到訊息:

    [INFO] [1600000000.000000000] [minimal_subscriber]: I heard: Hello World
    [INFO] [1600000000.000000000] [minimal_subscriber]: I heard: Hello World
    ...
    

    訊息的格式是用YAML或是python dictionary,因此要用{}包起來,並且使用:來分隔key和value。最外面要再用""包成字串,才不會被shell解析成其他指令。

  7. 其實ros2 topic還有很多功能,可以用ros2 topic -h來看更多功能清單。每個功能也都可以再用-h來看更多細節, e.g. ros2 topic echo -h,可以看到他還可以設定很多不同的QoS。

Service

Service的部分也有很多指令,先來啟動Service Server:

ros2 run py_srv service_member_function
  1. 這時候可以用ros2 service list來看有哪些Service,應該會看到:

    /add_three_ints
    
  2. 想查看service的資訊,可以用ros2 service type /add_three_ints,應該會看到:

    tutorial_interfaces/srv/AddThreeInts
    

    這個資訊待會可以幫助我們用CLI來執行Service Client。

    其實ros2 service list -t也可以看到同樣的資訊,但是-t會顯示更多資訊,包括service的type和package,應該會看到:

    /add_three_ints [tutorial_interfaces/srv/AddThreeInts]
    
  3. 再來是查詢service的格式,可以用ros2 interface show tutorial_interfaces/srv/AddThreeInts,應該會看到:

    int64 a
    int64 b
    int64 c
    ---
    int64 sum
    

    這個格式待會也會用來來執行CLI的Service Client。

  4. 我們會遇到需要手動設定Service Client來測試Service Server的運作。這時候可以用ros2 service call /add_three_ints tutorial_interfaces/srv/AddThreeInts "{a: 1, b: 2, c: 3}",應該會看到:

    sum: 6
    

    這時候就可以看到Service Server的運作正常了。

  5. Service的CLI不像Topic那麼多,因為Server一定要寫成程式。更多的功能可以用ros2 service -h來看,每個功能也都可以再用-h來看更多細節, e.g. ros2 service call -h

ROS vs. ROS2

其實很多ROS的CLI功能都還沒有在ROS2中實現,像是rostopic echo -n 5 /topic可以用來只顯示最新的5筆訊息,但是ros2 topic echo沒有這個功能。不過ROS2的CLI功能也還在持續開發中,所以未來應該會越來越多。

下面是一些常用的指令,其中還有新增ros node的指令,可以用來查看node的資訊,像是publisher和subscriber的topic name和service name等等。

說明 ROS ROS2 差異
列出所有Topic rostopic list ros2 topic list
監聽Topic rostopic echo /topic ros2 topic echo /topic NA
版本限定 echo 功能 -n指定顯示最新幾筆訊息 -b讀取bag的topic --qos-?qos相關設定 -l截斷array --csv輸出成csv NA
pub data 使用 rostopic pub [topic_name] [topic_type] [data] ros2 topic pub [topic_name] [topic_type] "{data: msgs}" ROS2 data 無法直接使用,要用"{}"包起來
列出所有Service rosservice list ros2 service list NA
版本限定 call 功能 --wait等待service設定 -r 設定request的速度 NA
call args 使用 rosservice call /add_three_ints 1 2 3 ros2 service call /add_three_ints tutorial_interfaces/srv/AddThreeInts "{a: 1, b: 2, c: 3}" ROS2 args 無法直接使用,要用"{}"包起來
列出所有Node rosnode list ros2 node list

Reference



上一篇
Day15 ROS2 自定義Service
下一篇
Day17 ROS2 Action
系列文
ROS2 及 ROS Porting 自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言