ros下多機器人系統(1)


  multi-robot system

  經過兩個多月的ros學習,對ros的認識有了比較深入的了解,本篇博客主要記錄在ros下開發多機器人系統以及對ros更深入的開發。本篇博客是假定讀者已經學習完了全部ros tutorials

Beginner Level 和 Intermediate Level

  

  目錄:

 

  同一電腦運行多機器人節點

  現在我們開始嘗試運行兩個相同的turtlesim節點(nodes),打開三個運行如下命令:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_node

  得到的結果如下:

  第一次運行的turtlesim_node 被終止了。ros不允許相同名字的節點同時運行,如果第二個節點運行,第一個會被自動終結。

  參數重映射(Remapping Arguments):一個節點中的任何ROS名稱可以在命令行重映射,這是ROS中的一個非常重要且強大的特征。

  有了這個特征,我們就可以實現在同一台電腦中控制多個節點做不同的事了:

  如果要同時運行多個節點的話,是一定要改名字的,一下介紹兩種改名字的方法:

    第一種:直接在命令行改名字

更改第二個命令:
rosrun turtlesim turtlesim_node __name:=turtlesim2
再運行:
rostopic pub /turtle1/cmd_vel -r 10 geometry_msgs/Twist '{linear:{x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

   現在可以實現同時控制兩個turtlesim_node了

    第二種:使用launch文件

  創建 multi_turtlesim.launch

<launch>
    <group ns="sim1">
        <node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
        <node name="controller" pkg="turtlesim" type="draw_square"/>
    </group>
    <group ns="sim2">
        <node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
        <node name="controller" pkg="turtlesim" type="draw_square"/>
    </group>
</launch>

  我們直接在launch文件中更改了節點的namespaces,運行rqt_graph可以更直接的看到我i們的修改:

  

 

  如果要實現多個節點受不同的控制,創建 remapping_turtlesim.launch ,並運行:

<launch>
    <group ns="sim1">
        <node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
    </group>
    <group >
        <node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
    </group>
    <node pkg="turtlesim" name="teleop" type="turtle_teleop_key" output="screen">
    <remap from="/turtle1/cmd_vel" to="/sim1/turtle1/cmd_vel"/>
    </node>
</launch>

  這里,我們將  topic  /turtle1/cmd_vel 改成 /sim1/turtle1/cmd_vel,

  再運行:

rostopic pub /turtle1/cmd_vel -r 10 geometry_msgs/Twist '{linear:{x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

  現在我們可以發現,其中一只turtle在轉圈,而另外一只受鍵盤控制。

 

 不同電腦在同一roscore下運行多機器人節點

  上面我們已經能在同一電腦中實現多機器人的控制了,接下來,我們將實現在不同電腦中實現多機器人的控制。

  首先,准備兩台電腦並確保在同一wifi下,然后運行 ifconfig 

假設得到的結果為:
192.168.1.151 (machine A)
192.168.1.154 (machine B)

  然后,在machine B 上運行:

ping 192.168.1.151

  如果有返回,則可以實現兩台電腦的通信。

  現在,我們以machine A為主機建立多機器人系統。

  然后再在machine A的  .bashrc 中添加:

function get_ip_address { ifconfig | fgrep -v 127.0.0.1 | fgrep '掩碼:255.255.255.0' | egrep -o '地址:[^ ]*' | sed 's/^.*://'; }
export ROS_IP=$( get_ip_address )

  在machine B的 .bashrc中添加:

function get_ip_address { ifconfig | fgrep -v 127.0.0.1 | fgrep '掩碼:255.255.255.0' | egrep -o '地址:[^ ]*' | sed 's/^.*://'; }
export ROS_IP=$( get_ip_address )
export ROS_MASTER_URI=http://192.168.1.151:11311

  現在,可以實現多電腦的機器人通信了:

在 machine A中運行:roscore
在 machine A中運行:turtlesim 節點
在 machine B中運行:turtlesim2節點
在 machine B中運行:teleop_key 節點

  完成上述步驟后,你就會發現,我們可以同時控制A與B兩個turtlesim 節點了。

 

   下一篇介紹:

  在下一篇中,我們將實現在模擬環境下的多機器人協作,防止機器人之間的碰撞,機器人的同步,以及自定義消息的創建。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM