实时闭环控制系统(三)

目的

在理解ros_controller的源码中。发现joint_trajectory_controller 中存在着一个类型为realtime_tools::RealtimeServerGoalHandle<control_msgs::FollowJointTrajectoryAction>的类型。感觉这个名字很神奇,因为从名字上面来说它是一个actiongoalgoalaction 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失败(如果锁内存的话)或者系统调用花费时间)的内存里面。