修改gazebo中的模型文件&简单添加模型

前言

本篇博客是自己的学习记录,不对任何言论负责!如果中间有任何错误欢迎指出。^ ^
简单介绍一下环境配置Ubuntu20.04 Gazebo11 PX4 1.13


1. 如何在已有的模型上添加东西

举例:在无人艇的船板上添加apriltag

笔者这里用的是sandisland.launch文件,无人艇作为可控对象,直接在launch文件中就有相关的模型的定义。
在这个场景下,对无人艇的定义如下:

<!-- Load robot model -->
  <arg name="urdf" default="$(find wamv_gazebo)/urdf/wamv_gazebo.urdf.xacro"/>
  <param name="$(arg namespace)/robot_description"
         command="$(find xacro)/xacro &#x002D;&#x002D;inorder '$(arg urdf)'
         thruster_config:=$(arg thrust_config)
         camera_enabled:=$(arg camera_enabled)
         gps_enabled:=$(arg gps_enabled)
         imu_enabled:=$(arg imu_enabled)
         lidar_enabled:=$(arg lidar_enabled)
         ground_truth_enabled:=$(arg ground_truth_enabled)
         namespace:=$(arg namespace) "/>

根据这段代码,找到这个模型对应的相关的文件,此处为wamv_gazebo.urdf.xacro,再根据前面的路径找到该文件,有的时候文件重复的比较多,容易找错。

然后在这个文件当中,可以看到一段代码是对无人艇这个模型自身的定义,而不是其他的什么传感器。

<!-- === The WAM-V platform === -->
  <xacro:include filename="$(find wamv_gazebo)/urdf/wamv_gazebo.xacro"/>

再进入wamv_gazebo.xacro这个文件。以下是这个文件的全部内容:

<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro">
  <!-- Macro to create a WAM-V with dyanmics plugins and a customizeable thruster layout -->
  <xacro:macro  name="wamv_gazebo" params="thruster_layout">
    <!-- Include macros for dynamics plugins -->
    <xacro:include filename="$(find wamv_gazebo)/urdf/macros.xacro" />
    <!-- Defines the base vehicle -->
    <xacro:include filename="$(find wamv_description)/urdf/wamv_base.urdf.xacro" />
    <!-- Thruster Layout -->
    <xacro:include filename="${thruster_layout}"/>
    <!-- Attach hydrodynamics plugin -->
    <xacro:usv_dynamics_gazebo name="wamv_dynamics_plugin"/>
  </xacro:macro>
</robot>

大致看一下可以发现wamv_base.urdf.xacro这个文件就是封装这个无人艇模型的最终文件。

