在本教程中,我们将学习如何使用 SDF(Simulation Description Format)在 Gazebo 仿真环境中创建一个具有完整转向和驱动功能的四轮小车。这个模型包含前后轮、底盘、转向机构等关键部件,通过合理配置物理参数和关节约束,使其能够在仿真中逼真地模拟车辆运动。

一、模型概述

四轮小车是机器人仿真中最常见的移动平台之一,本模型采用前轮转向、后轮驱动的布局方式,具有以下特点:

  • 底盘结构:长方体底盘,尺寸为4.5m×1.8m×1.5m,总质量956kg

  • 转向系统:前轮采用独立转向机构,最大转向角±34.4度(±0.6弧度)

  • 驱动系统:后轮驱动,最大扭矩100000牛·米,最高转速约9549 RPM

  • 物理特性:包含完整的惯性参数、碰撞属性和动力学参数

二、模型实现

2.1 底盘构建

底盘是车辆的基础结构,所有其他部件都直接或间接连接到底盘上。

<link name='base_link'>
  <inertial>
    <pose>0 0 0 0 -0 0</pose>
    <mass>956</mass>
    <inertia>
      <ixx>437.5</ixx>
      <ixy>0</ixy>
      <ixz>0</ixz>
      <iyy>1792.5</iyy>
      <iyz>0</iyz>
      <izz>1870.8</izz>
    </inertia>
  </inertial>
  <collision name='base_link_collision'>
    <pose>0 0 1.25 0 -0 0</pose>
    <geometry>
      <box>
        <size>4.5 1.8 1.5</size>
      </box>
    </geometry>
  </collision>
  <visual name='base_link_visual'>
    <pose>0 0 1.25 0 -0 0</pose>
    <geometry>
      <box>
        <size>4.5 1.8 1.5</size>
      </box>
    </geometry>
  </visual>
</link>
  1. 惯性参数<inertial>标签定义了底盘的质量分布特性
    • mass:底盘总质量956kg
    • inertia:3×3转动惯量矩阵,由于底盘对称,非对角线元素为0
    • pose:质量中心与坐标系原点重合
  2. 碰撞属性<collision>标签定义了底盘在物理仿真中的碰撞体积
    • 使用与可视化模型相同的长方体几何形状
    • 位置偏移1.25m,使底盘底部位于z=0平面
  3. 可视化模型<visual>标签定义了底盘在仿真中的外观表现
    • 与碰撞模型保持一致,确保物理仿真与视觉表现一致

2.2 转向系统构建

本模型采用阿克曼转向几何(Ackermann steering geometry),前轮独立转向,后轮固定。

左前轮转向关节
<joint name='front_left_steering_joint' type='revolute'>
  <pose relative_to='base_link'>1.5 1.4 0.5 0 -0 0</pose>
  <parent>base_link</parent>
  <child>front_left_steering_link</child>
  <axis>
    <xyz>0 0 1</xyz>
    <limit>
      <lower>-0.6</lower>
      <upper>0.6</upper>
      <effort>1e+06</effort>
      <velocity>10000</velocity>
    </limit>
    <dynamics>
      <damping>10</damping>
      <friction>0</friction>
      <spring_reference>0</spring_reference>
      <spring_stiffness>0</spring_stiffness>
    </dynamics>
  </axis>
</joint>
转向机构链接
<link name='front_left_steering_link'>
  <pose relative_to='front_left_steering_joint'>0 0 0 0 -0 0</pose>
  <inertial>
    <pose>0 0 0 0 -0 0</pose>
    <mass>5</mass>
    <inertia>
      <ixx>0.012</ixx>
      <ixy>0</ixy>
      <ixz>0</ixz>
      <iyy>0.025</iyy>
      <iyz>0</iyz>
      <izz>0.012</izz>
    </inertia>
  </inertial>
  <visual name='front_left_steering_link_visual'>
    <pose>0 0 0 1.5708 -0 0</pose>
    <geometry>
      <cylinder>
        <length>0.01</length>
        <radius>0.1</radius>
      </cylinder>
    </geometry>
  </visual>
