鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    launch文件启动gazebo

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    launch文件启动报错 gazebo launch
    3
    3
    400
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • ls3470319318L
      ls3470319318
      最后由 编辑

      在前期已实现launch打开rviz来可视化模型,后面通过launch启动gazebo来显示模型时,在小鱼代码的基础上,移除了word文件,将urdf文件改为自己的了,由于urdf是通过三维建模软件导出,所以没有xcaro文件。具体报错如下:

      [spawn_entity.py-2] [INFO] [1735219469.610241565] [spawn_entity]: Waiting for entity xml on robot_description
      [ERROR] [robot_state_publisher-1]: process has died [pid 18641, exit code -6, cmd '/opt/ros/humble/lib/robot_state_publisher/robot_state_publisher --ros-args --params-file /tmp/launch_params_xpjnnng3'].
      

      launch文件内容如下:

      import launch
      import launch_ros
      from ament_index_python.packages import get_package_share_directory
      from launch.actions import DeclareLaunchArgument
      from launch_ros.actions import Node
      from launch_ros.parameter_descriptions import ParameterValue
      
      def generate_launch_description():
          # 获取默认路径
          robot_name_in_model = "fishbot"
          urdf_tutorial_path = get_package_share_directory('fishbot_description')
      
          default_model_path = urdf_tutorial_path + '/urdf/fishbot/fishbot.urdf'
      
          # 为 launch 声明参数
          action_declare_arg_mode_path = DeclareLaunchArgument(
              name='model', default_value=default_model_path,
              description='URDF 的绝对路径'
          )
      
          # 直接使用文件路径作为参数
          robot_description = default_model_path
      
          robot_state_publisher_node = Node(
              package='robot_state_publisher',
              executable='robot_state_publisher',
              parameters=[{'robot_description': robot_description}]
          )
      
          # 请求 Gazebo 加载机器人
          spawn_entity_node = Node(
              package='gazebo_ros',
              executable='spawn_entity.py',
              arguments=['-topic', 'robot_description', '-entity', robot_name_in_model]
          )
      
          return launch.LaunchDescription([
              action_declare_arg_mode_path,
              robot_state_publisher_node,
              spawn_entity_node,
          ])
      
      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        从你提供的错误信息和launch文件内容来看,存在几个可能的问题和解决方案:

        1. 机器人描述参数传递问题:

          • robot_state_publisher 节点在启动时未能正确接收到 robot_description 参数,这通常是因为参数格式或传递方式不正确。
          • 你的代码中直接将文件路径作为参数值传递给了 robot_state_publisher,但正确的做法应该是将URDF文件的内容作为字符串参数传递。你可以通过读取URDF文件内容来实现这一点。
        2. spawn_entity.py 节点等待问题:

          • spawn_entity.py 节点正在等待 robot_description 主题上的实体XML数据,但由于 robot_state_publisher 节点未能正确启动,因此可能没有发布任何数据。
        3. 修改后的URDF文件问题:

          • 确保你的URDF文件没有语法错误,并且所有必要的链接和关节都已正确定义。

        下面是一些修改建议:

        修改URDF文件读取方式

        你可以修改 robot_state_publisher_node 的参数传递方式,通过读取URDF文件的内容来传递参数:

        import os
        
        def read_urdf_file(file_path):
            with open(file_path, 'r') as file:
                return file.read()
        
        def generate_launch_description():
            # 获取默认路径
            robot_name_in_model = "fishbot"
            urdf_tutorial_path = get_package_share_directory('fishbot_description')
            default_model_path = os.path.join(urdf_tutorial_path, 'urdf', 'fishbot', 'fishbot.urdf')
        
            # 为 launch 声明参数
            action_declare_arg_mode_path = DeclareLaunchArgument(
                name='model', default_value=default_model_path,
                description='URDF 的绝对路径'
            )
        
            # 读取URDF文件内容
            robot_description_content = read_urdf_file(default_model_path)
            robot_description_param = ParameterValue(value=robot_description_content)
        
            robot_state_publisher_node = Node(
                package='robot_state_publisher',
                executable='robot_state_publisher',
                parameters=[{'robot_description': robot_description_param}]
            )
        
            # 请求 Gazebo 加载机器人
            spawn_entity_node = Node(
                package='gazebo_ros',
                executable='spawn_entity.py',
                arguments=['-topic', 'robot_description', '-entity', robot_name_in_model]
            )
        
            return launch.LaunchDescription([
                action_declare_arg_mode_path,
                robot_state_publisher_node,
                spawn_entity_node,
            ])
        

        确保URDF文件正确

        • 确保URDF文件没有语法错误。
        • 使用 urdf_to_graphiz 工具(如果可用)来可视化URDF文件,确保所有关节和链接都被正确解析。

        检查Gazebo和ROS的兼容性

        • 确保你使用的Gazebo版本与ROS版本兼容。
        • 确保所有必要的插件和包都已正确安装。

        通过这些修改,你的launch文件应该能更好地处理URDF文件,并成功启动 robot_state_publisher 和 spawn_entity.py 节点。如果问题仍然存在,请检查ROS和Gazebo的日志文件以获取更多信息。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @ls3470319318
          最后由 编辑

          @ls3470319318 在 launch文件启动gazebo 中说:

          [ERROR] [robot_state_publisher-1]: process has died [pid 18641, exit code -6, cmd '/opt/ros/humble/lib/robot_state_publisher/robot_state_publisher --ros-args --params-file /tmp/launch_params_xpjnnng3'].

          参数文件看起来不太对,你把完整的报错拿出来,另外尽量抄一下书上的代码

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          1 条回复 最后回复 回复 引用 0
          • 第一个帖子
            最后一个帖子
          皖ICP备16016415号-7
          Powered by NodeBB | 鱼香ROS