gz sim机器人SDF模型 [持续更新]

机器人SDF模型

不算教学,个人的记录

sdf的格式跟urdf有所不同,必须是完整的一个包括,比如< pose></ pose>这样前一个后一个,urdf中是有< orign xyz='0 0 0' rpy='0 0 0'>的写法的,也就是没< orign>< /orign>这样写。sdf中需要注意。

下面是一个两轮小车的模型sdf文件,算是一个标准基础例子。

xml 复制代码
<?xml version='1.0'?>
<sdf version='1.9'>
  <model name='diff_drive_robot'>
    <!-- 主车身(立方体) -->
    <link name='base_link'>
    <!-- 这个pose写的是右轮在整个model的零点的相对位置 -->
      <pose>1 0 0 0 0 0</pose>
      <!-- 物理属性必须要写,urdf中是可以不写的 -->
      <inertial>
        <mass>5.0</mass>
        <inertia>
          <ixx>0.104167</ixx>
          <ixy>0</ixy>
          <ixz>0</ixz>
          <iyy>0.104167</iyy>
          <iyz>0</iyz>
          <izz>0.083333</izz>
        </inertia>
      </inertial>
      <collision name='base_collision'>
        <geometry>
          <box>
            <size>0.3 0.2 0.1</size> <!-- 长宽高:30cm x 20cm x 10cm -->
          </box>
        </geometry>
        <surface>
          <friction>
            <ode>
              <mu>0.5</mu>
              <mu2>0.5</mu2>
            </ode>
          </friction>
        </surface>
      </collision>
      <visual name='base_visual'>
        <geometry>
          <box>
            <size>0.3 0.2 0.1</size>
          </box>
        </geometry>
        <material>
          <ambient>0.8 0.2 0.2 1</ambient>
          <diffuse>0.8 0.2 0.2 1</diffuse>
        </material>
      </visual>
    </link>

    <!-- 左轮 -->
    <link name='left_wheel'>
      <inertial>
        <mass>1.0</mass>
        <inertia>
          <ixx>0.05</ixx>
          <ixy>0</ixy>
          <ixz>0</ixz>
          <iyy>0.05</iyy>
          <iyz>0</iyz>
          <izz>0.1</izz>
        </inertia>
      </inertial>
      <collision name='left_wheel_collision'>
        <geometry>
          <cylinder>
            <radius>0.1</radius>  <!-- 轮径20cm -->
            <length>0.05</length> <!-- 厚度5cm -->
          </cylinder>
        </geometry>
      </collision>
      <visual name='left_wheel_visual'>
        <geometry>
          <cylinder>
            <radius>0.1</radius>
            <length>0.05</length>
          </cylinder>
        </geometry>
        <material>
          <ambient>0.3 0.3 0.3 1</ambient>
          <diffuse>0.3 0.3 0.3 1</diffuse>
        </material>
      </visual>
    </link>
    
    <joint name='left_wheel_joint' type='revolute'>
      <parent>base_link</parent>
      <child>left_wheel</child>
      <axis>
        <xyz>0 1 0</xyz> <!-- Y轴为旋转轴 -->
        <limit>
          <lower>-1e9</lower> <!-- 无限旋转 -->
          <upper>1e9</upper>
        </limit>
      </axis>
      <pose>-0.15 0 -0.05 0 0 0</pose> <!-- 左偏移15cm -->
    </joint>

    <!-- 右轮(结构与左轮对称) -->
    <link name='right_wheel'>
       <!-- 这个pose写的是右轮在整个model的零点的相对位置,如果加了relative_to='base_link',那就是相对base_link的位置 -->
      <pose>1 0 0 0 0 0</pose>
      <inertial>
        <mass>1.0</mass>
        <inertia>
          <ixx>0.05</ixx>
          <ixy>0</ixy>
          <ixz>0</ixz>
          <iyy>0.05</iyy>
          <iyz>0</iyz>
          <izz>0.1</izz>
        </inertia>
      </inertial>
      <collision name='right_wheel_collision'>
        <geometry>
          <cylinder>
            <radius>0.1</radius>  <!-- 轮径20cm -->
            <length>0.05</length> <!-- 厚度5cm -->
          </cylinder>
        </geometry>
      </collision>
      <visual name='right_wheel_visual'>
        <geometry>
          <cylinder>
            <radius>0.1</radius>
            <length>0.05</length>
          </cylinder>
        </geometry>
        <material>
          <ambient>0.3 0.3 0.3 1</ambient>
          <diffuse>0.3 0.3 0.3 1</diffuse>
        </material>
      </visual>
    </link>
    
    <joint name='right_wheel_joint' type='revolute'>
      <parent>base_link</parent>
      <child>right_wheel</child>
      <axis>
        <xyz>0 1 0</xyz> <!-- Y轴为旋转轴 -->
        <limit>
          <lower>-1e9</lower> <!-- 无限旋转 -->
          <upper>1e9</upper>
        </limit>
      </axis>
      <pose>0.15 0 -0.05 0 0 0</pose> <!-- 左偏移15cm -->
    </joint>
    
  </model>
</sdf>

查看sdf文件是否有效,gazebo能检测到并且输出

