这个地方卡了很多天了,用了很多方法,不能保证一定是最后用的那个有用,这里做几种可能的方法分享。

我学习的内容为用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的小白,有错误的地方欢迎各位大佬指出,共同进步

Logo

更多推荐