スタッフブログ

奮闘記【27】ロボットで競技できる ...

2018年12月14日 9:03:45 by fdkltd

どうもhataです

 前回書いていた、オブジェを取った後に「ホームポジションに戻る動作」が想定通りに動かなかった問題が解決しました。

 ホームポジションに戻らなかった原因を調べたところ、グリッパを目標の位置まで直線的に動かそうとしていたことが原因でした。ホームポジションに戻る途中でアームの可動範囲外の姿勢が計算上入り、可動範囲外に出ないようにするリミット処理が働いた結果、アームが動かなくなっていました。

 ホームポジションへ戻る動作はグリッパの動く軌道を気にしなくてもいいので、アームを動かす処理を関節角度を一定の大きさで変化させるものに変更することで解決できました。問題解決が、半日で出来たので、続いてオブジェをコンテナに入れるための処理も実装し、以前作成したコントローラでロボットを移動させるプログラムと合わせて動作確認をしたところ、オブジェの前まで移動して、オブジェを引き抜き、コンテナまで移動してオブジェを入れるまでの動作が出来ました。

 移動と得点の取得が出来るようになりました。競技を行うときはLi-Poバッテリーを使用するので、安全のために電源の状態を表示する必要があります。なので、来週はLCDに、バッテリーの電圧、モータドライバのエラーと、今後の動作チェックがしやすいようにコントローラの押されているボタンを表示できるようにして、ロボコンの競技が出来る状態にします。その後、実際に競技が行える状態にあるのか試運転を行いたいと考えています。

 
 

奮闘記【26】アームでオブジェを取 ...

2018年12月07日 8:43:33 by fdkltd

どうもhataです

 今週は「アームでオブジェを取得する動作」の実装を行いました。 特に「土台に刺さっているオブジェを真っすぐ抜くための動作」の作成に注意して、実装を行いました。

 まず、以前に考えたアームの逆運動学を解いた式を使って、グリッパをホームポジションに対して任意の位置にあるときの各関節の角度を求められるようにしました。そしてオブジェの取得動作を、

①:グリッパを開いて土台に刺さっているオブジェの根本まで移動
②:グリッパを閉じて②の位置から垂直上方向に150㎜移動
③:ホームポジションへ戻る

と分けました。まっすぐ上向きにグリッパを動かす必要があるのは②の動作で、そのほかは目的の位置までの経路は特に意識しなくてよいと考えました。そこで、最初の位置と最後の位置の各関節の角度を求め、関節の角度を同じ大きさで変化させながら動かしたところ円弧を描いて目的の位置に動いてしまいました。

 これはグリッパの位置ではなく、アームの関節を基準に計算した結果そうなってしまいました。そこで、グリッパの位置を最初から最後の位置までの直線上を少しずつずらした位置の各関節の角度を求め、アームを動かすように修正しました。すると、グリッパはまっすぐ上に動くようになりました。

 次に③の動作の確認をしたところ、ホームポジションに戻る途中で止まってしまうことを確認しました。なので、来週はその問題の解決から始めます。

 

奮闘記【25】アームをホームポジシ ...

2018年11月30日 9:12:20 by fdkltd

どうもhataです

今週はロボットのアーム一本をホームポジションに戻す処理の実装をしました。

最初は全てのアームを一斉にホームポジションに戻す処理を実装していたのですが、アームがホームポジションまで移動しても処理が完了したという判定ができず、初期化処理で止まってしまい、ほかの処理ができない状態でした。なので、アーム一本だけをホームポジションに戻す処理を見直して、考え方が誤っていない事を確認してから、全てのアームを一斉に動かすようにしようと考えました。

アームをホームポジションに戻すには

①:アームのサーボモータそれぞれの現在の角度を取得
②:ホームポジションと現在の角度の差を出す
③:②で出した値を、移動する回数で割る
④:③で出した値を、現在の角度に足して、その位置に移動させる
⑤:一定時間待つ
⑥:④、⑤の処理をホームポジションに戻るまで行う。
⑦:処理完了

という順番で処理します。

