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
相关推荐
z2005093035 分钟前
【Linux学习】Linux中的进程程序替换
linux·服务器·学习
ytdbc1 小时前
OSPF综合实验
网络
kaisun642 小时前
Docker 构建网络问题排查
网络·docker·eureka
lihao lihao2 小时前
软硬链接
linux·运维·服务器
TOWE technology2 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
雪度娃娃2 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG20242 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam0511232 小时前
OSPF综合实验
网络
QQ15401828563 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片
大明者省3 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记