admin管理员组

文章数量:1597911

ROS中gazebo配置教程详解

  • 机器人模型文件
    • 获取原始URDF模型文件
    • 采用xacro格式改写文件
    • 增加gazebo插件描述
    • 增加传动transmission
    • 最后将上面三个文件合成一个文件
  • 环境XX.world文件
  • 配置文件××.yaml
  • 启动文件launch
    • 启动环境
    • 加载机器人模型
    • 加载并启动控制器
    • 总启动文件
  • 验证启动是否正确

每次配置机械臂到gazebo中都要浪费很多时间,网上教程多而杂乱,如何快速合理配置是机械臂参数,启动gazebo是一个困扰我很久的问题,本文将详细写每个配置过程。
将机器人模型导入gazebo并可以实现控制和数据采集所需步骤:

  • 1.安装gazebo,最好是比较新的版本
  • 2.机器人模型文件
  • 3.机器人环境文件
  • 4.控制器参数配置
  • 5.启动文件

机器人模型文件

获取原始URDF模型文件

URDF是一种描述机器人结构的常用文件,格式为XML,其内包含了连杆形状和尺寸、关节类型等,作为大神是可以直接写出URDF的,但是最简单的方法还是直接通过工具从SolidWorks直接导出URDF文件。具体教程参照Solidworks模型转换到URDF格式并配置Moveit的详细教程
获得得URDF文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail) 
     Commit Version: 1.5.0-0-g9aa0fdb  Build Version: 1.5.7004.21443
     For more information, please see http://wiki.ros/sw_urdf_exporter -->
<robot
  name="armc_description">

<link name="world"/>
<joint name="fixed" type="fixed">
  <parent link="world"/>
  <child link="base_link"/>
</joint>
  <link
    name="base_link">
    <inertial>
      <origin
        xyz="2.7291E-05 6.0375E-05 0.070392"
        rpy="0 0 0" />
      <mass
        value="0.30535" />
      <inertia
        ixx="0.00091531"
        ixy="-2.4502E-07"
        ixz="2.9378E-07"
        iyy="0.00091481"
        iyz="8.1214E-07"
        izz="0.00047819" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>
  <link
    name="Link1">
    <inertial>
      <origin
        xyz="-9.6229E-07 -0.00081654 0.22221"
        rpy="0 0 0" />
      <mass
        value="0.29195" />
      <inertia
        ixx="0.00091458"
        ixy="1.0429E-07"
        ixz="-1.9214E-10"
        iyy="0.00078906"
        iyz="-3.0542E-06"
        izz="0.00046485" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/Link1.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/Link1.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="Joint1"
    type="continuous">
    <origin
      xyz="0 0 0"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="Link1" />
    <axis
      xyz="0 0 1" />
    <limit
      lower="-3.14"
      upper="3.14"
      effort="60"
      velocity="20" />
  </joint>
</robot>

采用xacro格式改写文件

xacro文件可以帮助我们压缩URDF文件大小,并且增加文件的可读性和可维护性。xacro可以采用宏定义,循环等方式写机器人模型文件,可以极大地缩减文件的大小。
对于小白党来时说,文件大小影响不大,重要的是快速实现相应功能,本文介绍一种最简单的方法,直接将上异步的URDF复制到一个新建文件**.xacro文件中,然后添加

<robot name="armc" xmlns:xacro="http://wiki.ros/xacro">

armc.xacro文件如下

<?xml version="1.0"?>
<robot name="armc" xmlns:xacro="http://wiki.ros/xacro">
<link name="world"/>
<joint name="fixed" type="fixed">
  <parent link="world"/>
  <child link="base_link"/>
