【模擬】Ros by example1 控制底座、導航、路徑規劃、SLAM
阿新 • • 發佈:2018-11-15
為了快速瀏覽教程,先從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