1. 程式人生 > >基於ROS1.0的stdr simulation搭建多移動機器人(multiple robots)模擬系統

基於ROS1.0的stdr simulation搭建多移動機器人(multiple robots)模擬系統


 

多移動機器人的概念就不敘述了,直接講如何正確的在ROS系統下構建基於stdr simulation和gazebo平臺下的模擬實驗。

1    前提準備

安裝好如下幾個基本的包:

  1. stdr simulation
  2. amcl
  3. move_base
  4. gazebo_ros
  5. turtlebot2的完整包

等其他必要的ROS環境

2    單移動機器人和多移動機器人的配置區別

單移動機器人比較簡單,也不用關注與namespace這些問題,二多移動機器人,因為每個機器人都具備同樣的基本功能,因此不可避免的需要用到namespace(以下簡稱ns)的概念將他們區分開,這樣就可以一直通過namespace複製同樣基本功能的機器人了。如果你不採用ns的方式,而是簡單的不斷生成新的機器人,即使你保證他們的位置不同,但是因為node名重複,ROS會kill之前的node保留最後一個生成的機器人狀態。

但是除了namespace外,還需要配置tf_prefixes的引數值,這是最大的區別之處,也是最重要的,能否成功的生成多個移動機器人。

2.1    要明確的概念

構造多移動機器人在一張map中,這個map可以使slam構建的,無論你是用cartographer,hector_slam,gmapping等。我們都是希望map只有一張,每個機器人是全域性共享的。

每個機器人之間除了初始時刻的位姿不同以外,其他的結構,攜帶的感測器型別都完全一樣,沒有差別。當然你可以根據自己的需求使得他們不同。如果希望每個機器人都可以通過amcl和move_base進行自主導航和實時定位,那麼每個機器人都應當具備amcl和move_base。

因此,map是全域性的,不需要ns,機器人的構建,amcl和move_base是需要ns的,因為每個移動機器人都需要具備這些屬性。

如下結構所示:

                                        /map
        /robot1/robot_state_publisher        /robot2/robot_state_publisher
        /robot1/robot_pose_ekf               /robot2/robot_pose_ekf
        /robot1/amcl                         /robot2/amcl
        /robot1/move_base                    /robot2/move_base
        /robot1/laser_0                      /robot2/laser_0
        /robot1/sensor0                      /robot2/sensor0
        /robot1/sensor1                      /robot2/sensor0
        .......                              ........

2.2    配置單個機器人的launch檔案,然後就可以在其他launch檔案中無限的複製單個移動機器人的個數了:

2.2.1      在你的工作空間下新建一個專案:

cd ~/catkin_ns/src
catkin_creat_pkg multi_robots
cd multi_robots
mkdir launch map param rviz 
tree

最終如下所示:

~/catkin_ws/src/multi_robots$ tree
.
├── CMakeLists.txt
├── launch
├── map
├── package.xml
├── param
└── rviz

4 directories, 2 files

在launch檔案下,新建one_robot.launch

內容如下:

<!-- 
這是在gazebo平臺的模擬實驗
本檔名為:one_robot.launch
-->
<launch>
    <arg name="robot_name"/>
    <arg name="init_pose"/>

    <node name="spawn_minibot_model" pkg="gazebo_ros" type="spawn_model"
     args="$(arg init_pose) -urdf -param /robot_description -model $(arg robot_name)"
     respawn="false" output="screen" />

    <node pkg="robot_state_publisher" type="robot_state_publisher" 
          name="robot_state_publisher" output="screen"/>

    <!-- The odometry estimator, throttling, fake laser etc. go here -->
    <!-- All the stuff as from usual robot launch file -->
</launch>

在launch檔案中,有兩個變數,robot_name和init_pose,可以通過這兩個引數生成無數個移動機器人。

2.2.2    在launch資料夾下建立,名為:myrobots.launch的檔案

檔案內容如下:

<!--
這是在gazebo平臺的模擬實驗
本檔名為:myrobots.launch
在這個檔案中首先載入了turtlebot2的模型
然後建立了3個移動機器人

