1. 程式人生 > >【模擬】Ros by example1 控制底座、導航、路徑規劃、SLAM

【模擬】Ros by example1 控制底座、導航、路徑規劃、SLAM

為了快速瀏覽教程,先從ArbotiX虛擬器開始。具體程式碼看ros-by-example 1,主要講述實現過程。

首先要啟動一個虛擬的Turtlebot

$ roslaunch rbx1_bringup fake_turtlebot.launch

另一個終端,開啟RViz視覺化機器人運動

$ rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz

一、控制底座

1、直接釋出命令

先來看下現有的話題

基控制器節點訂閱/cmd_vel話題,型別是geometry_msgs/Twist

然後把Twist訊息翻譯成發動機訊號,使輪子轉動。二維平面差速驅動機器人只用到了線速度x和角速度z部分。

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

想要機器人停下來,釋出空訊息即可

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}'

2、從ROS節點發布Twist訊息

任務:定時的Twist命令讓機器人向前移動1.0m,旋轉180度,然後返回原位置。

在啟動虛擬Turtlebot和RViz基礎上,直接執行寫好的節點

$ rosrun rbx1_nav timed_out_and_back.py

3、使用測程法前進

$ rosrun rbx1_nav odom_out_and_back.py

儲存內部位置資料的訊息型別是nav_msgs/Odometry

基框架為/odom,測量框架為/base_footprint即現實中的機器人。

tf庫來監聽框架/odom和框架/base_footprint之間的轉換。


接下來導航、路徑規劃、SLAM,主要涉及三個包

  • 讓機器人移動到指定目標位置,運用了路徑規劃和障礙物躲避的move_base包
  • 用深度相機、鐳射掃描器繪製地圖的gmapping包
  • 在現有地圖下定位的acml包

二、導航、路徑規劃、SLAM

move_base

定義該節點需要四個配置檔案,越過障礙物的代價、機器人半徑、路徑規劃時考慮未來多長的路、移動速度等。在rbx1包的config子目錄可以找到:

base_local_planner_params.yaml 
costmap_common_params.yaml 
global_costmap_params.yaml 
local_costmap_params.yaml

釋出命令測試move_base

roslaunch rbx1_bringup fake_turtlebot.launch 
roslaunch rbx1_nav fake_move_base_blank_map.launch 
rosrun rviz rviz -d rospack find rbx1_nav/nav.rviz
rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ‘{ header: { frame_id: “map” }, pose: { position: { x: 1, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }’

 空白地圖的啟動節點是fake_move_base_blank_map.launch 

<launch>
 <!-- 啟動空白地圖。節點包、節點名稱、執行檔案:map_server,地圖位置args -->
 <node name="map_server" pkg="map_server" type="map_server" 
 args="$(findrbx1_nav)/maps/blank_map.yaml"/>

 <!-- 釋出move_base節點,載入所有引數(引用fake_move_base.launch檔案) -->
 <include file="$(find rbx1_nav)/launch/fake_move_base.launch" />

 <!-- 靜態變換繫結 /odom and /map 框架。節點包:tf-->
 <node pkg="tf" type="static_transform_publisher" name="odom_map_broadcaster"
 args="0 0 0 0 0 0 /odom /map 100" />
</launch>

其中引用了 fake_move_base.launch檔案

<launch>
 <!-- 節點包move_base -->
 <node pkg="move_base" type="move_base" respawn="false" name="move_base"
 output="screen">

 <!-- 啟動呼叫rosparam file五次,載入之前提到的引數,並啟動節點。區分全域性和區域性地圖-->
 <rosparam file="$(find rbx1_nav)/config/fake/costmap_common_params.yaml"
 command="load" ns="global_costmap" />
 <rosparam file="$(find rbx1_nav)/config/fake/costmap_common_params.yaml"
 command="load" ns="local_costmap" />
 <rosparam file="$(find rbx1_nav)/config/fake/local_costmap_params.yaml"
 command="load" />
 <rosparam file="$(find rbx1_nav)/config/fake/global_costmap_params.yaml"
 command="load" />
 <rosparam file="$(find rbx1_nav)/config/fake/base_local_planner_params.yaml"
 command="load" />
 </node>
</launch>

move_base走正方形

roslaunch rbx1_bringup fake_turtlebot.launch 
roslaunch rbx1_nav fake_move_base_blank_map.launch 
rosrun rviz rviz -d rospack find rbx1_nav/nav.rviz 
rosrun rbx1_nav move_base_square.py

move_base避開障礙物

roslaunch rbx1_bringup fake_turtlebot.launch 
rosparam delete /move_base 
roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch 
rosrun rviz rviz -d rospack find rbx1_nav/nav_obstacles.rviz 
rosrun rbx1_nav move_base_square.py

è¿éåå¾çæè¿°

gmapping和acml導航、定位

roslaunch rbx1_bringup fake_turtlebot.launch 
roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml 
rosrun rviz rviz -d rospack find rbx1_nav/amcl.rviz

è¿éåå¾çæè¿°