1. 程式人生 > >ROS系列六:理解 ROS節點

ROS系列六:理解 ROS節點

轉自:http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingNodes

目錄

先決條件

圖概念概述

節點

客戶端庫

roscore

使用rosnode

使用 rosrun

回顧


 

先決條件

在本教程中我們將使用到一個輕量級的模擬器,請使用以下命令來安裝:

$ sudo apt-get install ros-<distro>-ros-tutorials

用你使用的ROS發行版本名稱(例如electric、fuerte、groovy、hydro等)替換掉'<distro>'。

 

圖概念概述

  • Nodes:節點,一個節點即為一個可執行檔案,它可以通過ROS與其它節點進行通訊。

  • Messages:訊息,訊息是一種ROS資料型別,用於訂閱或釋出到一個話題。

  • Topics:話題,節點可以釋出訊息到話題,也可以訂閱話題以接收訊息。

  • Master:節點管理器,ROS名稱服務 (比如幫助節點找到彼此)。

  • rosout: ROS中相當於stdout/stderr。

  • roscore: 主機+ rosout + 引數伺服器 (引數伺服器會在後面介紹)。

 

節點

一個節點其實只不過是ROS程式包中的一個可執行檔案。ROS節點可以使用ROS客戶庫與其他節點通訊。節點可以釋出或接收一個話題。節點也可以提供或使用某種服務。

(節點是ros中非常重要的一個概念,為了幫助初學者理解這個概念,這裡舉一個通俗的例子:

例如,咱們有一個機器人,和一個遙控器,那麼這個機器人和遙控器開始工作後,就是兩個節點。遙控器起到了下達指 令的作用;機器人負責監聽遙控器下達的指令,完成相應動作。從這裡我們可以看出,節點是一個能執行特定工作任 務的工作單元,並且能夠相互通訊,從而實現一個機器人系統整體的功能。在這裡我們把遙控器和機器人簡單定義為兩個節點,實際上在機器人中根據控制器、感測器、執行機構等不同組成模組,還可以將其進一步細分為更多的節點,這個是根據使用者編寫的程式來定義的。)

客戶端庫

ROS客戶端庫允許使用不同程式語言編寫的節點之間互相通訊:

  • rospy = python 客戶端庫
  • roscpp = c++ 客戶端庫

 

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/ ...
    Pid: 5092

現在,讓我們看看更多的節點。為此,我們將使用rosrun 彈出另一個節點。

 

使用 rosrun

rosrun 允許你使用包名直接執行一個包內的節點(而不需要知道這個包的路徑)。

用法:

 

$ rosrun [package_name] [node_name]

現在我們可以執行turtlesim包中的 turtlesim_node。

然後, 在一個 新的終端:

 

$ rosrun turtlesim turtlesim_node

你會看到 turtlesim 視窗:

  • turtlesim.png

注意: 這裡的 turtle 可能和你的 turtlesim 視窗不同。別擔心,這裡有許多版本的turtle ,而你的是一個驚喜!(一個可愛的小彩蛋~)

在一個 新的終端:

 

$ rosnode list

你會看見類似於:

  • /rosout
    /turtlesim

ROS的一個強大特性就是你可以通過命令列重新配置名稱。

關閉 turtlesim 視窗停止執行節點 (或者回到rosrun turtlesim終端並使用`ctrl

-C`)。現在讓我們重新執行它,但是這一次使用Remapping Argument改變節點名稱:

 

$ rosrun turtlesim turtlesim_node __name:=my_turtle

現在,我們退回使用 rosnode list:

 

$ 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 (provides name service for ROS) + rosout

(stdout/stderr) + parameter server (parameter server will be introduced

later)

  • rosnode = ros+node : ROS tool to get information about a node.
  • rosrun = ros+run : runs a node from a given package.

到這裡,您已經瞭解了ROS節點是如何工作的,下一步,我們來了解一下

ROS話題。如果您想關閉

turtlesim_node,請按下“Ctrl-C”