</joint>
  <link
    name="base_link">
    <inertial>
      <origin
        xyz="2.7291E-05 6.0375E-05 0.070392"
        rpy="0 0 0" />
      <mass
        value="0.30535" />
      <inertia
        ixx="0.00091531"
        ixy="-2.4502E-07"
        ixz="2.9378E-07"
        iyy="0.00091481"
        iyz="8.1214E-07"
        izz="0.00047819" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>
  <link
    name="Link1">
    <inertial>
      <origin
        xyz="-9.6229E-07 -0.00081654 0.22221"
        rpy="0 0 0" />
      <mass
        value="0.29195" />
      <inertia
        ixx="0.00091458"
        ixy="1.0429E-07"
        ixz="-1.9214E-10"
        iyy="0.00078906"
        iyz="-3.0542E-06"
        izz="0.00046485" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/Link1.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://armc_description/meshes/Link1.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="Joint1"
    type="continuous">
    <origin
      xyz="0 0 0"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="Link1" />
    <axis
      xyz="0 0 1" />
    <limit
      lower="-3.14"
      upper="3.14"
      effort="60"
      velocity="20" />
  </joint>
</robot>          

增加gazebo插件描述

主要用于添加gazebo插件以及一些gazebo属性,如设置仿真是杆件颜色、刚度等。
文件arm.gazebo如下

<?xml version="1.0"?>
<robot>
<!--设置连杆仿真属性-->
<gazebo reference="sensor_link">
<material>Gazebo/Red</material>
<mu1 value="10.0"/>
<mu2 value="10.0"/>
<kp value="0.3" />
<kd value="1.0" />
<fdir1 value="1 0 0"/>
<gravity value="true"/>
</gazebo>

<!--设置仿真时关节插件-->
<gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>armt</robotNamespace>
      <robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
      <legacyModeNS>true</legacyModeNS>
   </plugin>
</gazebo>

<!-- 增加力传感器插件 -->
<gazebo 
   reference="sensor_joint">
   <provideFeedback>true</provideFeedback>
</gazebo>-->
<!-- The ft_sensor plugin -->
<gazebo>
  <plugin name="ft_sensor" filename="libgazebo_ros_ft_sensor.so">
    <updateRate>100.0</updateRate>
    <topicName>ft_sensor_topic</topicName>
    <jointName>sensor_joint</jointName>
  </plugin>
</gazebo>
</robot>

增加传动transmission

