b站上有一個非常好的ros教程234仿真之URDF_link標簽簡介-機器人系統仿真_嗶哩嗶哩_bilibili,推薦去看原視頻。
視頻教程的相關文檔見:6.7.1 機器人運動控制以及里程計信息顯示 · Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程
本文對視頻教程第六章的主要內容做一個總結,視頻教程沒有集成的代碼,都是每一課分散的代碼,本文把主要代碼集合進來,給嫌視頻太長不想看的同學做一個總結。教程視頻中使用的是rplidar,那個很不好用,也不接近現實。本文改用Velodyne的lidar,相對更好用一些。Velodyne源代碼在github。
本文主要包括以下內容:
gazebo仿真世界的構建,mobile robot的構建,RGB相機和雷達這兩個傳感器的構建,如何獲取傳感器的數據并在rviz中顯示,以及robot的控制器。
下載資源,可以得到如下的
文件結構
工作空間文件夾:ros_robot_navi,工作空間文件夾下:
src中包含兩個功能包:
velodyne_descreption是github上下載的lidar仿真模塊。
進入 robot_sim中,有如下結構
urdf中放的是robot lidar camera等模型文件,worlds中放的是gazebo模擬世界的環境,launch中就是launch文件了。
robot建模
在urdf/gazebo/中,放的是各類模型。
以my_base.xacro文件為例,這個是robot的底座
<link name="base_footprint"><visual><geometry><sphere radius="${base_footprint_radius}" /></geometry></visual></link>
link標簽就是機器人的各個部件,各個部件之間,通過joint標簽相連接
<joint name="base_link2base_footprint" type="fixed"><parent link="base_footprint" /><child link="base_link" /><origin xyz="0 0 ${earth_space + base_link_length / 2 }" /></joint>
collision和initial屬性是gazebo仿真必須的屬性。進行剛體力學 運動學計算和碰撞計算。
my_car.xacro將各個部分拼裝在一起。move是小車運動控制器。
<!-- 組合小車底盤與攝像頭 -->
<robot name="my_car" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="my_head.xacro" /><xacro:include filename="my_base.xacro" /><xacro:include filename="my_camera.xacro" /><xacro:include filename="my_laser.xacro" /><xacro:include filename="move.xacro" /><xacro:include filename="$(find velodyne_description)/urdf/VLP-16.urdf.xacro"/><xacro:VLP-16 parent="support" name="velodyne" topic="/velodyne_points" hz="10" samples="440" gpu="false"><origin xyz="0 0 0.4" rpy="0 0 0" /></xacro:VLP-16>
</robot>
在集成lidar時,parent是提前建好的joint中的父節點。通過parent這個參數,就可以建立lidar模塊和小車底座模塊的聯系。
launch
在robot_sim功能包的launch文件夾中,car_env_gazebo.launch
<launch><!--launch urdf content to param server--><param name="robot_description" command="$(find xacro)/xacro $(find robot_sim)/urdf/gazebo/my_car.xacro" /><!-- launch gazebo --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find robot_sim)/worlds/box_house.world" /></include><!-- display robot in gazebo--><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>
command命令是為了將.xacro轉為.urdf。也可以通過以下命令單獨進行轉化:
進入要轉化的.xacro文件夾
rosrun xacro xacro xxx.xacro > xxx.urdf
把轉化集成進.launch中的好處是改了模型以后不用單獨轉化,直接運行。壞處是,如果模型有問題,不知道哪里報錯。如果在gazebo中沒有正確顯示出模型,那么再單獨運行這個轉化命令,看看是模型哪里寫錯了。
運行這個.launch文件
roslaunch robot_sim car_env_gazebo.launch
就可以在gazebo中看到小車和雷達了
再運行 my_car_rviz.launch
<launch><param name="robot_description" command="$(find xacro)/xacro $(find robot_sim)/urdf/gazebo/my_car.xacro" /><node pkg="rviz" type="rviz" name="rviz" /><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" /><node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" /></launch>
就可以在rviz中看到lidar的點云和相機的圖片了
?
小車也可以加進來
運動控制
再打開一個終端,source一下,運行
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
?控制小車運動。