-->
<launch>
  <!-- No namespace here as we will share this description. 
       Access with slash at the beginning -->
  <param name="robot_description"
    command="$(find xacro)/xacro.py $(find turtlebot_description)/robots/kobuki_hexagons_asus_xtion_pro.urdf.xacro" />

  <!-- BEGIN ROBOT 1-->
  <group ns="robot1">
    <param name="tf_prefix" value="robot1_tf" />
    <include file="$(find multi_robots)/launch/one_robot.launch" >
      <arg name="init_pose" value="-x 1 -y 1 -z 0" />
      <arg name="robot_name"  value="Robot1" />
    </include>
  </group>

  <!-- BEGIN ROBOT 2-->
  <group ns="robot2">
    <param name="tf_prefix" value="robot2_tf" />
    <include file="$(find multi_robots)/launch/one_robot.launch" >
      <arg name="init_pose" value="-x -1 -y 1 -z 0" />
      <arg name="robot_name"  value="Robot2" />
    </include>
  </group>
  
  <!-- BEGIN ROBOT 3-->
  <group ns="robot3">
    <param name="tf_prefix" value="robot3_tf" />
    <include file="$(find multi_robots)/launch/one_robot.launch" >
      <arg name="init_pose" value="-x 1 -y 2 -z 0" />
      <arg name="robot_name"  value="Robot3" />
    </include>
  </group>
</launch>

2.2.3    在launch資料夾下,建立main.launch,用來載入之前的myroobts.launch並且還可以將其他的內容加在這裡,所以命名成main.launch

內容如下:

<!-- 
這是在gazebo平臺的模擬實驗
本檔名為:main.launch

第一段是執行gazebo中的一個地圖環境,直接使用的是tuetlebot_gazebo中的,你也可以載入自己的地圖
第二段是執行建立的移動機器人群體
-->
<launch>
  <param name="/use_sim_time" value="true" />

  <!-- start world -->
  <node name="gazebo" pkg="gazebo_ros" type="gazebo" 
   args="$(find turtlebot_gazebo)/worlds/playground.world" respawn="false" output="screen" />


  <!-- include our robots -->
  <include file="$(find multi_robots)/launch/myrobots.launch"/>
</launch>

至此初步的配置已經完成了。

如果你是按照我的工程名字建立的,則不需要改動,如果你的包是你自定義的,則需要講myrobots.launch檔案中的multi_robots全部替換成你的包的名字。

3    檢視在gazebo模擬中的情況

roslaunch multi_robots main.launch

注意第一次載入gazebo會話費很長時間,或者報錯,請耐心等待,或者重新執行launch檔案。

結果如下圖1所示:

                          

                                                                                     圖1

三個turtlebot2成功的在地圖中建立了。

現在你可以訂閱cmd_vel話題,使用鍵盤控制每一個小車移動了

當然你也可以編寫自己的運動控制演算法來驗證自己的演算法了。 

               

                                                                                               圖2

圖2為執行時的node和引數,注意tf_prefix一定要設定,很關鍵

從圖2中可以看出,三個移動機器人分別屬於robot1,robot2,robot3,的名稱空間。

rostopic list 的全部資訊如下所示:

/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/robot1/camera/depth/camera_info
/robot1/camera/depth/image_raw
/robot1/camera/depth/points
/robot1/camera/parameter_descriptions
/robot1/camera/parameter_updates
/robot1/camera/rgb/camera_info
/robot1/camera/rgb/image_raw
/robot1/camera/rgb/image_raw/compressed
/robot1/camera/rgb/image_raw/compressed/parameter_descriptions
/robot1/camera/rgb/image_raw/compressed/parameter_updates
/robot1/camera/rgb/image_raw/compressedDepth
/robot1/camera/rgb/image_raw/compressedDepth/parameter_descriptions
/robot1/camera/rgb/image_raw/compressedDepth/parameter_updates
/robot1/camera/rgb/image_raw/theora
/robot1/camera/rgb/image_raw/theora/parameter_descriptions
/robot1/camera/rgb/image_raw/theora/parameter_updates
/robot1/joint_states
/robot1/mobile_base/commands/motor_power
/robot1/mobile_base/commands/reset_odometry
/robot1/mobile_base/commands/velocity
/robot1/mobile_base/events/bumper
/robot1/mobile_base/events/cliff
/robot1/mobile_base/sensors/imu_data
/robot1/odom
/robot2/camera/depth/camera_info
/robot2/camera/depth/image_raw
/robot2/camera/depth/points
/robot2/camera/parameter_descriptions
/robot2/camera/parameter_updates
/robot2/camera/rgb/camera_info
/robot2/camera/rgb/image_raw
/robot2/camera/rgb/image_raw/compressed
/robot2/camera/rgb/image_raw/compressed/parameter_descriptions
/robot2/camera/rgb/image_raw/compressed/parameter_updates
/robot2/camera/rgb/image_raw/compressedDepth
/robot2/camera/rgb/image_raw/compressedDepth/parameter_descriptions
/robot2/camera/rgb/image_raw/compressedDepth/parameter_updates
/robot2/camera/rgb/image_raw/theora
/robot2/camera/rgb/image_raw/theora/parameter_descriptions
/robot2/camera/rgb/image_raw/theora/parameter_updates
/robot2/joint_states
/robot2/mobile_base/commands/motor_power
/robot2/mobile_base/commands/reset_odometry
/robot2/mobile_base/commands/velocity
/robot2/mobile_base/events/bumper
/robot2/mobile_base/events/cliff
/robot2/mobile_base/sensors/imu_data
/robot2/odom
/robot3/camera/depth/camera_info
/robot3/camera/depth/image_raw
/robot3/camera/depth/points
/robot3/camera/parameter_descriptions
/robot3/camera/parameter_updates
/robot3/camera/rgb/camera_info
/robot3/camera/rgb/image_raw
/robot3/camera/rgb/image_raw/compressed
/robot3/camera/rgb/image_raw/compressed/parameter_descriptions
/robot3/camera/rgb/image_raw/compressed/parameter_updates
/robot3/camera/rgb/image_raw/compressedDepth
/robot3/camera/rgb/image_raw/compressedDepth/parameter_descriptions
/robot3/camera/rgb/image_raw/compressedDepth/parameter_updates
/robot3/camera/rgb/image_raw/theora
/robot3/camera/rgb/image_raw/theora/parameter_descriptions
/robot3/camera/rgb/image_raw/theora/parameter_updates
/robot3/joint_states
/robot3/mobile_base/commands/motor_power
/robot3/mobile_base/commands/reset_odometry
/robot3/mobile_base/commands/velocity
/robot3/mobile_base/events/bumper
/robot3/mobile_base/events/cliff
/robot3/mobile_base/sensors/imu_data
/robot3/odom
/rosout
/rosout_agg
/tf
/tf_static

