This commit is contained in:
Quella777
2025-08-25 16:30:02 +08:00
commit 32cc2a8e96
1633 changed files with 289456 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
To regenerate the model.sdf from the erb template:
~~~
erb model.rsdf > model.sdf
~~~

View File

@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<model>
<name>Cart: soft suspension</name>
<version>1.0</version>
<sdf version="1.5">model.sdf</sdf>
<author>
<name>Steve Peters</name>
<email>scpeters@osrfoundation.org</email>
</author>
<description>
A 4-wheel cart with soft suspension, no steering.
</description>
</model>

View File

@@ -0,0 +1,198 @@
<?xml version="1.0" ?>
<%
# Vehicle with soft suspension
# Consists of box chassis with 4 non-steerable wheels,
# connected by prismatic joints to an intermediate body
# SI units (length in meters)
# Geometry
chassis_dx = 1.0
chassis_dy = 0.5
chassis_dz = 0.1
susp_dx = 0.05
susp_dy = susp_dx
susp_dz = susp_dx
wheel_radius = 0.15
wheel_width = 0.08
chassis_z0 = wheel_radius
wheel_x0 = chassis_dx*0.5
wheel_y0 = chassis_dy*0.5 + wheel_width*0.6
wheel_locations = {
"front_left" => {:x0 => wheel_x0, :y0 => wheel_y0 },
"front_right" => {:x0 => wheel_x0, :y0 => -wheel_y0 },
"rear_left" => {:x0 => -wheel_x0, :y0 => wheel_y0 },
"rear_right" => {:x0 => -wheel_x0, :y0 => -wheel_y0 },
}
# inertia
chassis_mass = 10
chassis_ixx = chassis_mass/12.0 * (chassis_dy**2 + chassis_dz**2)
chassis_iyy = chassis_mass/12.0 * (chassis_dz**2 + chassis_dx**2)
chassis_izz = chassis_mass/12.0 * (chassis_dx**2 + chassis_dy**2)
# chassis c.g. offset from center of box
chassis_cgx = chassis_dx*0.1
chassis_cgy = 0
chassis_cgz = 0
# intermediate body (non-spinning unsprung inertia)
susp_mass = 0.5
susp_ixx = susp_mass/12.0 * (susp_dy**2 + susp_dz**2)
susp_iyy = susp_mass/12.0 * (susp_dz**2 + susp_dx**2)
susp_izz = susp_mass/12.0 * (susp_dx**2 + susp_dy**2)
# wheel inertia
wheel_mass = 0.5
wheel_ixx = wheel_mass * (wheel_radius**2 / 4.0 + wheel_width**2 / 12.0)
wheel_iyy = wheel_mass * (wheel_radius**2 / 4.0 + wheel_width**2 / 12.0)
wheel_izz = wheel_mass/2.0 * wheel_radius**2
# suspension stiffness, damping, and limits
susp_travel = 0.5 * wheel_radius
susp_height = 0.5
susp_lower = -susp_height * susp_travel
susp_upper = susp_lower + susp_travel
susp_damping = 100
susp_stiffness = 2500
susp_spring_center = 0.05
%>
<sdf version="1.5">
<model name="cart_soft_suspension">
<link name="chassis">
<pose>0 0 <%= chassis_z0 %> 0 0 0</pose>
<inertial>
<pose><%= chassis_cgx %> <%= chassis_cgy %> <%= chassis_cgz %> 0 0 0</pose>
<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>
<collision name="collision">
<geometry>
<box>
<size><%= chassis_dx %> <%= chassis_dy %> <%= chassis_dz %></size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size><%= chassis_dx %> <%= chassis_dy %> <%= chassis_dz %></size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Grey</name>
</script>
</material>
</visual>
</link>
<%
wheel_locations.keys.each do |k|
x0 = wheel_locations[k][:x0]
y0 = wheel_locations[k][:y0]
%>
<%= "<link name=" + '"susp_' + k + '">' %>
<pose><%= x0 %> <%= y0 %> <%= wheel_radius %> 0 0 0</pose>
<inertial>
<mass><%= susp_mass %></mass>
<inertia>
<ixx><%= susp_ixx %></ixx>
<iyy><%= susp_iyy %></iyy>
<izz><%= susp_izz %></izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size><%= susp_dx %> <%= susp_dy %> <%= susp_dz %></size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size><%= susp_dx %> <%= susp_dy %> <%= susp_dz %></size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<%= "<joint name=" + '"susp_' + k + '_prismatic" type="prismatic">' %>
<parent>chassis</parent>
<%= "<child>susp_" + k + "</child>" %>
<axis>
<xyz>0 0 -1</xyz>
<limit>
<lower><%= susp_lower %></lower>
<upper><%= susp_upper %></upper>
</limit>
<dynamics>
<damping><%= susp_damping %></damping>
<spring_stiffness><%= susp_stiffness %></spring_stiffness>
<spring_reference><%= susp_spring_center %></spring_reference>
</dynamics>
</axis>
<physics>
<ode>
<implicit_spring_damper>1</implicit_spring_damper>
</ode>
</physics>
</joint>
<%= "<link name=" + '"wheel_' + k + '">' %>
<pose><%= x0 %> <%= y0 %> <%= wheel_radius %> <%= -Math::PI/2 %> 0 0</pose>
<inertial>
<mass><%= wheel_mass %></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>
<collision name="collision">
<geometry>
<cylinder>
<radius><%= wheel_radius %></radius>
<length><%= wheel_width %></length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius><%= wheel_radius %></radius>
<length><%= wheel_width %></length>
</cylinder>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<%= "<joint name=" + '"wheel_' + k + '_spin" type="revolute">' %>
<%= "<parent>susp_" + k + "</parent>" %>
<%= "<child>wheel_" + k + "</child>" %>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<% end %>
</model>
</sdf>

