启动Gazebo后模型直接起飞

Solidworks导出的机器人模型包里launch启动gazebo后,机器人的初始位置是,base_link所在的位置将会位于地面。这导致我的机器人模型直接嵌入到了地面。
为了方便调试,我改了仿真world的启动文件,把里面的paused参数设置为了true。这样在启动Gazebo时,一切都是静止的,我能看到机器人的初始状态。
为了让机器人初始状态下不会嵌入到地面,需要调整机器人初始位置参数.
如下面位于launch中的机器人模型加载命令,可以调整robot_position的Z参数到一个合适的位置。让仿真启动时机器人的初始位置略高于地面,这样仿真器运行起来后,机器人状态会正常很多。

<arg name="robot_position" default="-x 0.0 -y -0.0 -z 0.15 -R 0 -P 0 -Y 0" />
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model $(arg model_name) -param robot_description -robot_namespace $(arg robot_name) $(arg robot_position) "/>

部分机器人模型部件有问题

之前画模型的时候,有些活动部件没画好,导致怎么调它的位置参数它都很容易出问题。
由于这些部件不是关键部件,我也不想重新导出一遍,我就在urdf中把这些部件相关的link和joint块全部注释了。这样启动仿真时,这些部件都不会加载。

轮子位置上下颠倒

调整对应的Joint的origin中的rpy参数,如果方向不对的那个轴的值是0,就改为3.14169(Pi); 如果是Pi, 就改为0.

主动转向机构的位置不对

修改link的visual参数,xyz调整位置,rpy调整朝向(旋转)

    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 1.5707963" />
      <geometry>

调整visual参数后,要记得同步调整碰撞检测范围的位置、朝向参数。要直观的看到碰撞空间,你需要打开gfazebo的碰撞空间显示开关,在菜单View -> Collisions。

    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 1.5707963" />
      <geometry>
        <mesh
          filename="package://path/to/xxx.STL" />
      </geometry>
    </collision>

配置控制器

由于我的机器人模型是类似火星车那种,带有主动转向轮的模型,所以配置起来比差速模型复杂一些。
xacro中的配置如下

    <!-- ===================== 驱动轮传动宏(速度接口) ===================== -->
    <xacro:macro name="wheel_transmission" params="joint_name">
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- ===================== 转向关节传动宏(位置接口) ===================== -->
    <xacro:macro name="steering_transmission" params="joint_name">
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>
    
    <!-- ===================== gazebo_ros_control 插件宏 ===================== -->
    <xacro:macro name="gazebo_ros_control_plugin" params="robot_namespace">
        <gazebo>
            <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
                <robotNamespace>${robot_namespace}</robotNamespace>
                <robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
                <legacyModeNS>true</legacyModeNS>
            </plugin>
        </gazebo>
    </xacro:macro>

    <xacro:macro name="wheel_joint_dynamics" params="joint_name">
        <gazebo reference="${joint_name}">
            <implicitSpringDamper>false</implicitSpringDamper>
        </gazebo>
    </xacro:macro>
    
    <xacro:wheel_transmission joint_name="xxxWheelJoint" />
    <xacro:steering_transmission joint_name="xxxTurningJoint" />

启动仿真后机器人所有部件坍缩到原点

根本原因是ode仿真引擎的更新频率不够高、步长不够小,一开始会坍缩的参数是这样的

    <real_time_update_rate>100</real_time_update_rate>
    <max_step_size>0.01</max_step_size>

改成这样就不会坍缩了

    <real_time_update_rate>1000</real_time_update_rate>
    <max_step_size>0.001</max_step_size>

会坍缩的情况,我这边坍缩的诱因是这样的:
libgazebo_ros_control插件需要pid参数,参数设置得太大导致异常,机器人会直接坍缩。
需要先给定比较小的pid值,如下值,然后一步步调试到适合的大小。

      p: 0.1
      i: 0.01
      d: 0.01

轮子不转

检查轮子对应的Joint中是否有速度限制。如下,轮子速度被限制为0, 可以将其改为非0值,或者直接删除

<limit effort="1000" velocity="0" />

轮子不停轻微弹跳抖动

让ai给我优化urdf和xacro, 经过它一顿操作,在Joint中加了

    <dynamics damping="0.1" />

在xacro文件中加了

    <xacro:macro name="wheel_joint_dynamics" params="joint_name">
        <gazebo reference="${joint_name}">
            <implicitSpringDamper>false</implicitSpringDamper>
        </gazebo>
    </xacro:macro>

    <xacro:wheel_joint_dynamics joint_name="xxxWheelJoint" />

之后,情况有所好转,抖动幅度变小,抖动频率降低

旋转部件无法控制

给旋转部件加上插件尝试控制转速时,发现和轮子一样的配置,但是发送控制命令却无法控制它旋转,或者启动后机器人直接爆炸或者坍缩。经过摸索,解决了这个问题:

  • 在libgazebo_ros_joint_state_publisher插件的配置中,加上旋转部件的JointName
  • 和轮子一样加上速度控制插件配置 <xacro:wheel_transmission joint_name="xxxJoint" />
  • 在插件的yaml配置文件中也加上对应旋转部件控制插件的参数
  • 在旋转部件对应的Joint配置中加上运动学限制,做了这一步后,我的模型启动后不再坍缩,只是会疯狂乱动
    <limit
      effort="1000"
      velocity="50" />
    
  • 调整urdf中对应旋转部件的link中的inertia配置,从这样
    
          <inertia
            ixx="2.70928476370511E-05"
            ixy="2.33985411453379E-07"
            ixz="-3.24979906420981E-22"
            iyy="7.99095065084032E-07"
            iyz="-5.91147963026124E-22"
            izz="2.72821349540844E-05" />
        </inertial>
    
    调整成这样
      <inertia
        ixx="0.00001"
        ixy="0.0000"
        ixz="0.0000"
        iyy="0.00001"
        iyz="0.0000"
        izz="0.00001" />
    

经过这一系列配置,旋转部件顺利实现了控制

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