可以看到,屬於不同robot名稱空間的移動機器人基本功能完全一樣。rqt_graph就不貼了,太大了,截圖也看不清楚。

至此在gazebo中的基本載入多機器人的模擬環境已經具備,你可以通過訂閱話題對你的運動控制演算法進行驗證了。

注意,如果你要載入laser_scan鐳射雷達或者其他感測器,只需要在one_robot.launch註釋的位置之間新增就可以了,其他檔案不用修改。

可以參考連結:

multi-robots+laser rviz :https://answers.ros.org/question/40397/multirobot-laser-rviz/

4     配置導航包

導航包的寫法可以參考ROS官網給出的例項:

link:http://wiki.ros.org/navigation/Tutorials/RobotSetup

在launch檔案下新建一個move_base.launch檔案,

內容如下:

<launch>    
  <!--- Run AMCL -->
  <include file="$(find amcl)/examples/amcl_diff.launch" />

  <!-- Define your move_base node -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find your_pkg)/costmap_common_params.yaml" command="load" ns="global_costmap"/>
    <rosparam file="$(find your_pkg)/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find your_pkg)/local_costmap_params.yaml"  command="load" />
    <rosparam file="$(find your_pkg)/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find your_pkg)/base_local_planner_params.yaml" command="load" />

    <remap from="map" to="/map" />
  </node>
</launch>

接著繼續新建一個navigation.launch檔案,

內容如下:

<launch>
  <param name="/use_sim_time" value="true"/>

  <!-- Run the map server -->
  <node name="map_server" pkg="map_server" type="map_server" args="$(find your_pkg)/map/map.yaml" >
    <param name="frame_id" value="/map" />
  </node>

  <group ns="robot1">
    <param name="tf_prefix" value="robot1_tf" />
    <param name="amcl/initial_pose_x" value="1" />
    <param name="amcl/initial_pose_y" value="1" />
    <include file="$(find your_pkg)/launch/move_base.launch" />
  </group>

  <group ns="robot2">
    <param name="tf_prefix" value="robot2_tf" />
    <param name="amcl/initial_pose_x" value="-1" />
    <param name="amcl/initial_pose_y" value="1" />
    <include file="$(find your_pkg)/launch/move_base.launch" />
  </group>

  <node pkg="rviz" type="rviz" name="rviz" args="-d $(find your_pkg)/config/multi.vcg"
   output="screen" />

</launch>

這幾個launch檔案都需要針對你自己的環境做修改的,之間執行是不正確的。

5    關於tf_prefix的資訊,可以在ROS官網看到

link:http://wiki.ros.org/tf2/Migration

6     如果執行launch檔案時提示tf2  “/” 的錯誤

這是由於tf2中去除了“/”的檢測,這與tf是有區別的,解決辦法就是講話題的“/”全部刪除

7    還可以通過這個視屏學習關於multiple robots的配置

link:https://www.youtube.com/watch?v=mFTkN5v4Jzc&t=370s 

8    stdr simulation 平臺實現多移動機器人的建立,amcl定位和move_base的導航

updating