🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
对模型用check_urdf后缀为.urdf时显示的错误如图:
而后缀为.urdf.xacro时显示的错误如下:
下面是模型文件代码:
<?xml version="1.0"?>
<robot name="racecar" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!--macro-->
<xacro:macro name="null_inertial">
<inertial>
<mass value="0.001"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
</xacro:macro>
<xacro:macro name="solid_cuboid_inertial"
params="width depth height mass *origin">
<inertial>
<xacro:insert_block name="origin"/>
<mass value="${mass}"/>
<inertia ixx="${mass * (depth * depth + height * height) / 12}"
ixy="0" ixz="0"
iyy="${mass * (width * width + height * height) / 12}"
iyz="0"
izz="${mass * (width * width + depth * depth) / 12}"/>
</inertial>
</xacro:macro>
<xacro:macro name="thick_walled_tube_inertial"
params="inner_rad outer_rad height mass">
<inertial>
<mass value="${mass}"/>
<inertia ixx="${(1 / 12) * mass * (3 * (inner_rad * inner_rad +
outer_rad * outer_rad) + height * height)}"
ixy="0" ixz="0"
iyy="${(1 / 12) * mass * (3 * (inner_rad * inner_rad +
outer_rad * outer_rad) + height * height)}"
iyz="0"
izz="${mass * (inner_rad * inner_rad +
outer_rad * outer_rad) / 2}"/>
</inertial>
</xacro:macro>
<xacro:macro name="shock"
params="lr_prefix fr_prefix lr_reflect fr_reflect child">
<joint name="${lr_prefix}_${fr_prefix}_shock" type="prismatic">
<parent link="chassis"/>
<child link="${child}"/>
<origin xyz="${fr_reflect * wheelbase / 2}
${lr_reflect * ((hex_hub_dist / 2) - axle_length)}
${(wheel_travel / 2) - shock_z_offset}"/>
<axis xyz="0 0 -1"/>
<limit lower="${-wheel_travel / 2}" upper="${wheel_travel / 2}"
effort="${shock_eff_limit}" velocity="${shock_vel_limit}"/>
</joint>
<transmission name="${lr_prefix}_${fr_prefix}_shock_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${lr_prefix}_${fr_prefix}_shock">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="${lr_prefix}_${fr_prefix}_shock_act">
<!-- This hardwareInterface element exists for compatibility
with ROS Hydro. -->
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<xacro:macro name="wheel" params="lr_prefix fr_prefix lr_reflect">
<link name="${lr_prefix}_${fr_prefix}_axle_carrier">
<xacro:null_inertial/>
</link>
<!-- The left and right axles have the same axis so that identical
rotation values cause the wheels to rotate in the same direction. -->
<joint name="${lr_prefix}_${fr_prefix}_axle" type="continuous">
<parent link="${lr_prefix}_${fr_prefix}_axle_carrier"/>
<child link="${lr_prefix}_${fr_prefix}_wheel"/>
<origin rpy="${degrees_90} 0 0"/>
<axis xyz="0 0 -1"/>
<limit effort="${axle_eff_limit}" velocity="${axle_vel_limit}"/>
</joint>
<transmission name="${lr_prefix}_${fr_prefix}_axle_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${lr_prefix}_${fr_prefix}_axle">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="${lr_prefix}_${fr_prefix}_axle_act">
<!-- This hardwareInterface element exists for compatibility
with ROS Hydro. -->
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<link name="${lr_prefix}_${fr_prefix}_wheel">
<visual>
<origin xyz="0
${lr_reflect * (axle_length - (tire_width /
2 - hex_hub_depth))}
0"/>
<geometry>
<cylinder radius="${tire_dia / 2}" length="${tire_width}"/>
</geometry>
<material name="tire_mat"/>
</visual>
<collision>
<origin xyz="0
${lr_reflect * (axle_length - (tire_width /
2 - hex_hub_depth))}
0"/>
<geometry>
<cylinder radius="${tire_dia / 2}" length="${tire_width}"/>
</geometry>
</collision>
<xacro:thick_walled_tube_inertial
inner_rad="${hub_dia / 2}" outer_rad="${tire_dia / 2}"
height="${tire_width}" mass="${wheel_mass}"/>
</link>
<gazebo reference="${lr_prefix}_${fr_prefix}_wheel">
<material>Gazebo/Black</material>
</gazebo>
</xacro:macro>
<xacro:macro name="front_wheel"
params="lr_prefix fr_prefix lr_reflect fr_reflect">
<xacro:shock lr_prefix="${lr_prefix}" fr_prefix="${fr_prefix}"
lr_reflect="${lr_reflect}" fr_reflect="${fr_reflect}"
child="${lr_prefix}_steering_link"/>
<link name="${lr_prefix}_steering_link">
<xacro:null_inertial/>
</link>
<joint name="${lr_prefix}_steering_joint" type="revolute">
<parent link="${lr_prefix}_steering_link"/>
<child link="${lr_prefix}_${fr_prefix}_axle_carrier"/>
<axis xyz="0 0 1"/>
<limit lower="${-degrees_45}" upper="${degrees_45}"
effort="${servo_stall_torque}" velocity="${servo_no_load_speed}"/>
</joint>
<transmission name="${lr_prefix}_steering_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${lr_prefix}_steering_joint">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="${lr_prefix}_steering_act">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<xacro:wheel lr_prefix="${lr_prefix}" fr_prefix="${fr_prefix}"
lr_reflect="${lr_reflect}"/>
</xacro:macro>
<xacro:macro name="rear_wheel"
params="lr_prefix fr_prefix lr_reflect fr_reflect">
<xacro:shock lr_prefix="${lr_prefix}" fr_prefix="${fr_prefix}"
lr_reflect="${lr_reflect}" fr_reflect="${fr_reflect}"
child="${lr_prefix}_${fr_prefix}_axle_carrier"/>
<xacro:wheel lr_prefix="${lr_prefix}" fr_prefix="${fr_prefix}"
lr_reflect="${lr_reflect}"/>
</xacro:macro>
<!-- chassis for sensors -->
<xacro:macro name="layer" params="layer parent m x y z *joint_pose">
<joint name="${layer}_joint" type="fixed">
<xacro:insert_block name="joint_pose"/>
<parent link="${parent}"/>
<child link="${layer}_link" />
</joint>
<link name="${layer}_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${x} ${y} ${z}" />
</geometry>
<material name="yellow" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${x} ${y} ${z}" />
</geometry>
</collision>
<xacro:solid_cuboid_inertial
width="${x}" depth="${y}"
height="${z}" mass="${m}">
<origin xyz="0 0 ${-z / 2}"/>
</xacro:solid_cuboid_inertial>
</link>
<gazebo reference="${layer}_link">
<material>Gazebo/Orange</material>
</gazebo>
</xacro:macro>
<link name="base_footprint"/>
<!-- base_link must have geometry so that its axes can be displayed in
rviz. -->
<link name="base_link">
<visual>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
<material name="chassis_mat"/>
</visual>
</link>
<gazebo reference="base_link">
<material>Gazebo/Grey</material>
</gazebo>
<joint name="base_footprint_to_base_link" type="fixed">
<parent link="base_footprint"/>
<child link="base_link"/>
<origin xyz="0 0 ${(wheel_travel/2)+shock_z_offset}" />
</joint>
<!-- Chassis -->
<link name="chassis">
<visual>W
<origin xyz="0 0 ${-chassis_height / 2}"/>
<geometry>
<box size="${chassis_length} ${chassis_width} ${chassis_height}"/>
</geometry>
<material name="chassis_mat"/>
</visual>
<collision>
<origin xyz="0 0 ${-chassis_height / 2}"/>
<geometry>
<box size="${chassis_length} ${chassis_width} ${chassis_height}"/>
</geometry>
</collision>
<xacro:solid_cuboid_inertial
width="${chassis_length}" depth="${chassis_width}"
height="${chassis_height}" mass="${chassis_mass}">
<origin xyz="0 0 ${-chassis_height / 2}"/>
</xacro:solid_cuboid_inertial>
</link>
<gazebo reference="chassis">
<material>Gazebo/Grey</material>
</gazebo>
<joint name="base_link_to_chassis" type="fixed">
<parent link="base_link"/>
<child link="chassis"/>
</joint>
<!-- Wheels -->
<xacro:front_wheel lr_prefix="left" fr_prefix="front"
lr_reflect="1" fr_reflect="1"/>
<xacro:front_wheel lr_prefix="right" fr_prefix="front"
lr_reflect="-1" fr_reflect="1"/>
<xacro:rear_wheel lr_prefix="left" fr_prefix="rear"
lr_reflect="1" fr_reflect="-1"/>
<xacro:rear_wheel lr_prefix="right" fr_prefix="rear"
lr_reflect="-1" fr_reflect="-1"/>
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<legacyModeNS>true</legacyModeNS>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
<robotNamespace>/racecar</robotNamespace>
</plugin>
</gazebo>
<!-- layers -->
<layer layer="platform" parent="chassis" m="${layer_mass}" x="${layer_x}" y="${layer_y}" z="${layer_z}">
<origin xyz="0 0 ${layer_height}" rpy="0 0 0" />
</layer>
<layer layer="lidar_platform" parent="platform_link" m="${layer_mass}" x="0.12" y="0.10" z="0.01">
<origin xyz="0.08 0 ${layer_height}" rpy="0 0 0" />
</layer>
<joint name="lidar_joint" type="fixed">
<origin xyz="0 0 0.03" rpy="0 0 0" />
<parent link="lidar_platform_link"/>
<child link="laser_link"/>
</joint>
<lidar prefix="laser"/>
<joint name="camera_joint" type="fixed">
<origin xyz="0.16 0 0.05" rpy="0 0 0" />
<parent link="platform_link"/>
<child link="camera_link"/>
</joint>
<camera prefix="camera"/>
</robot>
求解决
解决方案
如下是上述问题的解决方案,仅供参考:
您遇到的问题是在Ubuntu系统上使用check_urdf
工具对URDF(Unified Robot Description Format)文件进行验证时出现了错误。这个问题可能是由于多种原因造成的,包括但不限于URDF文件中的语法错误、未定义的参数、错误的链接或关节定义等。
首先,您需要确保URDF文件是使用Xacro处理器正确处理过的。Xacro是URDF的宏语言,它允许您使用参数化和模板化的宏来构建复杂的URDF模型。如果您的URDF文件是.urdf.xacro
文件,您需要先使用Xacro处理器将其转换成.urdf
文件,然后再使用check_urdf
工具进行验证。
以下是一些解决步骤:
-
处理Xacro文件:
使用Xacro处理器将.urdf.xacro
文件转换成.urdf
文件。您可以使用以下命令行:xacro path/to/your/urdf.xacro > path/to/output/urdf.urdf
确保
path/to/your/urdf.xacro
是您的Xacro文件的路径,path/to/output/urdf.urdf
是您希望生成的URDF文件的路径。 -
检查URDF文件:
打开生成的.urdf
文件,检查是否有任何明显的错误,如未闭合的标签、错误的属性值等。 -
使用
check_urdf
验证:
使用check_urdf
工具对生成的.urdf
文件进行验证。如果check_urdf
报告了错误,请仔细阅读错误信息,它们通常会指出问题所在。 -
修正错误:
根据check_urdf
提供的错误信息,修正URDF文件中的问题。这可能包括修正关节的origin
、确保所有链接都有定义的geometry
和inertial
属性,以及确保所有引用的材质都已定义。 -
重新验证:
在修正任何错误后,重新使用check_urdf
工具验证URDF文件,直到没有错误为止。
如果您在处理Xacro文件或使用check_urdf
时遇到网络问题,这可能是由于网络连接不稳定或链接地址不正确导致的。确保您的网络连接是稳定的,并且检查Xacro文件中的所有链接是否都是有效的。如果问题仍然存在,您可能需要检查网络设置或联系网络管理员寻求帮助。
请注意,由于我无法查看图像内容,以上建议是基于您提供的URDF代码和描述的问题。如果问题依然无法解决,您可能需要提供更详细的错误信息,或者在ROS社区、论坛或GitHub上寻求帮助。
希望能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。