<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="wam-v">
  <!-- Macro for creating the main collisions as simple shapes. -->
  <xacro:macro name="main_collisions" params="prefix reflect:=1">
    <!-- Main float -->
    <collision name="${prefix}_float">
      <origin xyz="-0.4 ${1.03*reflect} 0.2" rpy="${0*reflect} 1.57 0" />
      <geometry>
        <cylinder length="4" radius="0.2" />
      </geometry>
    </collision>

    <collision name="${prefix}_mid_float">
      <origin xyz="1.85 ${1.03*reflect} 0.3" rpy="${0*reflect} 1.38 0" />
      <geometry>
        <cylinder length="0.5" radius="0.17" />
      </geometry>
    </collision>
    <collision name="${prefix}_front_float">
      <origin xyz="2.3 ${1.03*reflect} 0.4" rpy="${0*reflect} 1.3 0" />
      <geometry>
        <cylinder length="0.45" radius="0.12" />
      </geometry>
    </collision>

    <!-- Front beam -->
    <collision name="front_${prefix}_beam_lower">
      <origin xyz="0.9 ${0.85*reflect} 1" rpy="${0.78*reflect} 0 0" />
      <geometry>
        <cylinder length="0.5" radius="0.04" />
      </geometry>
    </collision>

    <collision name="front_${prefix}_beam_upper">
      <origin xyz="0.9 ${0.6*reflect} 1.18" rpy="${1.35*reflect} 0 0" />
      <geometry>
        <cylinder length="0.2" radius="0.04" />
      </geometry>
    </collision>

    <!-- Mid beam -->
    <collision name="mid_${prefix}_beam_lower">
      <origin xyz="-0.65 ${0.99*reflect} 0.7" rpy="${0.1*reflect} 0.25 0" />
      <geometry>
        <cylinder length="0.45" radius="0.03" />
      </geometry>
    </collision>

    <collision name="mid_${prefix}_beam_medium">
      <origin xyz="-0.57 ${0.87*reflect} 1.05" rpy="${0.75*reflect} 0.25 0" />
      <geometry>
        <cylinder length="0.32" radius="0.03" />
      </geometry>
    </collision>

    <collision name="mid_${prefix}_beam_upper">
      <origin xyz="-0.55 ${0.65*reflect} 1.17" rpy="${1.35*reflect} 0.25 0" />
      <geometry>
        <cylinder length="0.3" radius="0.03" />
      </geometry>
    </collision>

    <!-- Rear beam -->
    <collision name="rear_${prefix}_beam_lower">
      <origin xyz="-0.74 ${1.03*reflect} 0.7" rpy="${0*reflect} -0.15 0" />
      <geometry>
        <cylinder length="0.45" radius="0.03" />
      </geometry>
    </collision>

    <collision name="rear_${prefix}_beam_medium">
      <origin xyz="-0.79 ${0.91*reflect} 1.05" rpy="${0.75*reflect} -0.15 0" />
      <geometry>
        <cylinder length="0.32" radius="0.03" />
      </geometry>
    </collision>

    <collision name="rear_${prefix}_beam_upper">
      <origin xyz="-0.81 ${0.67*reflect} 1.18" rpy="${1.45*reflect} -0.15 0" />
      <geometry>
        <cylinder length="0.3" radius="0.03" />
      </geometry>
    </collision>

    <!-- Joint -->
    <collision name="${prefix}_joint">
      <origin xyz="0.58 ${1.03*reflect} 0.6" rpy="${0*reflect} -0.6 0" />
      <geometry>
        <box size="0.65 0.2 0.1" />
      </geometry>
    </collision>
  </xacro:macro>

  <link name="base_link">
  </link>

  <joint name="dummy_joint" type = "fixed">
    <parent link="base_link"/>
    <child link="dummy_link"/>
  </joint>

  <!-- Basic model of the 16' WAM-V USV -->
  <link name="dummy_link">
    <visual>
      <geometry>
        <mesh filename="package://wamv_description/models/WAM-V-Base/mesh/WAM-V-Base.dae"/>
      </geometry>
    </visual>

    <!-- Left base collisions -->
    <xacro:main_collisions prefix="left" reflect="1" />

    <!-- Right side collisions -->
    <xacro:main_collisions prefix="right" reflect="-1" />

     <!-- Top base -->
    <collision name="top_base">
      <origin xyz="0 -0 1.25" rpy="0 0 0" />
      <geometry>
        <box size="1.85 1 0.1" />
      </geometry>
    </collision>

    <inertial>
      <!-- From WAM-V spec sheet -->
      <mass value="180.0"/>
      <inertia ixx="120.0" ixy="0.0" ixz="0.0" iyy="393" iyz="0.0" izz="446.0"/>
    </inertial>
  </link>
 </robot>

这是wamv_base.urdf.xacro文件的全部代码,如果要另加上一个apriltag的话,只需要在最后,也就</robot>前面添加一段代码:

<link name="apriltag0_link">
    <visual>
      <geometry>
        <box size="1.0 1.0 0.01" rpy="0 0 0"/>
      </geometry>
    </visual>
    <collision>
      <origin xyz="0 0 0.0" rpy="0 0 0" />
      <geometry>
        <box size="1.0 1.0 0.01" rpy="0 0 0"/>
      </geometry>
    </collision>
</link>

