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 から呼び出される度に,速度も更新されます.

一応,これでモーターが動き出したので,それなりに正常に動いているように思えます.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*