ROS學習總結(5)

理解ROS例程

主要介紹ROS圖(graph)概念並討論roscore,rosnode和rosrun命令行工具的使用。

先決條件

  • 在本教程中我們將使用到一個輕量級的模擬器,請使用以下命令來安裝:
  • sudo apt-get install ros-kinetic-ros-tutorials

     

  • 圖概念概述

  • Nodes:節點,一個節點即爲一個可執行文件,它可以通過ROS與其它節點進行通信。
  • Messages:消息,消息是一種ROS數據類型,用於訂閱或發佈到一個話題。
  • Topics:話題,節點可以發佈消息到話題,也可以訂閱話題以接收消息。
  • Master:節點管理器,ROS名稱服務 (比如幫助節點找到彼此)。
  • rosout: ROS中相當於stdout/stderr。
  • roscore: 主機+ rosout + 參數服務器 (參數服務器會在後面介紹)。
  • 一個節點其實只不過是ROS程序包中的一個可執行文件。
  • ROS節點可以使用ROS客戶庫與其他節點通信。
  • 節點可以發佈或接收一個話題。
  • 節點也可以提供或使用某種服務。
  • ROS客戶端庫允許使用不同編程語言編寫的節點之間互相通信:
    • rospy = python 客戶端庫
    • roscpp = c++ 客戶端庫
    • rosjs = javascripts客戶端庫
    • rosjava = java客戶端庫

roscore

  • roscore是你在運行所有ROS程序前首先要運行的命令。
  • 請運行:
$ roscore
  • 然後你會看到類似下面的輸出信息:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-

machine_name-13039.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://machine_name:33919/
ros_comm version 1.4.7

SUMMARY
========

PARAMETERS
 * /rosversion
 * /rosdistro

NODES

auto-starting new master
process[master]: started with pid [13054]
ROS_MASTER_URI=http://machine_name:11311/

setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
process[rosout-1]: started with pid [13067]
started core service [/rosout]
  • 如果roscore運行後無法正常初始化,很有可能是存在網絡配置問題。
  • 參見 網絡設置——單機設置
  • 如果roscore不能初始化並提示缺少權限,這可能是因爲~/.ros文件夾歸屬於root用戶(只有root用戶才能訪問)
  • 修改該文件夾的用戶歸屬關係:
$ sudo chown -R <your_username> ~/.ros

使用rosnode

  • 打開一個新的終端, 可以使用 rosnode 像運行roscore一樣看看在 運行什麼...
  • 注意: 當打開一個新的終端時,你的運行環境會復位,同時你的~/.bashrc文件會復原。
  • 如果你在運行類似於rosnode的指令時出現一些問題
  • 也許你需要添加一些環境設置文件到你的~/.bashrc或者手動重新配置他們。
  • rosnode顯示當前運行的ROS節點信息。
  • rosnode list指令列出活躍的節點:
$ rosnode list
  • 你會看到:
/rosout
  • 這表示當前只有一個節點在運行: rosout。
  • 因爲這個節點用於收集和記錄節點調試輸出信息,所以它總是在運行的。
  • rosnode info命令返回的是關於一個特定節點的信息。
$ rosnode info /rosout
  • 這給了我們更多的一些有關於rosout的信息,
  • 例如,事實上由它發佈/rosout_agg
------------------------------------------------------------------------
Node [/rosout]
Publications:
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions:
 * /rosout [unknown type]

Services:
 * /rosout/set_logger_level
 * /rosout/get_loggers

contacting node http://machine_name:54614/ ...
  • 現在,讓我們看看更多的節點。
  • 爲此,我們將使用rosrun彈出另一個節點。

使用 rosrun

  • rosrun允許你使用包名直接運行一個包內的節點(而不需要知道這個包的路徑)。
  • 用法:
$ rosrun [package_name] [node_name]
  • 現在我們可以運行turtlesim包中的 turtlesim_node。
  • 然後, 在一個 新的終端:
$ rosrun turtlesim turtlesim_node
  • 你會看到 turtlesim 窗口:

  • 注意: 這裏的 turtle 可能和你的 turtlesim 窗口不同。

  • 別擔心,這裏有許多版本的turtle ,而你的是一個驚喜!

  • 在一個 新的終端:

$ rosnode list
  • 你會看見類似於:
/rosout
/turtlesim
  • ROS的一個強大特性就是你可以通過命令行重新配置名稱。
  • 關閉 turtlesim 窗口停止運行節點 (或者回到rosrun turtlesim終端並使用ctrl -C)。
  • 現在讓我們重新運行它,但是這一次使用Remapping Argument改變節點名稱:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
  • 現在,我們退回使用rosnodelist:
$ rosnode list
  • 你會看見類似於:
/rosout
/my_turtle
  • 注意: 如果你仍看到 /turtlesim在列表中,這可能意味着你在終端中使用ctrl-C停止節點而不是關閉窗口
  • 或者你沒有$ROS_HOSTNAME環境變量,這在 Network Setup - Single Machine Configuration中有定義。
  • 你可以嘗試清除rosnode 列表,通過:
$ rosnode cleanup
  • 我們可以看到新的/my_turtle節點。

  • 使用另外一個rosnode指令,ping來測試:

$ rosnode ping my_turtle
  • 效果:
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://aqy:42235/     time=1.152992ms
xmlrpc reply from http://aqy:42235/     time=1.120090ms
xmlrpc reply from http://aqy:42235/     time=1.700878ms
xmlrpc reply from http://aqy:42235/     time=1.127958ms

回顧

  • 本節所涉及的內容:
roscore = ros+core : master (提供爲名稱服務) + rosout  (stdout/stderr) + parameter server (參數服務器) 
rosnode = ros+node : 獲取節點信息的ROS工具
rosrun = ros+run :  運行節點工具 
  • 到這裏,您已經瞭解了ROS節點是如何工作的,下一步,我們來了解一下 ROS話題。
  • 如果您想關閉 turtlesim_node,請按下“Ctrl-C”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章