Gazebo雖然是獨立的機器人模擬軟體,非為ROS2而生,不過Gazebo能透過Gazebo_ros_pkgs
這個package 來和ROS或ROS2的任何一個版本做話題與服務的傳遞。
sudo apt install ros-foxy-gazebo-ros-pkgs
細節可以到Gazebo Tutorials查看
,另外Gazebo不同的版本就有不同的教學網站!個人目前使用Gazebo-classic,所以試看這一份~
沒有影片,不過上面那張途中右邊的小車是不斷在接收ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.5}}'
也就是一直往前走~
在URDF的最後加上<gazebo><plugin>...
<?xml version="1.0"?>
<robot name="ej_robot">
...
<gazebo>
<plugin name="diff_drive_controller" filename="libgazebo_ros_diff_drive.so">
<!-- Update rate in Hz -->
<update_rate>50</update_rate>
<!-- wheels -->
<left_joint>left_wheel_joint</left_joint>
<right_joint>right_wheel_joint</right_joint>
<!-- kinematics -->
<wheel_separation>0.45</wheel_separation>
<wheel_diameter>0.2</wheel_diameter>
<!-- output -->
<publish_odom>true</publish_odom>
<publish_odom_tf>true</publish_odom_tf>
<publish_wheel_tf>true</publish_wheel_tf>
<odometry_topic>odom</odometry_topic>
<odometry_frame>odom</odometry_frame>
<robot_base_frame>base_link</robot_base_frame>
</plugin>
</gazebo>
</robot>
<plugin>
的種類不論是差速小車或是阿克曼小車,都有相對應的<plugin>
可以使用,就連桿測器等等都有,附上Plugin Types,常用可分成
XML Macros,中文翻譯為XML巨集,簡單來說就是一個讓xml檔的撰寫能更簡短且方便讀取之功能。
xacro ej_robot.urdf.xacro > ej_robot.urdf
拿我們的差速小車舉例,左右後輪的尺寸重量是一樣的,這樣URDF寫起來有很的重複的地方,今天突然要改尺寸的話,就要每的地方都改一次,還有可能會漏掉...xacro方便之處就是可以設置變數!
<xacro:property name="base_length" value="0.6" />
<xacro:property name="base_width" value="0.4" />
<xacro:property name="base_height" value="0.2" />
<xacro:property name="wheel_radius" value="0.1" />
<xacro:property name="wheel_length" value="0.05" />
替代成
<link name="right_wheel_link">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}" />
</geometry>
<origin xyz="0 0 0" rpy="${pi / 2.0} 0 0" />
<material name="grey" />
</visual>
<collision>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}" />
</geometry>
<origin xyz="0 0 0" rpy="${pi / 2.0} 0 0" />
</collision>
</link>
也可以寫函式或include檔案~
<xacro:macro name="cylinder_inertia" params="m r h xyz rpy">
<inertial>
<origin xyz="${xyz}" rpy="${rpy}" />
<mass value="${m}" />
<inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy="0" ixz="0"
iyy="${(m/12) * (3*r*r + h*h)}" iyz="0"
izz="${(m/2) * (r*r)}" />
</inertial>
</xacro:macro>
<xacro:include filename="parameter.xacro" />
大致上介紹到這裡,差速小車比較不容易失敗,可以自己做一台來玩玩~