同步

当编写需要每循环发送一个新命令的反应代码,或是需要使用新的传感器数据时,实现与ALMotion循环同步会有很大帮助。

循环事件(Cycle Events)

  • preProcess事件
  • 传感器数据从内存中刷新
  • 笛卡尔数据被更新并可以使用
  • 插值任务提供其新意图
  • “set”和“change”命令,提供其新意图
  • 意图在模型上被执行
  • 意图被发送至DCM
  • postProcess事件
  • 停止

动作线程使用一个仅低于DCM的实时优先级,并会试着在每个循环中相对于启动时间的时候执行,即启动时间 + CycleNumber x 20毫秒。如果超过了20毫秒,就会停下来,然后从当前时间开始。

使用循环事件

通过一个NAOqi模块(可以由模块生成器生成),您可以访问一个代理程序,并通过它来创建一个与动作的preProcess或postProcess事件的连接。这样,就可以在每个循环的开始或结束时进行一些处理,如获取机器人的当前状态、准备一些命令等。

// Your method that will be called void YourModule::motionPreProcessCallback() { // Do something very small every 20ms. // You are in a realtime thread, so beware. // If you wish to do heavy processing, you should // raise a signal that is consumed by another thread } void YourModule::subscribeMotionPreProcess() { try { // Register the callback // The specialized proxy does not give access // to the underlying module needed for this binding, // so we get a generic proxy from the parent broker getParentBroker()->getProxy("ALMotion")->getModule()->atPreProcess( boost::bind(&YourModule::motionPreProcessCallback,this)); } catch(const AL::ALError& e) { std::cout << "Motion preProcess callback registration failed" << std::endl; } }





Copyright © 2010 Aldebaran-Robotics - 版权所有