URDF(描述机器人模型)和SDF(Gazebo中用于描述仿真环境)

使用URDF(Unified Robot Description Format)

URDF是ROS中用于描述机器人模型的XML格式文件。你可以使用XML文件定义机器人的几何形状、惯性参数、关节和链接等。

示例URDF文件(my_robot.urdf):

复制代码
<?xml version="1.0"?>
<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.5 0.2"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.5 0.5 0.2"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="10"/>
      <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
    </inertial>
  </link>

  <joint name="base_to_arm" type="fixed">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <origin xyz="0 0 0.2"/>
  </joint>

  <link name="arm_link">
    <visual>
      <geometry>
        <cylinder radius="0.05" length="0.5"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <cylinder radius="0.05" length="0.5"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="2"/>
      <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/>
    </inertial>
  </link>
</robot>
使用SDF(Simulation Description Format)

SDF是Gazebo中用于描述仿真环境的XML格式文件。你可以使用SDF定义仿真世界、机器人模型、传感器等。

示例SDF文件(my_world.world):

复制代码
<?xml version="1.0"?>
<sdf version="1.6">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

    <model name="my_robot">
      <pose>0 0 0.1 0 0 0</pose>
      <link name="base_link">
        <collision name="base_collision">
          <geometry>
            <box>
              <size>0.5 0.5 0.2</size>
            </geometry>
        </collision>
        <visual name="base_visual">
          <geometry>
            <box>
              <size>0.5 0.5 0.2</size>
            </geometry>
          <material>
            <ambient>0 0 1 1</ambient>
            <diffuse>0 0 1 1</diffuse>
          </material>
        </visual>
        <inertial>
          <mass>10</mass>
          <inertia>
            <ixx>1</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>1</iyy>
            <iyz>0</iyz>
            <izz>1</izz>
          </inertia>
        </inertial>
      </link>
      <link name="arm_link">
        <collision name="arm_collision">
          <geometry>
            <cylinder>
              <radius>0.05</radius>
              <length>0.5</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="arm_visual">
          <geometry>
            <cylinder>
              <radius>0.05</radius>
              <length>0.5</length>
            </cylinder>
          </geometry>
          <material>
            <ambient>1 0 0 1</ambient>
            <diffuse>1 0 0 1</diffuse>
          </material>
        </visual>
        <inertial>
          <mass>2</mass>
          <inertia>
            <ixx>0.1</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.1</iyy>
            <iyz>0</iyz>
            <izz>0.1</izz>
          </inertia>
        </inertial>
      </link>
      <joint name="base_to_arm" type="fixed">
        <parent>base_link</parent>
        <child>arm_link</child>
        <pose>0 0 0.2 0 0 0</pose>
      </joint>
    </model>
  </world>
</sdf>

下面是一个包含GNSS(全球导航卫星系统)、IMU(惯性测量单元)、LiDAR(激光雷达)和Camera(摄像头)等多种传感器的机器人的.xacro模型文件示例。我们将使用Xacro(XML Macros)来简化模型描述。

1. 创建my_robot.xacro文件

复制代码
<?xml version="1.0"?>
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- Robot base link -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.5 0.2"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.5 0.5 0.2"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="10"/>
      <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
    </inertial>
  </link>

  <!-- GNSS Sensor -->
  <xacro:macro name="gnss_sensor" params="parent xyz rpy">
    <link name="gnss_link">
      <visual>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
        <material name="green">
          <color rgba="0 1 0 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.1"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>
    <joint name="gnss_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="gnss_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
  </xacro:macro>

  <!-- IMU Sensor -->
  <xacro:macro name="imu_sensor" params="parent xyz rpy">
    <link name="imu_link">
      <visual>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
        <material name="yellow">
          <color rgba="1 1 0 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.1"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>
    <joint name="imu_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="imu_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
  </xacro:macro>

  <!-- LiDAR Sensor -->
  <xacro:macro name="lidar_sensor" params="parent xyz rpy">
    <link name="lidar_link">
      <visual>
        <geometry>
          <cylinder radius="0.05" length="0.1"/>
        </geometry>
        <material name="gray">
          <color rgba="0.5 0.5 0.5 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <cylinder radius="0.05" length="0.1"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.5"/>
        <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
      </inertial>
    </link>
    <joint name="lidar_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="lidar_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
  </xacro:macro>

  <!-- Camera Sensor -->
  <xacro:macro name="camera_sensor" params="parent xyz rpy">
    <link name="camera_link">
      <visual>
        <geometry>
          <box size="0.03 0.03 0.03"/>
        </geometry>
        <material name="black">
          <color rgba="0 0 0 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <box size="0.03 0.03 0.03"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.2"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>
    <joint name="camera_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="camera_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
  </xacro:macro>

  <!-- Instantiate sensors -->
  <xacro:gnss_sensor parent="base_link" xyz="0.25 0 0.1" rpy="0 0 0"/>
  <xacro:imu_sensor parent="base_link" xyz="0.25 0 0.15" rpy="0 0 0"/>
  <xacro:lidar_sensor parent="base_link" xyz="0.25 0 0.2" rpy="0 0 0"/>
  <xacro:camera_sensor parent="base_link" xyz="0.25 0 0.25" rpy="0 0 0"/>

</robot>

2. 将.xacro文件转换为.urdf文件

您可以使用以下命令将.xacro文件转换为.urdf文件:

复制代码
rosrun xacro xacro --inorder my_robot.xacro > my_robot.urdf

3. 在Gazebo中加载模型

创建一个.world文件(例如my_world.world)并包含您的机器人模型:

复制代码
<?xml version="1.0"?>
<sdf version="1.6">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://sun</uri>
    </include>
    <model name="my_robot">
      <include>
        <uri>model://my_robot</uri>
      </include>
    </model>
  </world>
</sdf>

然后在终端中运行:

复制代码
roslaunch gazebo_ros empty_world.launch world_name:=my_world.world
相关推荐
Dawn-bit1 天前
Linux磁盘分区与Swap和磁盘故障查询
linux·运维·服务器·网络·云计算
梦想三三1 天前
LangChain Output Parser 实战:从字符串到结构化数据的完整指南
android·服务器·langchain·github·uv
netho01 天前
影刀rpa证书题库使用教学
运维·服务器·rpa
llilian_161 天前
便携式相位测量模块应用方案的核心优势
网络·功能测试·单片机
无足鸟ICT1 天前
【RHCA+】$[]
linux·运维·服务器
运维技术小记1 天前
国产化环境配置 VNC 远程桌面:麒麟 V10 实战
linux·运维·服务器
QH139292318801 天前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
栋***t1 天前
2026年不止防作弊,麦塔在线培训系统培训与考试安全的体系化设计
网络·安全
爱码少年1 天前
一条Shell命令实现文件目录服务器间快速转移
服务器·shell
laboratory agent开发1 天前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库