</link>
  1. 关节类型type='revolute'表示旋转关节,绕单一轴旋转
  2. 转向轴<xyz>0 0 1</xyz>表示绕Z轴旋转(垂直轴转向)
  3. 转向限制<limit>标签定义了转向角度范围(-0.6到+0.6弧度,约±34.4度)
  4. 动力学参数<dynamics>标签设置转向阻尼,确保转向稳定性
  5. 转向柱可视化:使用圆柱体表示转向机构,旋转90度使其直立

2.3 驱动系统构建

车辆采用后轮驱动方式,前后轮结构相似但功能不同。

左前轮驱动关节
<joint name='front_left_wheel_joint' type='revolute'>
  <pose relative_to='front_left_steering_link'>0 0 0 0 -0 0</pose>
  <parent>front_left_steering_link</parent>
  <child>front_left_wheel_link</child>
  <axis>
    <xyz>0 1 0</xyz>
    <limit>
      <effort>1e+06</effort>
      <velocity>10000</velocity>
      <lower>-1e+16</lower>
      <upper>1e+16</upper>
    </limit>
    <dynamics>
      <damping>0.1</damping>
      <friction>0</friction>
      <spring_reference>0</spring_reference>
      <spring_stiffness>0</spring_stiffness>
    </dynamics>
  </axis>
</joint>
车轮链接
<link name='front_left_wheel_link'>
  <pose relative_to='front_left_wheel_joint'>0 0 0 0 -0 0</pose>
  <inertial>
    <pose>0 0 0 0 -0 0</pose>
    <mass>20</mass>
    <inertia>
      <ixx>1.4</ixx>
      <iyy>2.5</iyy>
      <izz>1.4</izz>
    </inertia>
  </inertial>
  <collision name='front_left_wheel_link_collision'>
    <pose>0 0 0 1.5708 -0 0</pose>
    <geometry>
      <cylinder>
        <length>0.3</length>
        <radius>0.5</radius>
      </cylinder>
    </geometry>
    <surface>
      <friction>
        <ode>
          <mu>1.0</mu>
          <mu2>0.8</mu2>
        </ode>
      </friction>
    </surface>
  </collision>
  <visual name='front_left_wheel_link_visual'>
    <pose>0 0 0 1.5708 -0 0</pose>
    <geometry>
      <cylinder>
        <length>0.3</length>
        <radius>0.5</radius>
      </cylinder>
    </geometry>
  </visual>
</link>
  1. 驱动轴方向<xyz>0 1 0</xyz>表示绕Y轴旋转(与车辆前进方向一致)
  2. 旋转限制:设置极大范围(-1e16到+1e16)近似无限旋转
  3. 车轮惯性:质量20kg,转动惯量矩阵反映圆柱体特性
  4. 摩擦系数<surface>标签定义静摩擦(1.0)和动摩擦(0.8)系数
  5. 车轮几何:半径0.5m,宽度0.3m的圆柱体,旋转90度使其与地面接触

2.4 对称部件构建

车辆模型需要构建对称的右前轮和两个后轮,结构与左前轮类似,主要区别在于位置参数。

右前轮转向关节
<joint name='front_right_steering_joint' type='revolute'>
  <pose relative_to='base_link'>1.5 -1.4 0.5 0 -0 0</pose>
  <parent>base_link</parent>
  <child>front_right_steering_link</child>
  <axis>
    <xyz>0 0 1</xyz>
    <limit>
      <lower>-0.6</lower>
      <upper>0.6</upper>
      <effort>1e+06</effort>
      <velocity>10000</velocity>
    </limit>
    <dynamics>
      <damping>10</damping>
      <friction>0</friction>
      <spring_reference>0</spring_reference>
      <spring_stiffness>0</spring_stiffness>
    </dynamics>
  </axis>
