昨天只把差速小車的外觀建模出來,這時後送入Gazebo中仍然什麼都看不到!
先提一下要怎麼用Gazebo檢視這個URDF檔案,在【AMR_Day19】有介紹到如何使用RQt發送Service,那Gazebo在啟動時,提供了一些Service供ROS2使用。
ros2 service list
/delete_entity
/gazebo/describe_parameters
/gazebo/get_parameter_types
/gazebo/get_parameters
/gazebo/list_parameters
/gazebo/set_parameters
/gazebo/set_parameters_atomically
/get_model_list
/pause_physics
/reset_simulation
/reset_world
/spawn_entity
/unpause_physics
要注意!啟動Gazebo的方式有兩種。
# 單純開啟gazebo不與ROS2連結
gazebo
# 開啟gazebo與ROS2連結,後面的這些是為了連結gazebo_ros的動態函式庫
gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so
如果只用gazebo再ros2 service list,會發現沒有任何Service的存在哦!!!
其中spawn_entity就是負責把URDF或SDF的內容送給Gazebo~
為了成功在Gazebo模擬差速小車,我們要來幫它添加<inertial>
和<collision>
~
collision
碰撞比較單純,以昨天的車身為例,只要將<visual>
的內容移植成<collision>
就好!
<?xml version="1.0"?>
<robot name="ej_robot">
<link name="base_link"/>
<link name="chaiss">
<visual>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</visual>
<!--除了材料之外,其他都一樣!-->
<collision>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</collision>
</link>
...
</robot>
inertial
接下來是需要添加慣性矩的部份。
我們用的形狀比較單純,可以帶入公式得到~
來源:wiki inertia
<inertial>
的子元素有位置資訊、質量、慣性矩數值。ixx ixy ixz
ixy iyy iyz
ixz iyz izz
<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>
一樣以車身為例
<?xml version="1.0"?>
<robot name="ej_robot">
<link name="base_link"/>
<link name="chaiss">
<visual>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</visual>
<collision>
<geometry>
<box size="0.6 0.4 0.2"/>
</geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</collision>
<!--慣性矩-->
<inertial>
<origin xyz="0 0 0.1" rpy="0 0 0" />
<mass value="1.0" />
<inertia ixx="0.033" ixy="0" ixz="0"
iyy="0.043" iyz="0"
izz="0.17" />
</inertial>
</link>
...
</robot>
雖然添加了物理特性,但我們還沒添加ROS的控制函式在小車上~
以及,要介紹一下方便寫URDF的小工具:XACRO!!!!