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 節點了。
下一篇介紹:
在下一篇中,我們將實現在模擬環境下的多機器人協作,防止機器人之間的碰撞,機器人的同步,以及自定義消息的創建。