</joint>
后轮驱动关节
<joint name='rear_left_wheel_joint' type='revolute'>
  <pose relative_to='base_link'>-1.5 1.4 0.5 0 -0 0</pose>
  <parent>base_link</parent>
  <child>rear_left_wheel_link</child>
  <axis>
    <xyz>0 1 0</xyz>
    <limit>
      <effort>100000</effort>
      <velocity>10000</velocity>
      <lower>-1e+16</lower>
      <upper>1e+16</upper>
    </limit>
    <dynamics>
      <damping>0.1</damping>
      <friction>0</friction>
      <spring_reference>0</spring_reference>
      <spring_stiffness>0</spring_stiffness>
    </dynamics>
  </axis>
</joint>
  1. 位置对称性:右前轮y坐标为-1.4m(左前轮为+1.4m),后轮x坐标为-1.5m(前轮为+1.5m)
  2. 驱动扭矩:后轮最大扭矩100000牛·米,高于转向关节的1e+06牛·米
  3. 简化设计:后轮直接连接到底盘,不包含转向机构

2.5 参考坐标系定义

为方便后续控制和传感器集成,定义了惯性参考系和主要质量参考点。

<frame name='inertial_joint' attached_to='base_link'>
  <pose>0 0 0 0 -0 0</pose>
</frame>
<frame name='main_mass' attached_to='inertial_joint'/>
  1. 惯性参考系:与底盘坐标系对齐,用于统一物理计算参考
  2. 质量参考点:标记车辆主要质量中心位置,可用于平衡计算

三、完整实现

以下是模型的完整实现:

