实时闭环控制系统(三)
目的
在理解ros_controller
的源码中。发现joint_trajectory_controller
中存在着一个类型为realtime_tools::RealtimeServerGoalHandle<control_msgs::FollowJointTrajectoryAction>
的类型。感觉这个名字很神奇,因为从名字上面来说它是一个action
的goal
,goal
是action server
的主要管理对象(详细介绍见actionlibDetailedDescription)。然后增加了 Realtime
的字样,所以准备详细看看它的实现。
过程
realtime_tools::RealtimeServerGoalHandle
代码地址 在它的代码里面发现一个名为 void runNonRealtime(const ros::TimerEvent &te)
的函数,感觉这货在joint_trajectory_controller
源码中看见过的。然后在joint_trajectory_controller_impl.h
中发现了下列的程序:
// Setup goal status checking timer
goal_handle_timer_ = controller_nh_.createTimer(action_monitor_period_,
&RealtimeGoalHandle::runNonRealtime,
rt_goal);
goal_handle_timer_.start();
由这里在加上realtime_server_goal_handle
的源码,让我感觉他所谓的实时,实际上只是把publish
的阻塞的部分放在了定时器线程里面,而update
里面的action
部分的操作只是将数据放入到预分配(防止出现malloc
失败(如果锁内存的话)或者系统调用花费时间)的内存里面。