アームを一斉にホームポジションに戻す時は、この⑥の処理をアームがホームポジションに戻った後も実行され続けたため、全体の処理が完了となりませんでした。そこで、ひとまずアーム一本だけ動かした場合ではどのように動作をするのかを確認しました。すると、想定通りに動いたので考え方は間違っていないことが分かりました。一斉に動かした時の処理と比べると、処理の終了の判定に問題があり、処理が終了するアームとしないアームができるようになっていました。全てのアームに終了判定が出たときに処理全体が終了するようにしていたので、処理が終了せず正しく動作していないことが分かりました。

また、アーム1本での動作確認の中で、サーボモータとの通信で何度か通信エラーが発生しました。通信エラーが発生しているアームに対して、そのままホームポジションへの復帰処理を続けると危険なので、通信エラー発生時の対応処理を実装しました。通信エラーがあったアームは、ホームポジションに戻さず脱力状態にし、LEDを点灯させる事で通信エラーが分かるようにしました。

最後に、アームを一本ずつ順番にホームポジションに戻す動作確認をしました。一本のアームがホームポジションに戻る、あるいは、通信エラーが発生している場合は処理を中断してLEDを点灯させ、次のアームの処理が始まることを確認し、通信エラーが発生していなければ全てのアームがホームポジションに戻る事を確認しました。

来週は、今回実装したものを元にしたアームを一斉にホームポジションに戻す処理の実装と、アームでオブジェを取得する処理の設計と実装をします。

奮闘記【24】 ロボットの移動と操 ...

2018年11月22日 9:08:58 by fdkltd

どうもhataです。

 今週は、平行移動と旋回を合算した各モータの回転速度と回転方向を計算する処理と、操縦の正面位置の切り替えを行う処理の実装と動作確認を行いました。

 先週実装した平行移動を行う処理に、旋回を行う処理を追加しました。しかし、平行移動と旋回の処理のそれぞれで得たモータの回転方向を正転を0、反転を1として加算してしまい、正しく動作しませんでした。平行移動の処理専用の、モータの回転方向の決定をする処理があり、平行移動の処理も作り直す必要があると考えたので、各モータの回転速度と回転方向を計算する処理全体の設計からやり直しました。

 平行移動に使う左スティックの傾きの値に、旋回に使う右スティックの傾きの値を加算して、結果の値が正であればモータの回転方向は正転、負であれば反転、その値の絶対値を回転速度にするという処理の仕方に変更することで、平行移動と旋回が行えるようになりました。スティックから得られる値は(x,y)それぞれの方向の傾きだったのを、上向きを基準とする極座標系に変換して移動方向と移動速度を計算するように変更しました。それに加えて、0番アームのある方向をロボットの基準とすることで、ロボットの操縦のための正面位置が45度ずつ切り替わっても、スティックの方向とロボットの基準からのズレを足し合わせることで、ロボットの移動方向を決められるようになりました。

 ロボットの移動のためのプログラムの実装と動作確認が終わりました。次週からは、アームでオブジェを取得するためのプログラムの設計と実装を行います。

奮闘記【23】ロボットをゲームパッ ...

2018年11月16日 8:59:18 by fdkltd

どうもhataです

今週は、ロボットをゲームパッドの左ジョイスティックで移動、右のジョイスティックのX軸方向の傾きで旋回ができるプログラムの設計と作成を行いました。

今回のロボットはオムニホイールを駆動輪に採用しているので、平面上の任意の方向へ移動が可能です。また、アームが8本あるので、前後方向から90度ずれた位置にある2本のアームでオブジェを獲得後、次のアームでオブジェをとれるようにするために、操作上の前の基準を45度ずつ切り替えることが必要だと考え、それを考慮したプログラムの設計を行いました。

まずは、左スティックでの移動だけについて考えました。ジョイスティックのX、Y軸それぞれの方向の速度成分を極座標系に計算しなおし、左スティックの倒れている方向を角度に変換し、倒れている大きさをスピードとしました。スティックが前に倒れている時を0度とし、ロボットの前方向を決めました。こうすることで、前方向の切り替えが「進行方向の角度+45度×前になるアームの番号」で行うことができます。左スティックでの移動を行うプログラムを実装し、正しく動作することを確認しました。

