OPEN-R SDK デバッグの記録

1.C++に関連したバグの記録

1. 関数の宣言
症状:変数の宣言が重複していると出る。もちろんそんなことはない。
原因:クラスのメンバー関数を定義しているのに、ソースにクラス名を書いてない。
2. 文字列の最後のNULL文字をもらさないように
症状:STLのlistやstackが正常に動作しない。文字列をstring型変数に代入してlistに入れたが、取り出すと化けている。listのサイズが正しくない。参照するとダウンする。
原因:オブジェクト間通信にて文字列の最後のNULL文字を送っていなかった。 あらゆる問題の原因であるし、基本的なことであるがつい忘れてしまう。動作がおかしい時はまず疑おう。
3. 代入演算子と比較演算子を間違えないように
症状:値を初期化しているはずなのに変わらない。値が変わるはずなのに変わらない。
原因:代入「=」と比較「==」を取り違えてしまう。構文的には問題ないので見つかりにくい。比較したい時に代入してしまったり、代入したい時に比較してしまったり、どちらも起こる。思い通りの動きをしないときはここをチェックすること。

2.OPEN-Rに関連したバグの記録

1. メッセージが途切れる
症状:固まってしまう。
原因:メッセージが途切れると動作しない。状態変数を使ってるときには良く注意する。状態変数を変えてもメッセージが途切れれば意味がないので。。
2.RCRegionの使い方に注意
症状:ダウンする。
原因:宣言した範囲外のRCRegionにアクセスするとすぐダウンする。連続モーション再生時のモーション引継ぎ時などは要注意。
3. OCommanDataのフレーム数に注意
症状:プログラムしていない動きをする。(LEDの発光パターンがおかしかった。)
原因:宣言しているフレーム数どおりのデータを入れていない。
4. SetGain はバグを取ってから
症状:ゲインがセットされた途端に急激に関節が動く。(ゲインをセットする前に現在の角度をセットしたにも関わらず)
原因:ロケータの文字列が間違えている。配列宣言時に「,」を忘れている。
5. ダブルバッファについて
注意:RCリージョンが開放されるのはAssertReady発行時。Notify( )中で待っていても開放されない(されたのを検知できない)ので注意。
モーション開始時にSetData SetData NotifyObserver として送る。 SetData NotifyObserver SetData NotifyObserver ではないので注意。
6. モーションがカクカクする
症状:ダブルバッファにしていても動作がカクカクする。
原因:ジョイント角度データの時間遅れが問題と思われる。角度データのフィードバックは動作開始時だけにする。センサーデータのサンプリングサイクルは8ms毎であるが、取得は32ms(4回分を取得)そのため、最悪32ms未満ほど古い情報になっている。そのため、高速で動いている関節にこれを適用すると、戻りが発生して結果としてカクカクした動きとなるようだ。
7. 異常な関節値が返る【リモートプロセッシング】
症状:リモートプロセッシング時に、GetJointValueで関節値が異常な値となる。
原因:OpenPrimitive()が失敗し、不正なロケータIDでアクセスしていたため。RP時にOPEN-R APIを実行する際、アイボと接続を完了していない状態で命令が実行されると失敗する。接続を待って命令を完了するので2回目からは正常な値を返す。OpenPrimitive()で失敗した場合は再トライするようにコーディングすること。また、GetJointValue()の戻り値で取得した値が正常かどうかを判定できるのでここでチェックすればなお良い。