前言

需求:假如你有一个urdf文件,你想要在gazebo中打开。

比如:myarm.urdf文件如下

<?xml version="1.0"?>
<robot name="myarm">

  <link name="arm_base_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.09"/>
      <geometry>
        <cylinder length="0.18" radius="0.1"/>
      </geometry>
      <material name="yellow">
        <color rgba="1 1 0 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.09"/>
      <geometry>
        <cylinder length="0.18" radius="0.1"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.0052" ixy="0.0" ixz="0.0" iyy="0.0052" iyz="0.0" izz="0.005"/>
    </inertial>
  </link>

  <joint name="arm_joint1" type="revolute">
    <parent link="arm_base_link"/>
    <child link="arm_link1"/>
    <origin rpy="0 0 0" xyz="0 0 0.18"/>
    <axis xyz="0 0 1" />
    <limit effort="300" velocity="0.6" lower="-2.96" upper="2.96"/>
    <dynamics damping="50" friction="1"/>
  </joint>

  <link name="arm_link1">
    <visual>
      <geometry>
        <box size="0.1 0.06 0.2"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0.03 0.1"/>
      <material name="blue">
        <color rgba="0 0 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.1 0.06 0.2"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0.03 0.1"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.004167" ixy="0.0" ixz="0.0" iyy="0.001133" iyz="0.0" izz="0.003633"/>
    </inertial>
  </link>
  <joint name="arm_joint2" type="revolute">
    <parent link="arm_link1"/>
    <child link="arm_link2"/>
    <origin rpy="0 0 0" xyz="0 0 0.18"/>
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="0.6" lower="-2.09" upper="2.09"/>
    <dynamics damping="50" friction="1"/>
  </joint>

  <link name="arm_link2">
    <visual>
      <geometry>
        <cylinder length="0.24" radius="0.03"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.12"/>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.24" radius="0.03"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.12"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.005025" ixy="0.0" ixz="0.0" iyy="0.005025" iyz="0.0" izz="0.00045"/>
    </inertial>
  </link>

  <joint name="arm_joint3" type="revolute">
    <parent link="arm_link2"/>
    <child link="arm_link3"/>
    <origin rpy="0 0 0" xyz="0 0 0.24"/>
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="0.6" lower="-2.09" upper="2.09"/>
    <dynamics damping="50" friction="1"/>
  </joint>

  <link name="arm_link3">
    <visual>
      <geometry>
        <box size="0.04 0.04 0.18"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.09"/>
      <material name="green">
        <color rgba="0 1 0 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.04 0.04 0.18"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.09"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.002833" ixy="0.0" ixz="0.0" iyy="0.000267" iyz="0.0" izz="0.002833"/>
    </inertial>
  </link>
  <joint name="gripper_base_joint" type="fixed">
    <parent link="arm_link3"/>
    <child link="gripper_base_link"/>
    <origin rpy="0 0 0" xyz="0 0 0.18"/>
  </joint>

  <link name="gripper_base_link">
    <visual>
      <geometry>
        <box size="0.03 0.1 0.02"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.01"/>
      <material name="white">
        <color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.03 0.1 0.02"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.01"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.000108" ixy="0.0" ixz="0.0" iyy="0.000083" iyz="0.0" izz="0.000867"/>
    </inertial>
  </link>
  <joint name="finger1_joint" type="prismatic">
    <parent link="gripper_base_link"/>
    <child link="finger1_link"/>
    <origin rpy="0 0 0" xyz="0 0.03 0.02"/>
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="0.6" lower="-0.025" upper="0.01"/>
    <dynamics damping="50" friction="1"/>
  </joint>

  <link name="finger1_link">
    <visual>
      <geometry>
        <box size="0.03 0.01 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.025"/>
      <material name="purple">
        <color rgba="1 0 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.03 0.01 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.025"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.000283" ixy="0.0" ixz="0.0" iyy="0.000083" iyz="0.0" izz="0.000217"/>
    </inertial>
  </link>

  <joint name="finger2_joint" type="prismatic">
    <parent link="gripper_base_link"/>
    <child link="finger2_link"/>
    <origin rpy="0 0 0" xyz="0 -0.03 0.02"/>
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="0.6" lower="-0.01" upper="0.025"/>
    <dynamics damping="50" friction="1"/>
    <mimic joint="finger1_joint" multiplier="-1"/>
  </joint>

  <link name="finger2_link">
    <visual>
      <geometry>
        <box size="0.03 0.01 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.025"/>
      <material name="purple">
        <color rgba="1 0 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.03 0.01 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.025"/>
    </collision>
    <inertial>
      <mass value="1"/>
      <inertia ixx="0.000283" ixy="0.0" ixz="0.0" iyy="0.000083" iyz="0.0" izz="0.000217"/>
    </inertial>
  </link>
  <joint name="gripper_centor_joint" type="fixed">
    <parent link="gripper_base_link"/>
    <child link="gripper_centor_link"/>
    <origin rpy="0 0 0" xyz="0 0 0.045"/>
  </joint>

  <link name="gripper_centor_link" />

</robot>

然后我查了很多资料,发现:

这部分,网上的博客资料比较少(至少我觉得,初学者很难找到有用的资料),在一些视频全程课中,可以找到,所以,我觉得资料并不是很多(不然我早就找到会了),因此,这里写一个教程。

最开始,我以为gazebo导入urdf很简单,现在发现,也是比较困难的,需要创建包,写launch文件。

创建包

  1. 创建目录,进入目录
mkdir -p catkin_ws/src/
cd catkin_ws/src/
  1. 创建功能包
catkin_create_pkg my_gazebo_pkg urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins

其中,my_gazebo_pkg是你要创建的包的名称,可以不是这个,urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins是需要的插件。

创建launch和urdf目录

你可以选择在vscode中打开src目录,然后在my_gazebo_pkg目录下创建launchurdf文件夹,用来放置launch文件和urdf文件。这一步你可以在终端使用mkdir命令创建。

在这里插入图片描述

编写urdf和launch文件

  • 将最开头的myarm.urdf放入到urdf目录下。
  • 编写launch文件,gazebo.launch文件如下
<launch>
    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" textfile="$(find my_gazebo_pkg)/urdf/myarm.urdf" />

    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

在其他项目的launch文件中,只需要修改$(find my_gazebo_pkg)/urdf/myarm.urdf的find 后面的包名称即可(只需要你按照这样的架构创建包)

运行

在终端中,或者vscode终端运行

roslaunch my_gazebo_pkg gazebo.launch 

my_gazebo_pkg就是包名称,gazebo.launch就是launch文件。

ps:如果你需要更改模型,你只需要在模型,右键,点击edit model即可

在这里插入图片描述
此时,已经进入编辑模式了。
在这里插入图片描述

Logo

更多推荐