どうもhataです
今週はロボットのアーム一本をホームポジションに戻す処理の実装をしました。
最初は全てのアームを一斉にホームポジションに戻す処理を実装していたのですが、アームがホームポジションまで移動しても処理が完了したという判定ができず、初期化処理で止まってしまい、ほかの処理ができない状態でした。なので、アーム一本だけをホームポジションに戻す処理を見直して、考え方が誤っていない事を確認してから、全てのアームを一斉に動かすようにしようと考えました。
アームをホームポジションに戻すには
①:アームのサーボモータそれぞれの現在の角度を取得
②:ホームポジションと現在の角度の差を出す
③:②で出した値を、移動する回数で割る
④:③で出した値を、現在の角度に足して、その位置に移動させる
⑤:一定時間待つ
⑥:④、⑤の処理をホームポジションに戻るまで行う。
⑦:処理完了
という順番で処理します。
アームを一斉にホームポジションに戻す時は、この⑥の処理をアームがホームポジションに戻った後も実行され続けたため、全体の処理が完了となりませんでした。そこで、ひとまずアーム一本だけ動かした場合ではどのように動作をするのかを確認しました。すると、想定通りに動いたので考え方は間違っていないことが分かりました。一斉に動かした時の処理と比べると、処理の終了の判定に問題があり、処理が終了するアームとしないアームができるようになっていました。全てのアームに終了判定が出たときに処理全体が終了するようにしていたので、処理が終了せず正しく動作していないことが分かりました。
また、アーム1本での動作確認の中で、サーボモータとの通信で何度か通信エラーが発生しました。通信エラーが発生しているアームに対して、そのままホームポジションへの復帰処理を続けると危険なので、通信エラー発生時の対応処理を実装しました。通信エラーがあったアームは、ホームポジションに戻さず脱力状態にし、LEDを点灯させる事で通信エラーが分かるようにしました。
最後に、アームを一本ずつ順番にホームポジションに戻す動作確認をしました。一本のアームがホームポジションに戻る、あるいは、通信エラーが発生している場合は処理を中断してLEDを点灯させ、次のアームの処理が始まることを確認し、通信エラーが発生していなければ全てのアームがホームポジションに戻る事を確認しました。
来週は、今回実装したものを元にしたアームを一斉にホームポジションに戻す処理の実装と、アームでオブジェを取得する処理の設計と実装をします。