機器人作業系統ROS Indigo 入門學習(6)——理解ROS Nodes
1.理解ROS Node
這個教程將會介紹ROS圖的概念並且會討論roscoe,rosnode,和rosrun命令列工具。
1.1前提
在這個教程中我們會用到小型模擬器,請安裝:
$ sudo apt-get install ros-<distro>-ros-tutorials
<distro>是你的版本名字
1.2圖概念的概論
Nodes:node是使用ROS去和其它node通訊的可執行檔案。
Messages:ROS中訂閱或者釋出給topic的一種資料形式。
Topics:Nodes可以釋出messages給一個topic,也可以訂閱一個topic去接受它的messages
Master:為ROS提供名稱服務(比如幫助nodes找到彼此)。
rosout:相當於ROS中的stdout/stderr。
roscore:Master+rosout+parameter server(引數服務之後會介紹)。
1.3 Nodes
Node不過是ROS package中一個可執行檔案。ROS node 利用ROS使用者庫去和其他node進行通訊。nodes也可以向topic發起釋出或者訂閱,nodes也可以提供或者使用一個service.
1.4使用者庫
使用者庫允許用不同語言編寫的nodes之間進行通訊:
rospy = python client library
roscpp = c++ client library
1.5roscore
roscore是使用ROS時第一個要使用的工具。
$ roscore
輸出:
... logging to /home/ros/.ros/log/add59068-aab1-11e4-99b0-6c71d92ff4a1/roslaunch-ros-K45VD-17626.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://ros-K45VD:42183/
ros_comm version 1.11.10
SUMMARY
========
PARAMETERS
* /rosdistro: indigo
* /rosversion: 1.11.10
NODES
auto-starting new master
process[master]: started with pid [17638]
ROS_MASTER_URI=http://ros-K45VD:11311/
setting /run_id to add59068-aab1-11e4-99b0-6c71d92ff4a1
process[rosout-1]: started with pid [17651]
started core service [/rosout]
如果roscore沒有初始化並且說缺少許可權,也許是~/.ros資料夾的使用者是root,可以用一下命令遞迴改變資料夾的所有者:
$ sudo chown -R <your_username> ~/.ros
1.6使用rosnode
開啟一個新的終端(前面那個roscore不要關閉),你的環境變數會重置,~/.bashrc被啟用了,如果執行rosnode等命令時有問題時,需要新增一些環境變數setup檔案去使這些命令到~/.bashrc中,或者手動使它們生效。
rosnode顯示了關於正在執行的ros node的資訊。rosnode list列出活動的node.
$ rosnode list
可以看到:
/rosout
這告訴我們這裡只有一個node在執行。這個node總是在執行因為它會收集和記錄node的除錯資訊。
rosnode info命令可以返回特定node的資訊
$ rosnode info /rosout
輸出:
------------------------------------------------------------------------
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/ ...
Pid: 5092
接下來讓我們看看其他的nodes。我們打算用rosrun去執行另一個node。
1.7使用rosrun
rosrun允許你在一個package中去用package的名字直接執行一個node(不需要知道package的路徑)。
用法:
$ rosrun [package_name] [node_name]
因此我們可以利用rosrun去執行在turtlesim的package中的turtlesim_node
在一個新的終端中執行:
$ rosrun turtlesim turtlesim_node
你會在視窗看到:
在一個新終端中執行:
$ rosnode list
將會看到:
/rosout
/turtlesim
ROS一個強大的特點是可以在命令列重新命名。
$ rosrun turtlesim turtlesim_node __name:=my_turtle
再次執行:
$ rosnode list
看到:
/rosout
/my_turtle
如果用Ctrl+c結束程序而不是關閉turtle的視窗那麼在rosnode list時還會看到之前關閉的node,可以用rosnode cleanup清理。
再看看新的/my_turtle node,用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
1.8回顧
roscore = ros +core:master(提供ros的命名服務)+rosout(stdout/stderr)+ parameter server (引數服務之後會介紹);
rosnode = ros +node ;ros用來獲取關於node資訊的工具;
rosrun = ros + run;從一個給定的package執行一個node.
既然你已經理解ros node 是怎樣工作的了,再來看看ros的topic怎樣工作的吧。