View File

@@ -0,0 +1,438 @@
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="cart_soft_suspension">
<link name="chassis">
<pose>0 0 0.15 0 0 0</pose>
<inertial>
<pose>0.1 0 0 0 0 0</pose>
<mass>10</mass>
<inertia>
<ixx>0.216666666666667</ixx>
<iyy>0.841666666666667</iyy>
<izz>1.04166666666667</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>1.0 0.5 0.1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1.0 0.5 0.1</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Grey</name>
</script>
</material>
</visual>
</link>
<link name="susp_front_right">
<pose>0.5 -0.298 0.15 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.000208333333333333</ixx>
<iyy>0.000208333333333333</iyy>
<izz>0.000208333333333333</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="susp_front_right_prismatic" type="prismatic">
<parent>chassis</parent>
<child>susp_front_right</child>
<axis>
<xyz>0 0 -1</xyz>
<limit>
<lower>-0.0375</lower>
<upper>0.0375</upper>
</limit>
<dynamics>
<damping>100</damping>
<spring_stiffness>2500</spring_stiffness>
<spring_reference>0.05</spring_reference>
</dynamics>
</axis>
<physics>
<ode>
<implicit_spring_damper>1</implicit_spring_damper>
</ode>
</physics>
</joint>
<link name="wheel_front_right">
<pose>0.5 -0.298 0.15 -1.5707963267949 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.00307916666666667</ixx>
<iyy>0.00307916666666667</iyy>
<izz>0.005625</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="wheel_front_right_spin" type="revolute">
<parent>susp_front_right</parent>
<child>wheel_front_right</child>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<link name="susp_front_left">
<pose>0.5 0.298 0.15 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.000208333333333333</ixx>
<iyy>0.000208333333333333</iyy>
<izz>0.000208333333333333</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="susp_front_left_prismatic" type="prismatic">
<parent>chassis</parent>
<child>susp_front_left</child>
<axis>
<xyz>0 0 -1</xyz>
<limit>
<lower>-0.0375</lower>
<upper>0.0375</upper>
</limit>
<dynamics>
<damping>100</damping>
<spring_stiffness>2500</spring_stiffness>
<spring_reference>0.05</spring_reference>
</dynamics>
</axis>
<physics>
<ode>
<implicit_spring_damper>1</implicit_spring_damper>
</ode>
</physics>
</joint>
<link name="wheel_front_left">
<pose>0.5 0.298 0.15 -1.5707963267949 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.00307916666666667</ixx>
<iyy>0.00307916666666667</iyy>
<izz>0.005625</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="wheel_front_left_spin" type="revolute">
<parent>susp_front_left</parent>
<child>wheel_front_left</child>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<link name="susp_rear_right">
<pose>-0.5 -0.298 0.15 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.000208333333333333</ixx>
<iyy>0.000208333333333333</iyy>
<izz>0.000208333333333333</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="susp_rear_right_prismatic" type="prismatic">
<parent>chassis</parent>
<child>susp_rear_right</child>
<axis>
<xyz>0 0 -1</xyz>
<limit>
<lower>-0.0375</lower>
<upper>0.0375</upper>
</limit>
<dynamics>
<damping>100</damping>
<spring_stiffness>2500</spring_stiffness>
<spring_reference>0.05</spring_reference>
</dynamics>
</axis>
<physics>
<ode>
<implicit_spring_damper>1</implicit_spring_damper>
</ode>
</physics>
</joint>
<link name="wheel_rear_right">
<pose>-0.5 -0.298 0.15 -1.5707963267949 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.00307916666666667</ixx>
<iyy>0.00307916666666667</iyy>
<izz>0.005625</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="wheel_rear_right_spin" type="revolute">
<parent>susp_rear_right</parent>
<child>wheel_rear_right</child>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<link name="susp_rear_left">
<pose>-0.5 0.298 0.15 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.000208333333333333</ixx>
<iyy>0.000208333333333333</iyy>
<izz>0.000208333333333333</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.05 0.05 0.05</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="susp_rear_left_prismatic" type="prismatic">
<parent>chassis</parent>
<child>susp_rear_left</child>
<axis>
<xyz>0 0 -1</xyz>
<limit>
<lower>-0.0375</lower>
<upper>0.0375</upper>
</limit>
<dynamics>
<damping>100</damping>
<spring_stiffness>2500</spring_stiffness>
<spring_reference>0.05</spring_reference>
</dynamics>
</axis>
<physics>
<ode>
<implicit_spring_damper>1</implicit_spring_damper>
</ode>
</physics>
</joint>
<link name="wheel_rear_left">
<pose>-0.5 0.298 0.15 -1.5707963267949 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.00307916666666667</ixx>
<iyy>0.00307916666666667</iyy>
<izz>0.005625</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.15</radius>
<length>0.08</length>
</cylinder>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Black</name>
</script>
</material>
</visual>
</link>
<joint name="wheel_rear_left_spin" type="revolute">
<parent>susp_rear_left</parent>
<child>wheel_rear_left</child>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
</model>
</sdf>