ROS 动作服务器无法在 SMACH 状态机中工作:仍在等待动作服务器“/ActionServer”启动...是 运行 吗?

ROS Action Server not working in SMACH state machine: Still waiting for action server '/ActionServer' to start... is it running?

我正在尝试实现一个状态机 (SMACH),它使用 Move Base Flex following this tutorial。 因此,我的状态机(太复杂,无法在此处完整显示)按如下方式进行:

1.状态: 启动所有必要的启动文件包括移动基础 flex - 启动文件 使用子进程:

   ...
   try:
            log4 = open('/home/faps/catkin_ws/src/pathplanning/state_machine/logs/move_base_flex_log.txt', 'w')
            process4 = subprocess.Popen('roslaunch joggingblinde_2dnav move_base_flex.launch',
                                        stdout=log4, stderr=subprocess.STDOUT,
                                        shell=True, preexec_fn=os.setsid)
   except Exception:
            f = open("/home/faps/catkin_ws/src/pathplanning/state_machine/logs/main_log.txt", "a")
            f.write('state: ' + 'launch_service_nodes' + '; error: ' + 'Error in move_base_flex-node.\n')
            f.close()
            os.killpg(os.getpgid(process4.pid), signal.SIGTERM)
            userdata.in_termination_cause[0] = 'error'
            return 'aborted'
   ...

启动文件如下所示:

<launch>
  <!-- Move Base Flex -->
  <master auto="start"/>
  <node pkg="mbf_costmap_nav" type="mbf_costmap_nav" respawn="false" name="move_base_flex" output="screen">
    <param name="tf_timeout" value="1.5"/>
    <param name="planner_max_retries" value="3"/>
    <rosparam file="$(find joggingblinde_2dnav)/config/planners.yaml" command="load" />
    <rosparam file="$(find joggingblinde_2dnav)/config/costmap_common_params.yaml" command="load" ns="global_costmap"/>
    <rosparam file="$(find joggingblinde_2dnav)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find joggingblinde_2dnav)/config/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find joggingblinde_2dnav)/config/local_costmap_params.yaml" command="load" />
  </node>
</launch> 

2。状态: 计算新的目标点并将得到的目标点写入相应的用户数据变量。 (我已经测试过这个:目标点在这个状态之后存在,所以它不是空的。)

3。状态: 调用移动基础 flex 的 get_path 动作,如上面链接教程中所述:

smach.StateMachine.add('GET_GLOBAL_PATH_IN_GOAL_CHECK_SM', 
                       smach_ros.SimpleActionState(
                           '/move_base_flex/get_path',
                           GetPathAction,
                           goal_slots=['target_pose'],
                           result_slots=['path']
                       ),
                       transitions={
                       'succeeded': 'FEEDBACK_IN_GOAL_CHECK_SM',
                       'aborted': 'SECURE_STATE_IN_GOAL_CHECK_SM',
                       'preempted': 'preempted'
                       },
                       remapping={
                       'target_pose': 'test_goal'
                       }
)

当 运行 状态机时,一切正常,直到调用状态 3 引发警告:

'Still waiting for action server '/move_base_flex/get_path' to start... is it running?'

确切的终端输出如下所示:

处理类似错误的大多数问题线程是由于给定的命名空间错误或因为操作服务器不是 运行(显然可以通过 rostopic 列表检查)引起的。

使用 rostopic list 表明,Action Server 是 运行 并且 命名空间是正确的

在 SMACH 中启动时,Move Base Flex 似乎无法正常工作。

问题是动作服务器在加载插件后启动,这意味着当 mbf 在加载插件时卡住,它不会启动动作服务器。

在我的例子中,当在 SMACH 中启动 mbf 时,它无法订阅 costmap-plugin 所需的主题(由于 map-param静态层),因此卡住。

在 SMACH 之外启动 mbf,然后启动 SMACH,但效果非常好。

更多信息请访问相应的issue thread.