写在前面
ERB
可以定义宏变量,将代码模块化。有许多相似的link
时就可以使用这种嵌入式的语言
ROS
官方支持的机器人文件格式是URDF
,GAZEBO官方支持的机器人文件格式是SDF
GAZEBO可以支持URDF
也可以支持SDF
,但是想在ROS的RVIZ
工具中显示模型就只能用URDF
URDF
有一个更高级嵌入式方式,叫xacro
,和ERB
相似。区别是SDF
功能性比URDF
更强
如果涉及更复杂的模型建模,可以使用Solidworks
建模,使用插件导出URDF
(一般机器人、工业机械臂用的这个软件);用Blender
建模,使用插件可以导出sdf
。更普遍的方法是直接到处stl
或者别的格式文件,然后在sdf
中使用uri
引用即可。
URDF
和sdf
两种文件格式也能相互转换,见参考链接
第三个案例:使用ERB构建车辆模型
实际使用下来,对于小模型便捷性并不强,各种参数也得先算好再替换。仅作参考
车辆建模
步骤一:
在~/XX/PX4_Firmware/Tools/sitl_gazebo/models/my_car
文件夹下创建my_car.rsdf
文件
步骤二:
首先定义地盘、车轮参数,<% %>
<%
# Geometry
chassis_length = 2.0
chassis_width = 1.0
chassis_height = 0.5
wheel_radius = 0.4
wheel_length = 0.2
left_wheel_location_x0 = -0.5
left_wheel_location_y0 = chassis_width / 2 + wheel_length / 2
# Inertial
chassis_mass = 1.14395
chassis_ixx = chassis_mass/12.0 * (chassis_width**2 + chassis_height**2)
chassis_iyy = chassis_mass/12.0 * (chassis_height**2 + chassis_length**2)
chassis_izz = chassis_mass/12.0 * (chassis_length**2 + chassis_width**2)
wheel_mass = 1
wheel_ixx = wheel_mass * (wheel_radius**2 / 4.0 + wheel_length**2 / 12.0)
wheel_iyy = wheel_mass * (wheel_radius**2 / 4.0 + wheel_length**2 / 12.0)
wheel_izz = wheel_mass/2.0 * wheel_radius**2
%>
步骤三:
在模型中取值,<%= %>
<sdf version="1.7">
<model name="my_car" canonical_link="chassis">
<static>true</static>
<pose relative_to="world">0 0 0 0 0 0</pose>
<link name="chassis">
<pose relative_to="__model__">0.5 0 <%= wheel_radius %> 0 0 0</pose>
<inertial>
<mass><%= chassis_mass %></mass>
<inertia>
<ixx><%= chassis_ixx %></ixx>
<iyy><%= chassis_iyy %></iyy>
<izz><%= chassis_izz %></izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<visual name="chassis_visual">
<geometry>
<box>
<size><%= chassis_length%> <%= chassis_width%> <%= chassis_height%> 0 0 0</size>
</box>
</geometry>
<material>
<ambient>0.0 0.0 1.0 1</ambient>
<diffuse>0.0 0.0 1.0 1</diffuse>
<specular>0.0 0.0 1.0 1</specular>
</material>
<collision name="chassis_collision">
<geometry>
<box>
<size><%= chassis_length%> <%= chassis_width%> <%= chassis_height%> 0 0 0</size>
</box>
</geometry>
</collision>
</visual>
</link>
<%
wheel_locations = {
"left_wheel" => {:x0 => left_wheel_location_x0, :y0 => left_wheel_location_y0},
"right_wheel" => {:x0 => left_wheel_location_x0, :y0 => -left_wheel_location_y0},
}
%>
<!-- 这是一个循环,注意要有end结尾 -->
<%
wheel_locations.keys.each do |wheel|
x0 = wheel_locations[wheel][:x0]
y0 = wheel_locations[wheel][:y0]
%>
<%= '<link name="' + wheel + '">' %>
<pose relative_to="chassis"><%= x0 %> <%= y0 %> 0 <%= -Math::PI/2%> 0 0</pose>
<inertial>
<mass>1</mass>
<inertia>
<ixx><%= wheel_ixx %></ixx>
<iyy><%= wheel_iyy %></iyy>
<izz><%= wheel_izz %></izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<%= '<visual name="' + wheel + '_visual">' %>
<geometry>
<cylinder>
<radius><%= wheel_radius %></radius>
<length><%= wheel_length %></length>
</cylinder>
</geometry>
<material>
<ambient>1.0 0.0 0.0 1</ambient>
<diffuse>1.0 0.0 0.0 1</diffuse>
<specular>1.0 0.0 0.0 1</specular>
</material>
</visual>
<%= '<collision name="' + wheel + '_collision">' %>
<geometry>
<cylinder><%= wheel_radius %></cylinder>
<length><%= wheel_length %></length>
</geometry>
</collision>
</link>
<% end %>
<%
caster_location_x = 0.8
caster_location_z = -wheel_radius/2
caster_radius = 0.2
%>
<link name="caster">
<pose relative_to="chassis"><%= caster_location_x %> 0 <%= caster_location_z %> 0 0 0</pose>
<inertial>
<mass>1</mass>
<inertia>
<ixx>0.016</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.016</iyy>
<iyz>0</iyz>
<izz>0.016</izz>
</inertia>
</inertial>
<visual name="caster_visual">
<geometry>
<sphere>
<radius><%= caster_radius %></radius>
</sphere>
</geometry>
<material>
<ambient>0.0 1 0.0 1</ambient>
<diffuse>0.0 1 0.0 1</diffuse>
<specular>0.0 1 0.0 1</specular>
</material>
</visual>
<collision name="caster_collision">
<geometry>
<sphere>
<radius><%= caster_radius %></radius>
</sphere>
</geometry>
</collision>
</link>
</model>
</sdf>
步骤四:
将rsdf
转化为sdf
文件
执行下面的命令之前,记得把之前的文件备份:mv my_car.sdf.copy my_car.sdf.copy
erb my_car.rsdf > my_car.sdf
步骤五:
启动,roslaunch px4 gazebo_test.launch
。注意,由于<static>true</static>
,所以物体是静态的。joint
的连接方式和最开始的车辆建模教程一样,就不过多介绍了