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
相关推荐
GG-_-Bond2 小时前
基于dpdk实现udp接收数据
linux·网络·udp
平凡シンプル2 小时前
TCP UDP 网络通信插件 SL-Uniplugin-Tcp-Udp
网络·学习·uniapp·记录
小程序设计2 小时前
Easy-Shop商城小程序漏洞挖掘与防护研究
网络·安全
万联WANFLOW3 小时前
TikTok Shop上线“Sell Across EU”,欧洲社交电商迎来生态重构
网络·业界资讯
tedcloud1233 小时前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
初願致夕霞3 小时前
Linux 进程间通信(IPC)机制详解:管道、FIFO 与 System V 共享内存
linux·服务器·c++
傲世仙尊3 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++
曦夜日长3 小时前
Linux系统篇,进程概念(三):进程状态详解、僵尸进程与孤儿进程的深度解析、Slab机制的了解
linux·运维·服务器
liulilittle4 小时前
为什么采用全局管理缓存及状态:麻将客户端状态管理
服务器·网络·游戏·客户端·异步·mahjong·麻将
酣大智4 小时前
OSPF引入的直连路由在 ospf 路由表中看不到
网络·ospf