(尝试经验)ROS2中用gazebo仿真stl文件加载不出来的解决方法
这个地方卡了很多天了,用了很多方法,不能保证一定是最后用的那个有用,这里做几种可能的方法分享。
我学习的内容为用gazebo模拟机械臂部分(还没包括moveit2与gazebo联合仿真部分),学习的两个帖子均为 @韭菜钟-CSDN博客 大佬写的文章,有不明白的地方可以看一看大佬原帖。
在ROS2中,通过MoveIt2控制Gazebo中的自定义机械手-CSDN博客
ROS2中,从SolidWorks导出的urdf,联合moveit、gazebo进行控制及仿真_urdf在ros2中怎么运行-CSDN博客
问题描述:启动gazebo后,界面什么都没有,只有坐标系没有模型,终端界面GPT显示报错没找到stl模型文件
尝试解决方案:
①urdf编写路径问题(一开始改后没用,但最后改后起作用的方法)
大佬在第一个帖子中解释过原因,“对于mesh文件(dae、stl),gazebo那边识别不了 package://claw_description 这种ros系统的路径查找方式(尝试运行的话,gazebo直接卡在那里),只能用 $(find claw_description)这种方式找到绝对路径并替换。rviz这边又不认这种绝对路径的。”
所以需要用下面的代码形式来满足两边的stl路径需求:
<mesh filename="file://$(find claw_description)/meshes/link1.STL" />

这里值得注意的是,claw_description是你自己的src的description名称,比如我的是mybot_description;第二个方面,meshes文件夹是用来装填stl文件的,如果你的mybot_description文件夹里面没有的话,要先自己创建一个在把stl文件放进去(按大佬帖子做到这的第二个问题应该在moveit2阶段解决这个问题了)

别忘了再修改下setup文件,确保我们的源文件可以colcon build进去(这个地方是不是要这么改我忘记了,大家可以自己参考一下或者找找经验贴和GPT)

②gazebo.launch.py问题
来到src/xxx(你用moveit_assistant最后自己创建的文件夹,一般是除了description的另一个),打开gazebo.urdf.xacro文件,确保引用的urdf文件路径正确(跟大佬一起做的可能这地方忘记改)

还有一个点,如果urdf里面和gazebo.launch.py都有gazebo节点的话,需要注释一个,可能会报错(没碰见,GPT说了我就改了)
③launch文件问题
来到gazebo.launch.py文件,这里是最难最容易出问题也是我不是特别明白的地方,大家可以先看一下我的文件
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess, IncludeLaunchDescription, RegisterEventHandler
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.event_handlers import OnProcessExit
from ament_index_python.packages import get_package_share_directory
import xacro
import re
# 去掉URDF文件中的注释,避免xacro解析时出问题
def remove_comments(text):
pattern = r'<!--(.*?)-->'
return re.sub(pattern, '', text, flags=re.DOTALL)
def generate_launch_description():
package_name = 'mybot' # 替换为你的包名
robot_name_in_model = 'six_arm' # Gazebo里实体名称
# 找到URDF模型路径(.xacro文件)
pkg_share = FindPackageShare(package=package_name).find(package_name)
urdf_model_path = os.path.join(pkg_share, 'config', 'gazebo_six_arm.urdf.xacro')
##########################以下为原来的文件内容###########################
###package_name = 'mybot_description' # 替换为你的包名
###robot_name_in_model = 'six_arm' # Gazebo里实体名称
# 找到URDF模型路径(.xacro文件)
###pkg_share = FindPackageShare(package=package_name).find(package_name)
###urdf_model_path = os.path.join(pkg_share, f'urdf/gazebo_six_arm.urdf.xacro')
# 解析xacro文件,生成完整的urdf描述
doc = xacro.parse(open(urdf_model_path))
xacro.process_doc(doc)
params = {'robot_description': remove_comments(doc.toxml())}
# 启动Gazebo,并加载ros插件
gazebo = ExecuteProcess(
cmd=['gazebo', '--verbose','-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],
output='screen')
# 发布robot_description,并根据/joint_states生成tf
node_robot_state_publisher = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'use_sim_time': True}, params, {"publish_frequency":15.0}],
output='screen'
)
# 将urdf实体加载到Gazebo中
spawn_entity = Node(
package='gazebo_ros',
executable='spawn_entity.py',
arguments=['-topic', 'robot_description',
'-entity', f'{robot_name_in_model}'],
output='screen'
)
# 加载joint_state_broadcaster控制器
load_joint_state_controller = ExecuteProcess(
cmd=['ros2', 'control', 'load_controller', '--set-state', 'active',
'joint_state_broadcaster'],
output='screen'
)
# 加载关节轨迹控制器(用来和MoveIt交互)
load_joint_trajectory_controller = ExecuteProcess(
cmd=['ros2', 'control', 'load_controller', '--set-state', 'active',
'my_group_controller'],
output='screen'
)
# 确保加载顺序:实体 -> joint_state -> trajectory_controller
close_evt1 = RegisterEventHandler(
event_handler=OnProcessExit(
target_action=spawn_entity,
on_exit=[load_joint_state_controller],
)
)
close_evt2 = RegisterEventHandler(
event_handler=OnProcessExit(
target_action=load_joint_state_controller,
on_exit=[load_joint_trajectory_controller],
)
)
# 返回整个LaunchDescription
ld = LaunchDescription([
close_evt1,
close_evt2,
gazebo,
node_robot_state_publisher,
spawn_entity,
])
return ld
主要需要修改的地方是下面这几行,没有的话需要加上,而且一定要保证自己的这个路径是正确的,不要盲目复制我的代码,需要自己改成自己的
package_name = 'mybot' # 替换为你的包名
robot_name_in_model = 'six_arm' # Gazebo里实体名称
# 找到URDF模型路径(.xacro文件)
pkg_share = FindPackageShare(package=package_name).find(package_name)
urdf_model_path = os.path.join(pkg_share, 'config', 'gazebo_six_arm.urdf.xacro')
经验贴参考地址:gazebo无法加载带有STL资源的urdf | 鱼香ROS
其中,Benny大佬提到的方法,我用了下没成功,所以又换回了自己的文件,如果有问题的同学可以也试试,可以去上面的经验贴自己再找找。
④package.xml问题
也是上面鱼香ROS论坛中,大佬GHFG-98在评论区提到的

,我感觉是有用的,就按照这个方法也修改了,主要是在description文件夹中的package.xml里面加上下面的代码,同样要改成自己的路径名称,可以参考图片里我的文件夹路径自己写一下自己的:
<gazebo_ros gazebo_model_path = "/home/myRobot/install/mybot_description/share/" />
写在最后
我用完上面的方法改完后,就能成功显示文件了
这个问题卡了我将近一周,今天能解决还是非常开心的,希望上面的经验能帮助到大家
我也是个刚接触ROS/moveit的小白,有错误的地方欢迎各位大佬指出,共同进步
更多推荐

所有评论(0)