この後、旋回のプログラムを移動の関数の中に実装しようとしたのですが、正しく動きませんでした。原因としては計算式の間違いであると考えています。来週はこの旋回のプログラムを修正し、前方向切り替えのプログラムの実装をする予定です。

奮闘記【22】 プログラミングの勉強

2018年11月09日 9:11:30 by fdkltd

どうもhataです。

 今週は、八尾ロボコンでゲームパッドを使用するためにゲームパッドの値を取得するサンプルプログラムを改造しました。

 今回はELECOMのJC-U3912TBKというゲームパッドをUSB HostShiled 2.0ライブラリのUSBHIDJoystickというサンプルプログラムを使って動作確認を進めています。以前にこの組み合わせでサンプルプログラムをそのまま動かしたところ、実際の動作と違う状態が表示されることがありました。なので、実際に動かしながらゲームパッドから受信するデータの構造を確認し、それに合わせてプログラムの修正をすると、正しく表示することができました。今週は、その時書き換えたサンプルプログラムを参考にしながら、メインループからゲームパッドの状態を取得することを目指しました。

 メインループからゲームパッドの状態を参照できるように、ゲームパッドの変化を管理するクラスの中で最新の状態を保持するようにしました。こうすることでメインループからゲームパッドの状態を取得して、操作に使えるようになりました。

 なので、確認していなかった「センサの値の距離まで水平に動きオブジェをつかんで真っすぐ持ち上げる」という動作ができるプログラムを書き始めました。その中で、センサが全て異常な動作をしていることが判明したので、次週はこの問題を解決して、プログラムの設計を行います。
 

奮闘記【21】 アーム全体の動作確認

2018年11月01日 13:52:34 by fdkltd

どうもhataです

今週は、アーム全体の動作確認をしました。アームにはグリッパのサーボモータを動かしているPWMサーボドライバと、アームのリンクを動かしているシリアルサーボモータがあるので、まずはグリッパのサーボモータから動作確認を行いました。

グリッパのサーボモータの動作確認をするために、アーム一本のグリッパを順番に「グリッパを閉じる⇒2秒待つ⇒グリッパを開く⇒2秒待つ」という動作をさせました。次に一斉に動かせるかどうかの確認をするために、全てのグリッパが先ほどの確認用の動きをするようにプログラムを書きました。しかし、アームの番号を入力するとサーボモータの番号が分かる計算式を誤ってしまい、最初は正常に動作しませんでした。すぐに間違いに気づいたので計算式の修正を行い、正しく動作することを確認しました。

アームのリンクを動かしているシリアルサーボモータはIDの書きこみが必要だったので、まずはIDの書き込みを行いました。同時に、パラメータの設定、ホームポジションの位置がサーボモータの中立位置に来ているかの確認も行いました。確認終了後、アームが正常に動作できるか確認するために、まずは一本ずつ「2秒かけてホームポジションの位置になる」という動作をさせました。すると、6番目のアームの肘部のサーボモータが動いていなかったので、そのサーボをアームから取り外し、専用のソフトを使ってIDとパラメータの確認をしました。サーボモータに設定されているIDを選択し、パラメータの読み込みを行いましたが読み込むことができなかったので、IDの書き込みを再度行ったところ、パラメータの読み込みができました。IDを違うものに設定していた可能性があると考え、もう一度アームに取り付け、確認動作をさせたところ正常に動きました。その後、すべてのアームが一斉に動作できるかの確認をするために、確認で利用していた動作を全てのアームで行い、正しく動作していることを確認しました。

ロボット本体の動作確認は残り、ゲームパッドの通信確認のみになりました。確認終了後から、本番で利用するプログラムの設計をしていきます。

奮闘記【20】 八尾ロボコンのロボ ...

2018年10月26日 13:52:44 by fdkltd

どうもhataです。

八尾ロボコンで使用するロボットが組みあがったので、今週は電気回路のチェックを行うために、モータドライバと距離センサを動かしました。