<sdf version='1.7'>
  <!-- 车辆模型定义 -->
  <model name='four_wheeled_vehicle'>
    <!-- 底盘主体 -->
    <link name='base_link'>
      <inertial>
        <pose>0 0 0 0 -0 0</pose>  <!-- 质量中心与坐标系原点重合 -->
        <mass>956</mass>           <!-- 底盘总质量956kg -->
        <inertia>
          <ixx>437.5</ixx>
          <ixy>0</ixy>
          <ixz>0</ixz>
          <iyy>1792.5</iyy>
          <iyz>0</iyz>
          <izz>1870.8</izz>
        </inertia>
      </inertial>
      <collision name='base_link_collision'>
        <pose>0 0 1.25 0 -0 0</pose>
        <geometry>
          <box>
            <size>4.5 1.8 1.5</size>
          </box>
        </geometry>
      </collision>
      <visual name='base_link_visual'>
        <pose>0 0 1.25 0 -0 0</pose> <!-- 可视化模型位置偏移 -->
        <geometry>
          <box>
            <size>4.5 1.8 1.5</size> <!-- 长×宽×高(单位:米) -->
          </box>
        </geometry>
      </visual>
    </link>

    <!-- 左前轮转向关节 -->
    <joint name='front_left_steering_joint' type='revolute'>
      <!-- 转向关节位置(相对于底盘中心) -->
      <pose relative_to='base_link'>1.5 1.4 0.5 0 -0 0</pose> <!-- x,y,z坐标(单位:米) -->
      <parent>base_link</parent>
      <child>front_left_steering_link</child>
      
      <axis>
        <!-- 转向轴方向(绕Z轴旋转) -->
        <xyz>0 0 1</xyz>  <!-- 使用右手法则确定旋转方向 -->
        
        <!-- 关节运动限制 -->
        <limit>
          <lower>-0.6</lower>  <!-- 最小转向角(-34.4度) -->
          <upper>0.6</upper>   <!-- 最大转向角(+34.4度) -->
          <effort>1e+06</effort>  <!-- 最大作用力(牛·米) -->
          <velocity>10000</velocity> <!-- 最大旋转速度(弧度/秒) -->
        </limit>
        
        <!-- 动力学参数 -->
        <dynamics>
          <damping>10</damping>  <!-- 阻尼系数(牛·米·秒/弧度) -->
          <friction>0</friction>  <!-- 静摩擦系数 -->
          <spring_reference>0</spring_reference>  <!-- 弹簧自然位置 -->
          <spring_stiffness>0</spring_stiffness> <!-- 弹簧刚度(牛·米/弧度) -->
        </dynamics>
      </axis>
    </joint>

    <!-- 左前轮转向机构 -->
    <link name='front_left_steering_link'>
      <!-- 相对于转向关节的位置(保持对齐) -->
      <pose relative_to='front_left_steering_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 惯性参数(转向机构质量5kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>5</mass>
        <inertia>
          <ixx>0.012</ixx>  <!-- X轴转动惯量 -->
          <ixy>0</ixy>      <!-- XY轴惯性积 -->
          <ixz>0</ixz>      <!-- XZ轴惯性积 -->
          <iyy>0.025</iyy>  <!-- Y轴转动惯量 -->
          <iyz>0</iyz>      <!-- YZ轴惯性积 -->
          <izz>0.012</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 转向机构可视化模型 -->
      <visual name='front_left_steering_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.01</length>  <!-- 圆柱高度(实际为转向柱直径) -->
            <radius>0.1</radius>   <!-- 圆柱半径(实际为转向柱半径) -->
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 左前轮驱动关节 -->
    <joint name='front_left_wheel_joint' type='revolute'>
      <!-- 相对于转向机构的位置(保持对齐) -->
      <pose relative_to='front_left_steering_link'>0 0 0 0 -0 0</pose>
      <parent>front_left_steering_link</parent>
      <child>front_left_wheel_link</child>
      
      <axis>
        <!-- 车轮旋转轴方向(绕Y轴旋转) -->
        <xyz>0 1 0</xyz>  <!-- 符合车辆前进方向的旋转轴 -->
        
        <!-- 旋转限制(近似无限旋转) -->
        <limit>
          <effort>1e+06</effort>    <!-- 最大驱动力矩(牛·米) -->
          <velocity>10000</velocity> <!-- 最大旋转速度(弧度/秒) -->
          <lower>-1e+16</lower>    <!-- 最小角度(接近负无穷) -->
          <upper>1e+16</upper>     <!-- 最大角度(接近正无穷) -->
        </limit>
        
        <!-- 动力学参数 -->
        <dynamics>
          <damping>0.1</damping>    <!-- 旋转阻尼系数 -->
          <friction>0</friction>    <!-- 无静摩擦力 -->
          <spring_reference>0</spring_reference>  <!-- 弹簧自然位置 -->
          <spring_stiffness>0</spring_stiffness> <!-- 无弹簧效应 -->
        </dynamics>
      </axis>
    </joint>

    <!-- 左前轮 -->
    <link name='front_left_wheel_link'>
      <!-- 相对于车轮关节的位置(保持对齐) -->
      <pose relative_to='front_left_wheel_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 车轮惯性参数(质量20kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>20</mass>
        <inertia>
          <ixx>1.4</ixx>  <!-- X轴转动惯量 -->
          <iyy>2.5</iyy>  <!-- Y轴转动惯量(车轮旋转轴) -->
          <izz>1.4</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 车轮碰撞体积 -->
      <collision name='front_left_wheel_link_collision'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.3</length>  <!-- 轮胎宽度 -->
            <radius>0.5</radius>    <!-- 轮胎半径 -->
          </cylinder>
        </geometry>
        <surface>
          <friction>
            <ode>
              <mu>1.0</mu>    <!-- 静摩擦系数 -->
              <mu2>0.8</mu2>  <!-- 动摩擦系数 -->
            </ode>
          </friction>
        </surface>
      </collision>

      <!-- 车轮可视化模型 -->
      <visual name='front_left_wheel_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose>
        <geometry>
          <cylinder>
            <length>0.3</length>
            <radius>0.5</radius>
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 右前轮转向关节 -->
    <joint name='front_right_steering_joint' type='revolute'>
      <!-- 右前转向关节位置(对称于左前转向关节) -->
      <pose relative_to='base_link'>1.5 -1.4 0.5 0 -0 0</pose> <!-- x=0.923m,y=-0.642m(右侧对称位置) -->
      <parent>base_link</parent>
      <child>front_right_steering_link</child>
      
      <axis>
        <!-- 转向轴方向(绕Z轴旋转) -->
        <xyz>0 0 1</xyz>  <!-- 与左前转向关节保持对称 -->
        
        <!-- 关节运动限制 -->
        <limit>
          <lower>-0.6</lower>  <!-- 最小转向角(-34.4度) -->
          <upper>0.6</upper>   <!-- 最大转向角(+34.4度) -->
          <effort>1e+06</effort>  <!-- 最大作用力矩(牛·米) -->
          <velocity>10000</velocity> <!-- 最大旋转速度(弧度/秒) -->
        </limit>
        
        <!-- 动力学参数(与左前转向关节对称) -->
        <dynamics>
          <damping>10</damping>  <!-- 高阻尼系数确保转向稳定性 -->
          <friction>0</friction>  <!-- 无静摩擦力 -->
          <spring_reference>0</spring_reference>
          <spring_stiffness>0</spring_stiffness>
        </dynamics>
      </axis>
    </joint>

    <!-- 右前轮转向机构 -->
    <link name='front_right_steering_link'>
      <!-- 相对于右前转向关节的位置(保持对齐) -->
      <pose relative_to='front_right_steering_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 惯性参数(转向机构质量5kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>5</mass>
        <inertia>
          <ixx>0.012</ixx>  <!-- X轴转动惯量 -->
          <ixy>0</ixy>      <!-- XY轴惯性积 -->
          <ixz>0</ixz>      <!-- XZ轴惯性积 -->
          <iyy>0.025</iyy>  <!-- Y轴转动惯量 -->
          <iyz>0</iyz>      <!-- YZ轴惯性积 -->
          <izz>0.012</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 右前转向柱可视化模型 -->
      <visual name='front_right_steering_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.01</length>  <!-- 转向柱高度(实际为直径) -->
            <radius>0.1</radius>   <!-- 转向柱半径 -->
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 右前轮驱动关节 -->
    <joint name='front_right_wheel_joint' type='revolute'>
      <!-- 右前轮驱动关节(与左前轮对称配置) -->
      <pose relative_to='front_right_steering_link'>0 0 0 0 -0 0</pose>
      <parent>front_right_steering_link</parent>
      <child>front_right_wheel_link</child>
      
      <axis>
        <!-- 车轮旋转轴方向(绕Y轴旋转) -->
        <xyz>0 1 0</xyz>  <!-- 与车辆前进方向一致的旋转轴 -->
        
        <!-- 旋转限制(允许无限旋转) -->
        <limit>
          <effort>1e+06</effort>    <!-- 最大驱动力矩(约1000牛·米) -->
          <velocity>10000</velocity> <!-- 最大转速(约9549 RPM) -->
          <lower>-1e+16</lower>    <!-- 最小角度(接近负无穷) -->
          <upper>1e+16</upper>     <!-- 最大角度(接近正无穷) -->
        </limit>
        
        <!-- 动力学参数 -->
        <dynamics>
          <damping>0.1</damping>    <!-- 旋转阻尼(防止车轮空转) -->
          <friction>0</friction>    <!-- 无静摩擦损耗 -->
          <spring_reference>0</spring_reference>
          <spring_stiffness>0</spring_stiffness> <!-- 无弹簧效应 -->
        </dynamics>
      </axis>
    </joint>

    <!-- 右前轮 -->
    <link name='front_right_wheel_link'>
      <!-- 相对于右前轮驱动关节的位置(保持对齐) -->
      <pose relative_to='front_right_wheel_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 车轮惯性参数(质量20kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>20</mass>
        <inertia>
          <ixx>1.4</ixx>  <!-- X轴转动惯量 -->
          <iyy>2.5</iyy>  <!-- Y轴转动惯量(车轮旋转轴) -->
          <izz>1.4</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 右前轮碰撞体积 -->
      <collision name='front_right_wheel_link_collision'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.3</length>  <!-- 轮胎宽度 -->
            <radius>0.5</radius>    <!-- 轮胎半径 -->
          </cylinder>
        </geometry>
        <surface>
          <friction>
            <ode>
              <mu>1.0</mu>    <!-- 静摩擦系数 -->
              <mu2>0.8</mu2>  <!-- 动摩擦系数 -->
            </ode>
          </friction>
        </surface>
      </collision>

      <!-- 右前轮可视化模型 -->
      <visual name='front_right_wheel_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose>
        <geometry>
          <cylinder>
            <length>0.3</length>
            <radius>0.5</radius>
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 后左轮驱动关节 -->
    <joint name='rear_left_wheel_joint' type='revolute'>
      <!-- 安装位置(底盘后方左侧,z=0.5m离地高度) -->
      <pose relative_to='base_link'>-1.5 1.4 0.5 0 -0 0</pose> <!-- x=-0.945m(底盘后方) -->
      <parent>base_link</parent>
      <child>rear_left_wheel_link</child>
      
      <axis>
        <!-- 旋转轴方向(绕Y轴旋转) -->
        <xyz>0 1 0</xyz>  <!-- 与前进方向垂直的旋转轴 -->
        
        <!-- 旋转限制 -->
        <limit>
          <effort>100000</effort>    <!-- 最大驱动力矩(100000牛·米) -->
          <velocity>10000</velocity> <!-- 最大转速(约9549 RPM) -->
          <lower>-1e+16</lower>    <!-- 最小角度(接近负无穷) -->
          <upper>1e+16</upper>     <!-- 最大角度(接近正无穷) -->
        </limit>
        
        <!-- 动力学参数 -->
        <dynamics>
          <damping>0.1</damping>    <!-- 旋转阻尼系数 -->
          <friction>0</friction>    <!-- 无静摩擦损耗 -->
          <spring_reference>0</spring_reference>
          <spring_stiffness>0</spring_stiffness> <!-- 无弹簧效应 -->
        </dynamics>
      </axis>
    </joint>

    <!-- 后左轮 -->
    <link name='rear_left_wheel_link'>
      <!-- 相对于后左轮驱动关节的位置(保持对齐) -->
      <pose relative_to='rear_left_wheel_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 车轮惯性参数(质量20kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>20</mass>
        <inertia>
          <ixx>1.4</ixx>  <!-- X轴转动惯量 -->
          <iyy>2.5</iyy>  <!-- Y轴转动惯量(车轮旋转轴) -->
          <izz>1.4</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 后轮碰撞体积 -->
      <collision name='rear_left_wheel_link_collision'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.3</length>  <!-- 轮胎宽度 -->
            <radius>0.5</radius>    <!-- 轮胎半径 -->
          </cylinder>
        </geometry>
        <surface>
          <friction>
            <ode>
              <mu>1.0</mu>    <!-- 静摩擦系数 -->
              <mu2>0.8</mu2>  <!-- 动摩擦系数 -->
            </ode>
          </friction>
        </surface>
      </collision>

      <!-- 后轮可视化模型 -->
      <visual name='rear_left_wheel_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose>
        <geometry>
          <cylinder>
            <length>0.3</length>
            <radius>0.5</radius>
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 后右轮驱动关节 -->
    <joint name='rear_right_wheel_joint' type='revolute'>
      <!-- 安装位置(底盘后方右侧,z=0.5m离地高度) -->
      <pose relative_to='base_link'>-1.5 -1.4 0.5 0 -0 0</pose> <!-- x=-0.945m(底盘后方),y=-0.642m(右侧对称) -->
      <parent>base_link</parent>
      <child>rear_right_wheel_link</child>
      
      <axis>
        <!-- 旋转轴方向(绕Y轴旋转) -->
        <xyz>0 1 0</xyz>  <!-- 与前进方向垂直的旋转轴 -->
        
        <!-- 旋转限制 -->
        <limit>
          <effort>100000</effort>    <!-- 最大驱动力矩(100000牛·米) -->
          <velocity>10000</velocity> <!-- 最大转速(约9549 RPM) -->
          <lower>-1e+16</lower>    <!-- 最小角度(接近负无穷) -->
          <upper>1e+16</upper>     <!-- 最大角度(接近正无穷) -->
        </limit>
        
        <!-- 动力学参数 -->
        <dynamics>
          <damping>0.1</damping>    <!-- 旋转阻尼系数 -->
          <friction>0</friction>    <!-- 无静摩擦损耗 -->
          <spring_reference>0</spring_reference>
          <spring_stiffness>0</spring_stiffness> <!-- 无弹簧效应 -->
        </dynamics>
      </axis>
    </joint>

    <!-- 后右轮 -->
    <link name='rear_right_wheel_link'>
      <!-- 相对于后右轮驱动关节的位置(保持对齐) -->
      <pose relative_to='rear_right_wheel_joint'>0 0 0 0 -0 0</pose>
      
      <!-- 车轮惯性参数(质量20kg) -->
      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>20</mass>
        <inertia>
          <ixx>1.4</ixx>  <!-- X轴转动惯量 -->
          <iyy>2.5</iyy>  <!-- Y轴转动惯量(车轮旋转轴) -->
          <izz>1.4</izz>  <!-- Z轴转动惯量 -->
        </inertia>
      </inertial>

      <!-- 后轮碰撞体积 -->
      <collision name='rear_right_wheel_link_collision'>
        <pose>0 0 0 1.5708 -0 0</pose> <!-- 1.5708弧度=90度 -->
        <geometry>
          <cylinder>
            <length>0.3</length>  <!-- 轮胎宽度 -->
            <radius>0.5</radius>    <!-- 轮胎半径 -->
          </cylinder>
        </geometry>
        <surface>
          <friction>
            <ode>
              <mu>1.0</mu>    <!-- 静摩擦系数 -->
              <mu2>0.8</mu2>  <!-- 动摩擦系数 -->
            </ode>
          </friction>
        </surface>
      </collision>

      <!-- 后轮可视化模型 -->
      <visual name='rear_right_wheel_link_visual'>
        <pose>0 0 0 1.5708 -0 0</pose>
        <geometry>
          <cylinder>
            <length>0.3</length>
            <radius>0.5</radius>
          </cylinder>
        </geometry>
      </visual>
    </link>

    <!-- 惯性参考系定义 -->
    <frame name='inertial_joint' attached_to='base_link'>
      <!-- 与底盘基础链接对齐的参考坐标系 -->
      <pose>0 0 0 0 -0 0</pose>  <!-- 保持与base_link完全一致的位姿 -->
    </frame>
    
    <!-- 主要质量参考点 -->
    <frame name='main_mass' attached_to='inertial_joint'/>
  </model>
</sdf>

四、启动运行小车模型

  1. 创建模型目录

    # 在用户目录下创建模型文件夹
    mkdir -p ~/.gazebo/models/four_wheeled_vehicle
    
    # 创建模型文件
    gedit ~/.gazebo/models/four_wheeled_vehicle/model.sdf
    

    将完整SDF代码粘贴到model.sdf文件中并保存。

  2. 启动模型

    • 启动Gazebo:
    gazebo
    
    • 在左侧面板点击"Insert"选项卡。

    • 在模型列表中找到"four_wheeled_vehicle"并点击。

    • 在世界视图中点击放置模型。

  3. 运行效果:

    在这里插入图片描述

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