<joint name="apriltag0_link_joint" type="fixed">
    <parent link="base_link" />
    <child link="apriltag0_link" />
    <origin xyz="0 0 1.3" rpy="0 0 0" />
</joint>
<gazebo reference="apriltag0_link">
    <material>Apriltag36_11_00000</material>
</gazebo>

在旧模型上添加新模型就是会复杂一点,因为已经封装好的官方的模型文件嵌套比较多,所以需要比较细致地去找定义模型本身的文件是哪一个再进行修改。而且在对于这些可控的模型上一般都是在.xacro文件中进行修改。
除了直接添加link,还要有joint也就是关节代码的添加和原模型链接起来,可以让新添加的模型随之移动。
material就是相当于添加的模型表面的纹理材料,这里我添加的就是一个png图片,所以就会显示一个apriltag在无人艇上。
带有apriltag的无人艇

2. 如何直接在你的场景中添加模型

这个相对于前面简单一些,这里用的场景就是最简单的marvros_posix_sitl.launch。

<!-- vehicle model and world -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="iris"/>
    <arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>
    <arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/iris_downward_camera/iris_downward_camera.sdf"/>

在开始的这段代码中可以发现这个场景用的world是empty.world,然后进入这个文件。
<world></world>标签内添加模型代码,具体格式如下:

    <model name='apriltag'>
      <include>
        <uri>model://apriltag</uri>
	      <pose> 1.8 2 0.05 0 0 0 </pose>
      </include>
    </model>

其中这个model://就需要在model文件夹里添加相应的文件夹,我的launch文件的路径是写在px4文件夹里的,所以我的model文件的路径为/home/xxx/PX4_Firmware/Tools/sitl_gazebo/models,文件目录的结构如下:
~/PX4_Firmware/
├── Tools/
│ ├── sitl_gazebo/
│ │ ├── models/
│ │ │ ├── apriltag/
│ │ │ │ ├── materials/
│ │ │ │ │ ├── scripts/
│ │ │ │ │ │ └── Apriltag.material
│ │ │ │ │ ├── textures/
│ │ │ │ │ │ └── tag36_11_00000.png
│ │ │ │ ├── model.config
│ │ │ │ ├── model.sdf
其中model.configmodel.sdf可以参照其他model文件写,本Apriltag.material文件如下:

material Apriltag36_11_00000
{
  technique
  {
    pass
    {
      lighting off
      texture_unit
      {
        texture tag36_11_00000.png
        scale 1.0 1.0
      }
    }
  }
}

贴在地上的apriltag
这样就算添加完成了

要在Gazebo启动机器人URDF模型,需要使用以下步骤: 1. 配置好机器人的URDF文件,确保模型和关节描述正确。 2. 创建一个启动文件(launch file),并导入必要的ROS包和参数。 3. 在启动文件添加一个Gazebo节点,指定需要加载的URDF模型文件,以及其他参数,例如仿真器的时间步长和模型的起始位置。 以下是一个简单的启动文件的示例,可以用来启动一个URDF模型Gazebo: ``` <launch> <!-- Load URDF model --> <arg name="urdf_file" default="$(find my_robot_description)/urdf/my_robot.urdf" /> <param name="robot_description" command="$(find xacro)/xacro $(arg urdf_file)" /> <!-- Launch Gazebo with URDF model --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot_gazebo)/worlds/my_robot_world.world" /> </include> <!-- Set initial robot pose --> <node name="set_initial_pose" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -param robot_description -model my_robot -x 0 -y 0 -z 0 -Y 0" /> </launch> ``` 其,第一个参数`urdf_file`指定了URDF模型文件的路径。第二个参数`robot_description`使用ROS参数服务器来存储URDF模型的描述。接下来,使用Gazebo的`empty_world.launch`节点来加载仿真器,同时指定需要加载的URDF文件。最后,使用`spawn_model`节点来设置模型的初始位置和姿态。 注意,这只是一个示例启动文件,并且需要根据你的具体情况进行修改。同时,需要确保已经安装了必要的ROS包和Gazebo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值