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。