まず、モータドライバの動作チェックを行いました。4輪あるので一つずつ動作チェックを行い、2つ不具合があることを確認しました。一つはモータドライバ本体の故障で、もう一つは回路の設計に問題がありました。モータドライバの故障については、新品に交換することで解決できました。回路の設計に問題があるほうは、どこで不具合が起きているか調べるために、マイコン(Arduino MEGA)につながっている全ての部品を取り外して、一つずつ順番に取り付けながら確認をしました。その結果、Arduinoに取り付けているUSBHostShieldで問題が起きているとわかりました。原因はモータドライバを動作させるピンがUSBHostShieldで利用されているため、信号が重なってしまうことでした。なので、モータドライバを動作させることのできる別の接続して解決しました。

次に、距離センサの動作チェックを行いました。まず、センサから100㎜位置に物を置いて距離を測定し、おおよそ近い値が出ていることからきちんと動作しているとわかりました。センサ起動時のアドレスがデフォルトで0x29なので、8個あるセンサから値を取得するために、全てのセンサのアドレスの切り替えも行いました。

次週はシリアルサーボモータとPWMサーボドライバの動作チェックを行う予定です。

奮闘記【19】 ロボットアームの平 ...

2018年10月19日 8:55:34 by fdkltd

どうもhataです

前回までにできなかった計算式が完成したので、ようやくグリッパを目的の位置まで直線的に動かせるようになりました。

肩部のサーボの回転軸の中心から上向き鉛直方向をy軸、その軸からアームのある方向に90°倒した直線をx軸として、アームがホームポジションにある時のセンサの位置を原点として、各部サーボの角度から計算できるグリッパの移動座標を(x,y)とする計算式を作りました。その計算式から逆算して、x,yの値から各部サーボの角度を求める式を作りました。検算のためにExcelの関数を使って任意の位置座標から各部の角度を求められるものを作りました。それを使って角度の求めやすい値を入力して正しく計算で来ている事が分かりました。

次に、マイコンに計算式を実装しました。マイコンの計算式が正しく動作しているかシリアルモニタの計算結果とExcelの計算結果を照らし合わせながら確認作業を行いました。そうすると計算が合わない部分があり、調べてみると変数のサイズが足りていないので計算の途中でオーバーフローを起こし、正しい値になっていないことが分かりました。変数の型が大きいサイズに変更することで解決しました。その後、グリッパ部の座標に値を入力し、目的位置に移動している事を確認しました。

最後にグリッパ部にある距離センサを用いて、ボタンを1回押すごとに値を取得し、その数値分グリッパが直進するというプログラムを制作しました。ロボット本体は先輩がすでに完成させてくれているので、次週は八尾ロボコンで使う本番向けのプログラムの方針の決定と制作を行います。

奮闘記【18】八尾ロボコンに向けて

2018年10月12日 14:57:10 by fdkltd

どうもhataです。

先週、ロボットアームに使っているサーボモータの使い方を勉強して『オブジェを真っすぐ上げる』動作を作成すると書いていましたが、時間がかかっていてまだできていません。なので今週出来たことをまとめます。

まずは、腕部のホームポジション復帰プログラムを書きました。肩・肘に取り付けられているサーボモータは現在角度の取得が行えるので、起動時のサーボモータの角度を取得し、アームがどんな状態であっても約2秒でホームポジションに戻れるようになりました。次にグリッパ部分のサーボモータですが、先週は勉強用に別のサーボモータを利用していたので、本番で使われている物の仕様を調べました。本番用のサーボモータをアームから取り外し、中央位置の確認、左右の動作可能限界の数値を調査しました。その後、ロボットアームのグリッパが閉じた状態のときに、サーボモータが中央位置にくるように取り付けました。

肝心の『オブジェを真っすぐ持ち上げる』動作を作るためには、グリッパを真っすぐに上げる軌道を作る必要があります。腕部のサーボの角度からグリッパの位置を計算する式を立てて、そこから逆にグリッパの位置からサーボの角度を計算する式を立てようとしています。ですが、必要な公式が思い出せずうまくいっていません

数学などの基礎理論が仕事に直結しているのを痛感しました。公式などがすぐに思い出せなくなっているので苦労しています。なので、数学を勉強しなおしてしっかりしたプログラムが書けるように頑張ろうと思ます。

< new12345old >