ppovb5fc7/gazebo/worlds/torsional_friction_demo.wor...

373 lines
11 KiB
Plaintext
Raw Normal View History

2019-03-04 17:11:56 +08:00
<?xml version="1.0" ?>
<%
# Torsional friction demo world
# Create objects with single points of contact and initial velocity
# They should decelerate if friction is nonzero
# Aluminum 2700 kg/m^3
density = 2700.0
mass = {}
ixx = {}
iyy = {}
izz = {}
# Geometry and inertial parameters: sphere
radius = 0.1
mass[:sphere] = density * 4.0 * Math::PI / 3.0 * radius **3
ixx[:sphere] = mass[:sphere] * 0.4 * radius**2
iyy[:sphere] = ixx[:sphere]
izz[:sphere] = ixx[:sphere]
# Geometry and inertial parameters: box
dx = 2 * radius
dy, dz = dx, dx
dd = Math.sqrt(dx**2 + dy**2 + dz**2)
mass[:box] = density * dx * dy * dz
ixx[:box] = 1.0 / 12 * mass[:box] * (dy*dy + dz*dz)
iyy[:box] = 1.0 / 12 * mass[:box] * (dz*dz + dx*dx)
izz[:box] = 1.0 / 12 * mass[:box] * (dx*dx + dy*dy)
# Geometry and inertial parameters: pinch
density_p = 2000.0
dx_p = 0.5 * radius
dy_p = 0.1 * radius
dz_p = 6 * radius
dd_p = Math.sqrt(dx_p**2 + dy_p**2 + dz_p**2)
mass[:box_p] = density_p * dx * dy * dz
ixx[:box_p] = 1.0 / 12 * mass[:box_p] * (dy_p*dy_p + dz_p*dz_p)
iyy[:box_p] = 1.0 / 12 * mass[:box_p] * (dz_p*dz_p + dx_p*dx_p)
izz[:box_p] = 1.0 / 12 * mass[:box_p] * (dx_p*dx_p + dy_p*dy_p)
# initial velocity and friction
spin0 = 2*Math::PI
sphere_friction = [0.0, 0.001, 0.005, 0.01, 1.0]
box_friction = [0.0, 0.001, 0.005, 0.01, 1.0]
pinch_friction = [0.0, 0.001, 0.005, 0.006, 1.0]
pinch_trans_friction = 1000.0
patch = 2.0
%>
<sdf version="1.5">
<world name="default">
<gui>
<camera name="user_camera">
<pose>7 -3 2.5 0 0.27 2.35</pose>
</camera>
</gui>
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<% # Spheres
i = 0
sphere_friction.each do |f|
i = i + 1
name = 'sphere_' + i.to_s
%>
<%= "<model name='#{name}'>" %>
<allow_auto_disable>0</allow_auto_disable>
<pose><%= radius*4*i %> 0 <%= radius %> 0 0 0</pose>
<link name="link">
<inertial>
<mass><%= mass[:sphere] %></mass>
<inertia>
<ixx><%= ixx[:sphere] %></ixx>
<iyy><%= iyy[:sphere] %></iyy>
<izz><%= izz[:sphere] %></izz>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyz>0.0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<sphere>
<radius><%= radius %></radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu><%= f %></mu>
<mu2><%= f %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
<contact>
<ode>
<kp>500000</kp>
</ode>
</contact>
</surface>
</collision>
<visual name="visual">
<geometry>
<sphere>
<radius><%= radius %></radius>
</sphere>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/CoM</name>
</script>
</material>
</visual>
</link>
<%= "<plugin name='#{name}' filename='libInitialVelocityPlugin.so'>" %>
<linear>0 0 0</linear>
<angular>0 0 <%= spin0 %></angular>
</plugin>
</model>
<% end %>
<% # Boxes
i = 0
box_friction.each do |f|
i = i + 1
name = 'box_' + i.to_s
%>
<%= "<model name='#{name}'>" %>
<allow_auto_disable>0</allow_auto_disable>
<pose><%= dd*2*i %> 2 <%= dd/2 %> <%= Math::PI/4 %> <%= Math.atan(1.0/Math.sqrt(2)) %> 0</pose>
<link name="link">
<inertial>
<mass><%= mass[:box] %></mass>
<inertia>
<ixx><%= ixx[:box] %></ixx>
<iyy><%= iyy[:box] %></iyy>
<izz><%= izz[:box] %></izz>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyz>0.0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size><%= dx %> <%= dy %> <%= dz %></size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu><%= f %></mu>
<mu2><%= f %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<box>
<size><%= dx %> <%= dy %> <%= dz %></size>
</box>
</geometry>
</visual>
</link>
<%= "<plugin name='#{name}' filename='libInitialVelocityPlugin.so'>" %>
<linear>0 0 0</linear>
<angular>0 0 <%= spin0 %></angular>
</plugin>
</model>
<% end %>
<% # Boxes with artificially low center of mass
i = 0
box_friction.each do |f|
i = i + 1
name = 'box_low_cog_' + i.to_s
%>
<%= "<model name='#{name}'>" %>
<allow_auto_disable>0</allow_auto_disable>
<pose><%= dd*2*i %> 4 <%= dd/2 %> <%= Math::PI/4 %> <%= Math.atan(1.0/Math.sqrt(2)) %> 0</pose>
<link name="link">
<inertial>
<pose>1 -1 -1 0 0 0</pose>
<mass><%= mass[:box] %></mass>
<inertia>
<ixx><%= ixx[:box] %></ixx>
<iyy><%= iyy[:box] %></iyy>
<izz><%= izz[:box] %></izz>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyz>0.0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size><%= dx %> <%= dy %> <%= dz %></size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu><%= f %></mu>
<mu2><%= f %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<box>
<size><%= dx %> <%= dy %> <%= dz %></size>
</box>
</geometry>
</visual>
</link>
<%= "<plugin name='#{name}' filename='libInitialVelocityPlugin.so'>" %>
<linear>0 0 0</linear>
<angular>0 0 <%= spin0 %></angular>
</plugin>
</model>
<% end %>
<% # Pinch
i = 0
pinch_friction.each do |f|
i = i + 1
name = 'pinch_' + i.to_s
%>
<%= "<model name='" + name + "'>" %>
<allow_auto_disable>0</allow_auto_disable>
<pose><%= dd_p*2*i %> 6 <%= dd_p %> 0 0 0</pose>
<link name="box">
<self_collide>true</self_collide>
<pose><%= - dz_p * 0.4 %> 0 0 0 <%= Math::PI/2 %> 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<mass><%= mass[:box_p] %></mass>
<inertia>
<ixx><%= ixx[:box_p] %></ixx>
<iyy><%= iyy[:box_p] %></iyy>
<izz><%= izz[:box_p] %></izz>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyz>0.0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size><%= dx_p %> <%= dy_p %> <%= dz_p %></size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu><%= pinch_trans_friction %></mu>
<mu2><%= pinch_trans_friction %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<box>
<size><%= dx_p %> <%= dy_p %> <%= dz_p %></size>
</box>
</geometry>
</visual>
</link>
<link name="sphere_1">
<pose>0 <%= dy_p * 1.5 %> 0 0 0 0</pose>
<collision name="collision">
<geometry>
<sphere>
<radius><%= dy_p %></radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu><%= pinch_trans_friction %></mu>
<mu2><%= pinch_trans_friction %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<sphere>
<radius><%= dy_p %></radius>
</sphere>
</geometry>
</visual>
</link>
<link name="sphere_2">
<pose>0 <%= -dy_p * 1.5 %> 0 0 0 0</pose>
<collision name="collision">
<geometry>
<sphere>
<radius><%= dy_p %></radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu><%= pinch_trans_friction %></mu>
<mu2><%= pinch_trans_friction %></mu2>
</ode>
<torsional>
<coefficient><%= f %></coefficient>
<patch_radius><%= patch %></patch_radius>
</torsional>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<sphere>
<radius><%= dy_p %></radius>
</sphere>
</geometry>
</visual>
</link>
<joint name = "joint_1" type="prismatic">
<parent>world</parent>
<child>sphere_1</child>
<axis>
<xyz>0 -1 0</xyz>
<dynamics>
<damping>100</damping>
<spring_stiffness>1000000</spring_stiffness>
<spring_reference>0.002</spring_reference>
</dynamics>
</axis>
</joint>
<joint name = "joint_2" type="prismatic">
<parent>world</parent>
<child>sphere_2</child>
<axis>
<xyz>0 1 0</xyz>
<dynamics>
<damping>100</damping>
<spring_stiffness>1000000</spring_stiffness>
<spring_reference>0.002</spring_reference>
</dynamics>
</axis>
</joint>
</model>
<% end %>
</world>
</sdf>