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怎樣工作的

.