*_transmission.xacro文件
transmission是硬件抽象层中的一部分,transmission的任务很清晰, 主要是两个方向的任务:

  • Actuator <–> Joint: 定义Joint的Pos, Vel, Tor与Motor的Pos, Vel, Tor.
  • State: 将编码器(例如角度, 力矩传感器等)的数据, 传递给对应的Joint, 变成最终的RobotState.
    注:本文直接主要配置两个,关节控制类型hardware_interface和传动比,其中传动比直接设置为1,Actuator执行器(动力源
    文件内容如下
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros/wiki/xacro" name="armt_joint">
  <xacro:macro name="armt_joint" params="joint_prefix">
    <transmission name="joint${joint_prefix}_trans">
      <type>transmission_interface/SimpleTransmission</type>
      <joint name="joint${joint_prefix}">
        <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
      </joint>
      <actuator name="joint${joint_prefix}_motor">
        <mechanicalReduction>1</mechanicalReduction>
      </actuator>
    </transmission>
  </xacro:macro>
</robot>

最后将上面三个文件合成一个文件

*.xacro格式文件的好处是,可以写入宏定义,导入其他文件等,所以我们可以将arm.gazebo和_transmission.xacro导入到文件armc.xacro,其相关片段代码如下

<?xml version='1.0'?>

<robot name="armt" xmlns:xacro="http://www.ros/wiki/xacro">
<!-- 添加宏定义-->
  <xacro:armt_joint joint_prefix="1"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="2"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="3"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="4"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="5"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="6"> </xacro:armt_joint>
  <xacro:armt_joint joint_prefix="7"> </xacro:armt_joint>

  <xacro:include filename="$(find armt_description)/urdf/arm.gazebo" />
  <xacro:include filename="$(find armt_description)/urdf/position_transmition.xacro" />

环境XX.world文件

环境文件写成**.world,一般是是现在gazebo中编辑好环境,最后生成world文件,下面给出了一个简单的示例。

<?xml version="1.0" ?>
<sdf version="1.4">
  <!-- We use a custom world for the rrbot so that the camera angle is launched correctly -->

  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>

    <!-- Global light source -->
    <include>
      <uri>model://sun</uri>
    </include>

    <!-- Focus camera on tall pendulum -->
    <gui fullscreen='0'>
      <camera name='user_camera'>
        <pose>4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190</pose>
        <view_controller>orbit</view_controller>
      </camera>
    </gui>

  </world>
</sdf>

配置文件××.yaml

gazebo用了ros_control,控制器创建时需要一些参数配置,如果直接在××.launch文件中输入配置参数,会使文件很大且很复杂,所以采用××.yaml文件配置参数
controller.yaml文件配置如下

armt:
  # Publish all joint states
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  

  joint_trajectory_controller:
    type: "position_controllers/JointTrajectoryController"
    joints:
      - joint1
      - joint2
      - joint3
      - joint4
      - joint5
      - joint6
      - joint7

    gains:
      joint1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint7:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

  joint_positions_controller:
    type: "position_controllers/JointGroupPositionController"
    joints:
      - joint1
      - joint2
      - joint3
      - joint4
      - joint5
      - joint6
      - joint7

    gains:
      joint1:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint2:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint3:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint4:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint5:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint6:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
      joint7:   {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}

需要注意:

  • 1 一个配置文件可以写多个控制器参数,甚至可以写其他配置参数
  • 2名空间必须与××.gazebo文件中的命名空间相同

启动文件launch

启动文件可以一次加载多个节点,所以使用起来非常方便,我们将启动文件分为4个,当然也可以写成一个,这个无所谓。
分4个文件:

  • 1 启动环境
  • 2 加载机械臂模型
  • 3 加载控制器,包括命令控制器和状态控制器
  • 4 总启动,用于加载前三个文件

启动环境

环境启动文件world.launch如下

<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <arg name="world_name" value="$(find robots_gazebo)/worlds/robots.world"/>
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="false"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>
  
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(arg world_name)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="gui" value="$(arg gui)"/>
    <arg name="headless" value="$(arg headless)"/>
    <arg name="debug" value="$(arg debug)"/>
  </include>
</launch>

加载机器人模型

rabot.launch机器人结构模型参数加载文件

<launch>
  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description" command="$(find xacro)/xacro.py '$(find armt_description)/urdf/armt.xacro'" /> 

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
	args="-urdf -model armt -param robot_description"/> 
</launch>

加载并启动控制器

controller.launch文件,需要注意命名空间一致型,且控制器类型与transmission文件中必须相同。

<launch>
  <!--加载控制器参数-->
	<rosparam file="$(find armt_gazebo)/config/controller.yaml" command="load"/>
 
  <!--加载位置控制器-->
  <node name="armt_controller_spawner" pkg="controller_manager" type="spawner" respawn="true"
    output="screen" ns="/armt" args="joint_positions_controller" />

  <!--加载关节状态控制器-->
  <node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
		output="screen" ns="/armt" args="joint_state_controller" />
  
  <!-- 转换关节状态到TF transforms来加载rviz -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
	      respawn="false" output="screen">
    <remap from="/joint_states" to="armt/joint_states" />
  </node>
</launch>

总启动文件

包含上面三个文件即可

<launch>
  <!--加载机器人模型和环境参数-->
  <include file="$(find armt_gazebo)/launch/armt_world.launch" />   
  <!--加载机器人模型和环境参数-->
  <include file="$(find armt_gazebo)/launch/armt_description.launch" />
  <!--加载控制器-->
  <include file="$(find armt_gazebo)/launch/armt_position_controller.launch" />     
</launch>

验证启动是否正确

启动后界面如下
用rostopic list查看是否所有话题都已经启动

d@f:~$ rostopic list
/armt/joint_positions_controller/command
/armt/joint_states
/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/gazebo_gui/parameter_descriptions
/gazebo_gui/parameter_updates
/rosout
/rosout_agg
/tf
/tf_static

本文标签: 详解教程rosgazebo