基於ROS1.0的stdr simulation搭建多移動機器人(multiple robots)模擬系統
多移動機器人的概念就不敘述了,直接講如何正確的在ROS系統下構建基於stdr simulation和gazebo平臺下的模擬實驗。
1 前提準備
安裝好如下幾個基本的包:
- stdr simulation
- amcl
- move_base
- gazebo_ros
- 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