fawkes-robotino.2016で,robotino 3を動かすために.
恥ずかしながら,BabyTigers-Rは,2016年世界大会では,一歩もロボットが動かないまま試合を終えました.
原因は,Fawkes への移行に失敗したからです.
そして,一年経ち,2016年版Fawkes-robotino がリリースされましたが,未だにロボットは動きませんでした.
特に,2016年版は,Robotino 3を動かすのにOpenRobotinoAPI を使わずに,直接制御する方式(Direct)に変わっていました.
それ故,OpenRobotinoAPI 経由での動かし方のヒントが得られない状態になっています.
~/fawkes-robotino/cfg/conf.d/robotino.yaml の以下を変更する必要があります.
# driver: direct driver: openrobotino
で,実際に実行してみると,laptop側では,
18:30:00.723777 CLIPS (agent): ***** Enabling motor *****
となり,Robotino 側でも,
10:31:10.245522 RobotinoActThread: Enabling motor on request
と受け取っていて,モーターを動かそうとしているんですよね.
上記は,~/fawkes-robotino/fawkes/src/plugins/robotino/act_thread.cpp で扱っており,
RobotinoActThread::loop() の中で,判定しています.
des_vx_ = des_vy_ = des_omega_ = 0.; set_des_vel = true;
上記で速度を0にして,設定反映のフラグを立てています.
そのフラグを元に,以下のように,comのset_desired_velへと引き渡しています.
if (set_des_vel) com_->set_desired_vel(des_vx_, des_vy_, des_omega_);
ちなみに,このdes_vx_の値を0以外に設定しても,モーターは動いてくれませんでした.
おかしいですね.
ここで設定された速度com_thread.cpp のupdate_velocities() にて,更新されます.
さて,update_velocities で検索してみましょう.
robotino@robotino-base1:~/fawkes-robotino/fawkes/src/plugins/robotino$ grep update_velocities * com_thread.cpp:RobotinoComThread::update_velocities() com_thread.h: bool update_velocities(); direct_com_thread.cpp: if (update_velocities()) drive();
んっ.
update_velocities() を呼び出しているのが,direct駆動の方にしかありません!
というわけで,openrobotino_com_thread.cpp に以下を追加しましょう.
void OpenRobotinoComThread::process_api_v2() { #ifdef HAVE_OPENROBOTINO_API_2 com_->processComEvents(); update_velocities();
これで,loop から呼び出される度に,速度も更新されます.
一応,これでモーターが動き出したので,それなりに正常に動いているように思えます.
コメントを残す