link的一级pose

给了base_link和左轮右轮的pose,这是相对整个model的零点的位置,也就是左轮的0 0 0 0 0 0处,因为三个link都是写在了< model> < /model>中,所以 也是相对模型零点的位置。

xml 复制代码
    <link name='base_link'>
      <pose>0 0 1 0 0 0</pose>
xml 复制代码
    <link name='left_wheel'>
      <pose>0 0 0 0 0 0</pose>
xml 复制代码
    <link name='right_wheel'>
      <pose>1 0 0 0 0 0</pose>

整体都有位移,三个都改为0 0 1 0 0 0了

一般机器人都是写的有关节和链接,如果只用pose表示相对位置,只改了一个部件,那这个部件就会相对整个机器人发生位移,但是这个部件的子链接又没有位移就会扰乱了机器人模型,所以对一个完整的机器人,我会在pose里写一个relative_to=''

xml 复制代码
    <link name='left_wheel'>
      <pose relative_to='base_link'>0 -0.125 0 1.57 0 0</pose>
xml 复制代码
    <link name='right_wheel'>
      <pose relative_to='base_link'>0 0.125 0 1.57 0 0</pose>

材质

材质文件的保存形式,原来的sdf文件没定义纹理,可以自己创建material文件夹以及下面的scripts文件夹写纹理脚本文件,texture文件夹是纹理图片。



两种写法

xml 复制代码
        <script>
                <uri>model://B2Z1/materials/scripts/gazebo.material</uri>
                <name>Gazebo/Grey</name>
        </script>
        <!-- 只要求显示的话可以自己写,也不用脚本 -->
        <material>
          <shader type='pixel'/>
          <ambient>0.3 0.3 0.3 1</ambient>
          <diffuse>1 1 1 1</diffuse>
          <specular>1 1 1 1</specular>
          <emissive>0 0 0 1</emissive>
          <shininess>90</shininess>
        </material>

plugin

话题信息通信

为了与ros2进行通信的功能,写plugin引出gz topic话题,然后转换成ros2 topic话题

到官方文档中查看可以使用的接口
gz::sim::systems Namespace Reference

看到joint的控制器这里,可以看到给出了sdf中可写的内容

xml 复制代码
  <!-- JointController 插件 -->
  <plugin name="joint_controller" filename="gz-sim-joint-controller-system">
    <!-- 必须参数 -->
    <joint_name>your_joint</joint_name>  <!-- 要控制的关节名称 -->

    <!-- 可选参数 -->
    <use_force_commands>false</use_force_commands>  <!-- 是否使用力控制模式,默认 velocity 模式 -->
    <use_actuator_msg>false</use_actuator_msg>     <!-- 是否使用 actuator 消息,默认 false -->
    <actuator_number>0</actuator_number>           <!-- 执行器索引,默认 0 -->
    <topic>/your_topic</topic>                     <!-- 命令话题,默认自动生成 -->
    <sub_topic>your_subtopic</sub_topic>           <!-- 子话题,默认自动生成 -->
    <initial_velocity>0</initial_velocity>         <!-- 初始速度 -->

    <!-- 力控制模式下的 PID 参数(可选) -->
    <p_gain>1.0</p_gain>
    <i_gain>0.0</i_gain>
    <d_gain>0.0</d_gain>
    <i_max>1.0</i_max>
    <i_min>-1.0</i_min>
    <cmd_max>1000.0</cmd_max>
    <cmd_min>-1000.0</cmd_min>
    <cmd_offset>0.0</cmd_offset>
  </plugin>

找到插件文件的存放路径发现这里有插件,在plugin中的filename填的就是插件文件名的部分,去掉lib和.so的格式

filename="gz-sim-joint-controller-system" → 实际加载的库文件为 libgz-sim-joint-controller-system.so

能实现外部与仿真模型进行消息控制,< topic>和< sub_topic>非常重要

相关推荐
M-Robots echo7 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
tianxuanjg8 小时前
0.005mm 高精度 CNC 加工:机器人薄壁复杂零件变形控制与全维度品控方案
经验分享·机器人·无人机·制造·材质
企鹅的企9 小时前
2027北京AI数字健康与智慧医疗展官方:超两成展品亚洲首秀
人工智能·科技·机器人
消失的旧时光-194311 小时前
第 7 篇:服务机器人为什么需要处理多种控制入口?LOCAL、REMOTE、AUTO 与 MAINTENANCE
机器人·remote·controlarbiter
airobotcn14 小时前
空地一体化巡检机器人系统落地实战指南
安全·机器人·无人机·智慧园区·巡逻
zcmodeltech14 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
airobotcn15 小时前
智能巡检平台容器化部署:Docker+K8s在工业边缘的实践
人工智能·docker·容器·kubernetes·机器人·自动化
tianxuanjg15 小时前
机器人精密零件:为何样品合格,批量却频频超差?
人工智能·经验分享·机器人·无人机·制造·材质
airobotcn16 小时前
AI Agent下工厂:大模型如何驱动巡检机器人自主决策
人工智能·机器人·自动化·无人机
搜yyzk66816 小时前
智能语音电销机器人:高效率自动筛选客户
机器人