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。