Ros

dynamic_reconfigure

dynamic_reconfigure机制可分为两个功能。

  • 初始化时得到各个param参数。
  • 运行时实时修改参数。

rose_ros支持第一个功能,不再支持第二个。

dynamic_reconfigure涉及逻辑比较繁琐,在使用上须注意,否则会造成问题。

<moveit_ros>/manipulation/pick_place/src/approach_and_translate_stage.cpp
------
ApproachAndTranslateStage::ApproachAndTranslateStage(
    const planning_scene::PlanningSceneConstPtr& scene,
    const collision_detection::AllowedCollisionMatrixConstPtr& collision_matrix)
  : ManipulationStage("approach & translate"), planning_scene_(scene), collision_matrix_(collision_matrix)
{
  const bool use_dynamic_reconfigure = false;
  if (use_dynamic_reconfigure) {
    max_goal_count_ = GetGlobalPickPlaceParams().max_goal_count_;
    max_fail_ = GetGlobalPickPlaceParams().max_fail_;
    max_step_ = GetGlobalPickPlaceParams().max_step_;
    jump_factor_ = GetGlobalPickPlaceParams().jump_factor_;
  } else {
    ros::NodeHandle nh("~/pick_place");
    max_goal_count_ = nh.param("max_attempted_states_per_pose", 5);
    max_fail_ = nh.param("max_consecutive_fail_attempts", 3);
    max_step_ = nh.param("cartesian_motion_step_size", 0.02);
    jump_factor_ = nh.param("jump_factor", 2.0);
  }
}

若use_dynamic_reconfigure=true,那是官方在用的dynamic_reconfigure机制获取参数,这会造成很难查的问题。launcher.exe执行完main后,系统要清除其它全局变量,中间要结束数个线程,像ROSOutAppender的ROSOutAppenderThread。结束线程要调用chromium的PlatformThread::Join,居然发生没等到线程函数Thread::ThreadMain()退出,WaitForSingleObject就返回了,而且还返回的是WAIT_OBJECT_0

void PlatformThread::Join(PlatformThreadHandle thread_handle) {
  ...
  // Wait for the thread to exit.  It should already have terminated but make
  // sure this assumption is valid.
  CHECK_EQ(WAIT_OBJECT_0,
           WaitForSingleObject(thread_handle.platform_handle(), INFINITE));

出问题时,没等到线程函数Thread::ThreadMain()退出,WaitForSingleObject就返回了,而且还返回的是WAIT_OBJECT_0。

  CloseHandle(thread_handle.platform_handle());
}

一开始以为是在结束ROSOutAppenderThread线程时,系统中还有存在dynamic_reconfigure::server,于是增加了ros::dynamic_reconfigure_servers()。结果发现出问题时,该值已经是0了,即系统中已没有dynamic_reconfigure::server。——没找到这问题根源,等将来有时间再细查。对ApproachAndTranslateStage,先改为不用dynamic_reconfigure。

 

全部评论: 0

    写评论: