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

    gazebo world世界生成多个小车

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    多机器人 ros2 control
    1
    1
    674
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 3
      3634596488
      最后由 编辑

      我想在world中生成两个fishbot小车,并用ros2_control控制。但是现在遇到了一个难题:哪个小车在 return launch.LaunchDescription 函数中编写时靠前,另外一个小车就会被前一个小车的命名空间影响,如下图所示:
      7669b48f-00f5-49bb-acba-8f0d9238ff71-image.png
      上图所示, 我先启动的robot2,后启动的robot1。launch启动代码在下方:

      import launch
      import launch_ros
      from ament_index_python.packages import get_package_share_directory
      import os
      from launch.actions import TimerAction
      
      def generate_launch_description():
          urdf_package_path = get_package_share_directory('fishbot_description')
          default_xacro_path = os.path.join(urdf_package_path,'urdf','fishbot','fishbot.urdf.xacro')
          default_gazebo_world_path = os.path.join(urdf_package_path,'world','custom_room.world')
          default_rviz_config_path = os.path.join(urdf_package_path,'config','display_robot_model.rviz')
          action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
              name='model',default_value=str(default_xacro_path),description="加载的模型文件路径"
          )
          
          substitutions_command_result1 = launch.substitutions.Command(['xacro ',launch.substitutions.LaunchConfiguration('model'),' robotname:=robot1 prefix:=fishbot1'])
          robot_description_value1 = launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result1,value_type=str)
          substitutions_command_result2 = launch.substitutions.Command(['xacro ',launch.substitutions.LaunchConfiguration('model'),' robotname:=robot2 prefix:=fishbot2'])
          robot_description_value2 = launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result2,value_type=str)
      
      
          action_robot_state_publisher1 = launch_ros.actions.Node(
              package='robot_state_publisher',
              executable='robot_state_publisher',
              namespace='robot1',
              parameters=[{'robot_description':robot_description_value1}]
          )
          action_robot_state_publisher2 = launch_ros.actions.Node(
              package='robot_state_publisher',
              executable='robot_state_publisher',
              namespace='robot2',
              parameters=[{'robot_description':robot_description_value2}]
          )
      
      
          #这是启动另外一个launch文件的方法,在这启动gazebo自带的launch文件
          action_launch_gazebo = launch.actions.IncludeLaunchDescription(
              launch.launch_description_sources.PythonLaunchDescriptionSource(
                  [get_package_share_directory('gazebo_ros'),'/launch','/gazebo.launch.py']
              ),
              launch_arguments=[('world',default_gazebo_world_path),('verbose','true')]
          )
      
          action_spawn_entity1 = launch_ros.actions.Node(
              package='gazebo_ros',
              executable='spawn_entity.py',
              namespace="/robot1",
              arguments=['-topic','/robot1/robot_description','-entity','robot1',
              '-x', '1.0',
              '-y', '0.0',
              '-z', '1.0',
              '-Y', '1.57']
          )
          action_spawn_entity2 = launch_ros.actions.Node(
              package='gazebo_ros',
              executable='spawn_entity.py',
              namespace="/robot2",
              arguments=['-topic','/robot2/robot_description','-entity','robot2',
              '-x', '0.0',
              '-y', '0.0',
              '-z', '1.0',
              '-Y', '1.57']
          )
      
          joint_state_broadcaster_spawner1 = launch_ros.actions.Node(
              package="controller_manager",
              executable="spawner",
              name="robot1_joint",
              namespace="robot1",
              arguments=[
                  "fishbot_joint_state_broadcaster",
                  "--controller-manager",
                  "controller_manager"
              ],
              output="screen",
          )
          joint_state_broadcaster_spawner2 = launch_ros.actions.Node(
              package="controller_manager",
              executable="spawner",
              name="robot2_joint",
              namespace="robot2",
              arguments=[
                  "fishbot_joint_state_broadcaster",
                  "--controller-manager",
                  "controller_manager"
              ],
              output="screen",
          )
      
          diff_drive_controller_spawner1 = launch_ros.actions.Node(
              package="controller_manager",
              executable="spawner",
              name="robot1_diff",
              namespace="robot1",
              arguments=[
                  "fishbot_diff_drive_controller",
                  "--controller-manager",
                  "controller_manager"
              ],
              output="screen",
          )
          diff_drive_controller_spawner2 = launch_ros.actions.Node(
              package="controller_manager",
              executable="spawner",
              name="robot2_diff",
              namespace="robot2",
              arguments=[
                  "fishbot_diff_drive_controller",
                  "--controller-manager",
                  "controller_manager"
              ],
              output="screen",
          )
      
          return launch.LaunchDescription([
                      action_declare_arg_mode_path,
                      action_launch_gazebo,
      
                      TimerAction(
                          period=2.0,
                          actions=[
                              action_robot_state_publisher2,
                              action_spawn_entity2,
                          ]
                      ),
      
      
                      TimerAction(
                          period=4.0,
                          actions=[
                              action_robot_state_publisher1,
                              action_spawn_entity1,
                          ]
                      ),
      
              # launch.actions.RegisterEventHandler(
              #     event_handler=launch.event_handlers.OnProcessExit(
              #         target_action=action_spawn_entity1,
              #         on_exit=joint_state_broadcaster_spawner1
              #     )
              # ),
              # launch.actions.RegisterEventHandler(
              #     event_handler=launch.event_handlers.OnProcessExit(
              #         target_action=action_spawn_entity2,
              #         on_exit=joint_state_broadcaster_spawner2
              #     )
              # ),
              # launch.actions.RegisterEventHandler(
              #     event_handler=launch.event_handlers.OnProcessExit(
              #         target_action=joint_state_broadcaster_spawner1,
              #         on_exit=diff_drive_controller_spawner1
              #     )
              # ),
              # launch.actions.RegisterEventHandler(
              #     event_handler=launch.event_handlers.OnProcessExit(
              #         target_action=joint_state_broadcaster_spawner2,
              #         on_exit=diff_drive_controller_spawner2
              #     )
              # ),
          ])
      
      1 条回复 最后回复 回复 引用 0
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS