Gazebo仿真模型调试
启动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" />
经过这一系列配置,旋转部件顺利实现了控制
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)