Useful tricks/advice

技術公開 part 4.1

学校が忙しくて、なかなかこっちの時間を取れませんでした.... 

そして2015年の中国大会のプログラムやWROで使用したライントレースの記事ではありません... (この辺は基礎の基礎になるのでちゃんと書きたいです)

その他、質問の中に多かったのが「何を使えばいいのか?」にまつわることでした。

なので、この記事ではRCJ、WROで使う色々なものの比較をしていきます。

具体的には、プログラム言語、NXTとEV3、そしてライトセンサーについてです。

(書く前に言いますが、僕はプログラムや回路に関してはあくまでも素人です... 理由付けのようなものがあっても僕の感想程度と思ってください....笑) 

3シリーズにするつもりで全て近日公開します(って言いながらできなかった時はすみません)

プログラム言語:

まず、僕が使ったことあるプログラムで多くのNXT/EV3使用者が使っているのが、Robolab、EV3-G、NXC、RobotC です。

特にNXTとRobolabに関しては長いこと使っていたので詳しく理解しています(←理解っていうかチュートリアルに書いている程度の使い方は分かる)

まずはブロックダイアグラムでプログラムしていく Robolab とEV3-Gについて解説します。

Robolabブロックダイアグラムでプログラムを組んでいくものとしては古いわりに非常にいいと思います。っていうか一番いいと思う。

なにがいいかというと、Cに一番近く、楽に細かい設定ができることです。

Robolab後のプログラムNXT-GやEV3-Gプログラムが簡潔化されていて細かい設定ができません。

一つの例はモーターのコマンドです。

たとえばBモーター、Cモーターを1秒間正回転 したかった時、Robolabではそのまま3つのコマンドを貼り付けます。(B回転、C回転、ウェイト1秒)

しかし、EV3-Gではそれが一つのブロックになっています。

う~ん、書きながら考えると初心者には優しい気がすることもするのですが、僕としては(特にCをやったことある人からすれば)、Robolabのほうがいいです。

他にもいかにLEGO社がEV3-Gを初心者向けに作ったのかがわかる機能が多くあります。逆をいうと、いろいろな場面で使いやすい感じもしますが。

代表的なものとしてモーターのコマンドが純粋なモーター回転ではないことです。

例えば1秒まっすぐでプログラムを試すと、とまる直前少し原則します。これは回転やステアリングでも同じです。

まっすぐ進むとかいうことに関してはモーター同期がかかってやりやすい面もあるのですが、スピーディーなWROとかではそういう設定も自分で入れるか入れないか決めたいところです。(実際、2013のWROを練習しているとき、相方がNXT-Gを使ってプログラムをしましたが、同じハードを使っているのにもかかわらず、そういう同期や謎の組み込みPID制御が原因で調整に苦しめられました)

あとはブロックの形です。

大きい!!

大きすぎます。大きいわりに自由度がないので(すべてくっついてる)元々あるプログラムに新しいものを組み込むっていう意味では非常にやりにくい。時間がないサプライズ対応とかは特に。(あとは一つ一つのブロックのグラフィックが無意味に良いためすぐにプログラムが重くなります。)

なにかEV3-Gの文句を言ってる感じになりましたが、言いたいことは「EV3-Gはガチでロボット競技やってる人にとっては向いてない」ということです。もちろんRobolabも同じですが、EV3-Gよりは自由度があります。

個人的に、もしEV3がRobolabで動かせたなら絶対そうしてました。EV3-Gを使ったのはWRO2015の競技ではモーターが絶対4個必要で、EV3をつかわざるをえなかったから。(ちなみにLabViewは全く別物です。Robolabの進化版みたいに書かれてますが、コンセプトがだいぶ違います。断然RobolabとEV3-Gのほうが似てます。)

WROはC禁止なのでしょうがないですが、ある程度プログラムに慣れてきたらEV3-G、RobolabからCに移行することを強くお勧めします。やっぱりブロックダイアグラムでは限りがあります。


と、いうことで次はC言語のプログラミングソフトウェアを紹介します。

Cは難しいイメージがありますが(難しいですが笑)、NXCやRobotCは簡単です(普通にロボカップで使う分には)

僕が実際にCを使って大会に出場したのは2013年のロボカップが最初でした。(NXC)

さっきも言いましたが、RobolabはNXT-GとかよりもCに似ているのでNXCで初めてプログラムを書いてみてると「あ、これはRobolabのこのコマンドと同じことか!」と思うことが多かったです。

この記事はCのチュートリアルではないので自らの体験はこのへんで笑

あまりこの記事を書いている意味がなくなるかもしれませんが、NXCとRobotC、あまり違いはないです

ではなぜNXCを使っていたの?と聞かれると、「タダだったことと、最初に使ったものだから」と答えるほかありません。

でも、どっちも経験してみてわかったことはRobotCのほうがクオリティーが高いことです。

主な違いは

ダウンロードスピード、サポート、バグ出し、二次元配列が使える

です。特にダウンロードスピードは速いほうが断然いいので笑 サポートに関してもNXCよりいろいろなセンサーに対応しているし、NXCよりも的確なバグ検知ができます。レスキューメイズの選手からしたら二次元配列はうれしいことでしょう(NXCが二次元配列つかえなかったかどうかは正確には忘れました。でも使えなかったような気がします)。

他、プログラムの文法的な部分に関してはあまり変わりません。多少文が変わりますが、そんなのは覚えたらすぐです。

デメリットはRobotCはお金がかかるところでしょうか?($5000/年とかだったような?)

僕も明らかにメリットがあるから使ってみました。具体的には2015年のロボカップ全国後から世界大会の40日くらい前まで。

ただ、なぜか僕が愛用している8角形のジャイロが思うように使えませんでした。なぜかうまくいきません。Mセンサーも試したのですが、MセンサーはI2Cでありながら、ほかのI2Cと共存できないっぽいのでそれも没。

結局世界大会はNXCで挑むことになりました。


と、いうことで僕のプログラム言語の関するコメントでした。

次回はNXTとEV3の比較を行います。(非常に一方的な比較になると思いますが苦笑)
 

RCJ 2016

RCJ2016のルールも発表されましたね!(まだファイナルバージョンではないらしいですが..)

とにかくリンク貼っときます

http://rcj.robocup.org/rescue.html


追記:

ルールをざっと読んでみました

まあ去年がすごいルール変更だったのでまあレスキューラインが去年よりも詳しくなったって感じです。

重要な変更点:

1坂の下をくぐる場合は高さが25cmなければいけない。

2障害物の高さは最低15cm

3交差点の説明が詳しくなった

4ドロップパック→チェックポイントマーカー

5ドロップタイル→チェックポイント

6チェックポイントの得点方法が大きく変わった

まあ競技者の視点からすると一番懸念すべきは交差点ですかね。去年はルールに書かれていた例しか大会には出なかったのですが今年からは例が増えたので

こんな感じです
image


以前関西オープンに出場したときにこういうやつが出題されて「こういうのはあり得ない」と言ってしまいました... すみません
これからは十分可能性としてあるので少ないタイル数で長いコースができそうですね!

もう一つの点はチェックポイントとチェックポイントマーカー(以下はマーカーで統一)の変更点です

まず、マーカーのサイズは固定出なく最大直径7cmになりました(これはあんま関係ないか笑)

重要なのは得点の計算方法です。
チェックポイント到達が
一回目なら通ったタイル×3点
二回目なら通ったタイル×2点
三回目なら通ったタイル×1点
それ以降なら0点

審判の側からするの一気に難易度が上がりました笑 タイルを数えないといけないので笑

競技者側からするとこれは「一気にスタート後にマーカーを置いて得点を稼ぐ作戦」が使えなくなりました笑

これをやられるとどのチームが本当に上手いのかわからない場合も出てきます。これを防ぐために多くのノードやブロック大会では様々なローカルルールは設定されていると思います。

最も合理的な得点方法はまんべんなくマーカーをフィールド上に置くことになりますね(^^)

以上2016年ルールの変更点の解説でした!



技術公開 part 3

現在2015年度のロボットのアルゴリズムなどについての記事を書いているのですが、なかなか終わりません... 笑 (学校も始まったので更新頻度は落ちるかと...)

それまでに、より具体的な質問に返答しようと思います。

〜坂を登る〜 

I. 重心

レスキューで多くのチームを悩ます重心の問題です。

何が問題かというと、坂をどうクリアするかです。特にレスキューラインになると坂がただの邪魔者になったうえ、坂が幾つもあるコースが考えられるのでちゃんとクリアできないと得点が大幅に下がってしまいますね...泣

じゃあ、どうすればいいの?

ベストなロボットは平べったくて重さが均等に広がっているロボットです。

逆に背の高くて高ところに重いものが乗っかっているロボットは坂を乗り越えにくいロボットです。

あきらかに右のロボットの方が安定感がありますね笑(直感的に)

重力の方向とか物理で解決する方法もありますが、(っていうかそれが正統的な方法だと思う)多くのチームは試し試しやっていくのが(僕も含めて)普通だと思います

そういうこともあって、この問題はそれぞれのロボットで違うような問題になってくるのであまり「答え」というのがありません... (なのであまりこの記事を書いている意味がない...)

ただ、共通のことがあるとすれば、

1. 重いものはロボットの一番下に置く
2. ロボットの片側に重いものを置かない

ですね。それぞれの場合で「平べったくて重さが均等に広がっているロボット」 を目指すことが重要です。特にレゴのロボットで見かけるのがEV3/NXTがロボットの高いところの位置されているロボット。

レゴの本体は大きいしモーターもいびつな形をしているし配置は難しいですが、そこはできるだけ考えましょう笑 あきらかにロボットの底部に何も入っていないのに本体がロボットの高いところに位置しているロボットをよく見かけます。

特にNXTやEV3は電池と一体化していこともあってその置き場所でロボットの重心が大きく変わります。

この辺の配置はよくよく考えてロボットを作りましょう。


II. 摩擦

(ここからは、レゴのみの話になります)
摩擦もまた、重心とかと同じく物理的に求められると思うのですが... 結局は試し試しやりますよね笑

僕の経験上、レゴのキャタピラを使うよりバルーンタイヤで四駆にする方がはるかに摩擦が大きく、坂は登りやすいです。なので、その面でいうとバルーンタイヤの四駆をお勧めします。

ただ、バルーンタイヤの四駆は構造的に「しっかり」していないとうまくいかないこともあって、難易度が上がります。その面キャタピラは結構簡単に作れるのでハード面では易しいです。
 
なのでこれもチームによります... 各チームで考えて何がベストか選んでください 


(なにかパッとした記事になりませんでした.... もう少し説明してほしいことがあれば指摘お願いします) 

技術公開 part 2

~ 2014年のライントレースシステム ~

 この記事では2014年まで使っていたライントレースシステムを紹介します。

これが当時に配置です。
13 PM

真ん中2つあるのがNXTのライトセンサーです(NXT1、NXT2と呼びます)。それを挟む形であるのがRCXのライトセンサーです(RCX1、RCX2と呼びます) 。NXTの下にあるのがライトセンサーアレーです(LSAと呼びます)。

では、一つ一つ役割を説明していきます。

NXTのライトセンサーはメインのライントレース用です。この二つの比例制御でメインのライントレースを行っています。比例制御をするためにはラインを1点で見るのではなく面で見る必要があるので、地上から1.2~1.5cm くらいの高さ(正確な値は忘れた)から読んでいます。
→比例制御に関しては過去に書いた記事を参照してください

NXTライトセンサーを使う理由ですが、やはり信用性と安定性です。

今説明しているのはブラジル世界大会の時のライントレースシステムですが、同大会の全国ではメインのライントレースにLSAを使っていて散々なことになりました。

RCXライトセンサーは小さいですが、 色々と遅かったり、もう販売してないこともあってメインに使うのは僕はあまり好まないので。NXTのやつは少し光の環境が違っても、バンプとかにのって高度が変わっても、安定的に使えるのがいいところですね〜


RCX1とRCX2 は直角/交差点のために使っています。NXTライトより手前にあるのは、ライントレースしているときにNXTライトよりも先に直角に反応するためにそうしてます。
どちらでも反応したらすぐにプログラムでそのモードに切り替えます。

(交差点は右優先と考えて...)
手順としては
どちらかが反応すれば前後に少し動いてスキャニング。
RCX1もRCX2も黒を読めばまっすぐいって、メインループに戻る
RCX2(右)が反応すれば、光センサーが反応するまで右に回転。ただし、この場合右優先なので、前方の黒線を読まないように、少し秒数で回転してから光センサーが反応するまでにしてます。
RCX1(左)が反応すれば、光センサーが反応するまで回転。

ただこれだけです。

こうすることで直角と交差点を同じプログラムで攻略できます!

あと残るはLSAです。これでギャップ検索をします。
LSAは8つのライトセンサーで構成されているので真ん中の2つを使ってギャップを検索します。
(ギャップ検索に関してはまた詳しく書きます)¥
 

技術公開 part 1

~ 2015年ルールの避難部屋アルゴリズム ~

特に大したことはしてません笑(と、言ったら嘘になるのですが)

避難部屋アルゴリズムは2013年のときから大体は変わってませんが、レスキュー(特にレゴロボット)の中では標準的なものだと思っています。

とにかく図のように避難部屋の周りを回り続けます。
44 AM

被災者がボールに変わってもこの方法を活用し続けました。

前方にボールがあればアームでつかんで取り込む。ロボットの横に物体があれば(距離センサーが反応したら)そっちを向いてまっすぐ動いてそれが障害物かボールかを検知する。避難場所が見つかれば安全策として常にボールをロボットから落とす動作をする。

このアルゴリズムは簡単でプログラムもしやすいしミスも少ないですが、とにかくハードをうまく作るのが大切です。

まず前方にボールが来たらそれを検知して持ち上げる必要があります。僕は通電でしましたが、なにか距離センサーとかでもいけそうな気はします。ボールが球体であることからこの辺は難しくなってきます。

ちゃんと壁と避難場所を認識するシステムも必要ですね。僕は避難場所が6cmなので6cm以上の場所にメインのバンパーを設置して、その下にもう一つタッチを設置しました。こうすることで、下のやつが反応したら避難場所だということがわかります。(タッチはマイクロスイッチを使用)

あとは、ちゃんと遠くにあるボールを認識するための距離センサーが必要です。僕は標準的な赤外線戦距離センサー(中距離)を使いました(DISTってよばれているやつですね)。ただ、センサー自体がでかいので、力技でセンサーの目の部分(SHAPRセンサー部)を外して地上から4cmくらいのところに設置しました。あまり床に近すぎると誤検知するし、離しすぎるとボールを見ないのでこの辺も面倒くさいです笑。

アルゴリズムっていいながらほとんどハードの話になりました笑(まあそれありきにアルゴリズムなので)

まあアルゴリズムでいうと、常に銀を読んでいたり(絶対に部屋から出ないために)、避難場所のどの 位置にいるかを記憶していたり、距離でミスらないために二度読みしていたりしてます。



~ 自作坂センサー ~

これはまずあまりおすすめしません笑 特にて加工で作るなら余計に

絶対に既製品の加速度センサーや水銀スイッチの方が性能がいいです。

まあ、当時はあまりI2Cの使い方とかよくわからなかったので、自作で行きました。

自作といっても本当に中学生の工作程度です。

ver 1. 
05 AM





















これは2013年のレスキューで地区から世界まで使用しました。アルミに包まれている部分が2つあり、坂にロボットが乗ると重力で傾き接触します。なので通電センサーですね。

ver2.
21 AM












写真がなかったので説明しにくいのですが、磨いた10円がたくさん入った箱です。箱自体が地上と平行になっていないのでもともと坂以外の時では反応しません。坂に乗ると箱がロボットと同じく傾いて、10円が2つの銅板を通電させます。

10円スイッチの方がうまくいった記憶がありますが、これも10回に一回くらいは反応しなかったので結構なクセものでした。いずれは振動とかで反応しますが、坂の下りは早く反応して欲しいので 2014年の全国からは加速度センサーに変更しました。

あー、あと自作の問題として1軸しか読めないのと、登り下りあるので2つ作らなければならないのが面倒です。 


 ~ ジャイロセンサー ~

2015年からジャイロを変えたと指摘がありましたが、変えていません。ずっと赤い8角形のやつです。

正式名称は Absolute-IMU ACG とかでしたんね。日本だったらROBO-PRODUCTとかテクノロジアから購入できます。少し高いです。

センサー自体はジャイロ(3軸)と加速度(3軸)とコンパス(1軸)が入っている上ちっちゃいすごいはずのやつですが....

レスキューではあまり使い物になりません... 特に加速度とコンパスは無能です。2015年の全国では頑張ってこいつの加速度を使いましたが、色々と大変でした。プログラムで多くのフィルターを使って2度読み/3度読みすればなんとか使えるかなっていうレベルです。使えることはつかえますが、楽ではないです。

ジャイロに関してはある程度正確に回転してくれます。

とはいえ、これが正しい方法かどうかはわかりません。なんせ、これを使い出した2014年の世界大会前はジャイロ使うの初めてだったしその原理もよくわかっていなかったので。


プログラムはこんなんです。2015年の世界大会でも使いましたが、2014年に使ったままです。 
   IMU_ReadGyro(SensorPort, Addr, currGyro);
    rotational_speed = (currGyro.gx/100);
    integral += rotational_speed;

 もちろん最初にセンサーの設定とかセンサー起動とかしないといけないですが。

最後のintegral (int です)が角度になります。

絶対値の6000くらいが90だったことは覚えてますがその辺は調整したらすぐにわかります。

でも、性能は低くてMセンサーみたいにずれてもきっちり90度は曲がれません。そもそもレスキューラインでめっちゃ正確な90度はいらないと思っているので... 笑

まあ、ずれはなんとか壁とか使って補正しろってことですね笑



以上、part 1でした。 
livedoor プロフィール
アクセスカウンター

    最新コメント
    記事検索
    Record of robotics X大会結果
    •WRO 2015 Finals in Qatar 2nd Place
    •WRO 2015 世界大会 in カタール 準優勝

    •WRO 2015 Japan First Place for Presentation
    •WRO 2015 全国大会 最優秀プレゼン賞

    •WRO 2015 Japan 1st Place
    •WRO 2015 全国大会 優勝

    •WRO 2015 Kyoto 1st place
    •WRO 2015 京都大会 優勝

    •RCJ Rescue Line Secondary 2015 Finals in China Best Programming
    •ロボカップジュニアレスキューラインセカンダリ 2015 世界大会 in 中国 ベストプログラミング賞

    •RCJ Rescue Line Secondary 2015 Finals in China Individual 1st place
    •ロボカップジュニアレスキューラインセカンダリ 2015 世界大会 in 中国 個人競技 優勝

    •RCJ rescue A secondary 2015 Japan Open Best Presentation Award
    •ロボカップジュニアレスキューAセカンダリ 2015 ジャパンオープン 優秀プレゼンテーション賞受賞

    •RCJ rescue A secondary 2015 Japan Open 1st place
    •ロボカップジュニアレスキューAセカンダリ 2015 ジャパンオープン 優勝

    •RCJ rescue A secondary 2015 Keijina Best Presentation Award
    •ロボカップジュニアレスキューAセカンダリ ベストプレゼンテーション賞受賞

    •RCJ rescue A secondary 2015 Keijina 1st place
    •ロボカップジュニアレスキューAセカンダリ 2015 京滋奈大会 優勝

    •RCJ rescue A secondary 2015 Kyoto 1st place
    •ロボカップジュニアレスキューAセカンダリ 2015 京都大会 優勝

    •WRO 2014 Japan 8th place
    •WRO 2014 全国大会 8位

    •WRO 2014 Kyoto 1st place
    •WRO 2014 京都大会 優勝

    •RCJ rescue A secondary 2014 Finals in Brazil Individual 2nd place
    •ロボカップジュニアレスキューAセカンダリ 2014 世界大会 in ブラジル 個人競技 準優勝

    •RCJ rescue A secondary 2014 National Competition 2nd place
    •ロボカップジュニアレスキューAセカンダリ 2014 日本大会 準優勝

    •RCJ rescue A secondary 2014 Keijina Best Presentation Award
    •ロボカップジュニアレスキューAセカンダリ ベストプレゼンテーション賞受賞

    •RCJ rescue A secondary 2014 Keijina 1st place
    •ロボカップジュニアレスキューAセカンダリ 2014 京滋奈大会 優勝

    •WRO 2013 Finals in Indonesia 2nd Place
    •WRO 2013 世界大会 in インドネシア 準優勝

    •WRO 2013 Japan Second Place for Presentation
    •WRO 2013 全国大会 プレゼンテーション賞第二位

    •WRO 2013 Japan Fourth Place
    •WRO 2013 全国大会 四位

    •WRO 2013 Kansai 1st place
    •WRO 2013 関西大会 優勝

    •RCJ rescue A primary 2013 Finals in The Netherlands Superteam 3rd place
    •ロボカップジュニアレスキューAプライマリ 2013 世界大会 in オランダ スーパーチーム競技 3位

    •RCJ rescue A primary 2013 Finals in The Netherlands Individual 2nd place
    •ロボカップジュニアレスキューAプライマリ 2013 世界大会 in オランダ 個人競技 準優勝

    •RCJ rescue A primary 2013 Japan Open Best Presentation Award
    •ロボカップジュニアレスキューAプライマリ 2013 ジャパンオープン 優秀プレゼンテーション賞受賞

    •RCJ rescue A primary 2013 Japan Open 2nd place
    •ロボカップジュニアレスキューAプライマリ 2013 ジャパンオープン 準優勝

    •RCJ rescue A primary 2013 Keijina Best Presentation Award
    •ロボカップジュニアレスキューAプライマリ ベストプレゼンテーション賞受賞

    •RCJ rescue A primary 2013 Keijina 1st place
    •ロボカップジュニアレスキューAプライマリ 2013 京滋奈大会 優勝

    •WRO 2012 Finals in Kuala Lumpur, Malaysia 10th Place
    •WRO 2012 世界大会 in マレーシア 10位

    •WRO 2012 Japan (national) competition MVP for presentation
    •WRO 2012 全国大会 最優秀プレゼン賞

    •WRO 2012 Japan (national) competition 3rd place
    •WRO 2012 全国大会 第三位

    •WRO 2012 Kansai 2nd place
    •WRO 2012 関西大会 第二位

    •RCJ rescue A primary 2012 Keijina 2nd place
    •ロボカップジュニアレスキューAプライマリ 2012 京滋奈大会 第二位

    •WRO 2011 Kansai 7th place referee's special award
    •WRO 2011 関西大会 7位 & 特別審査員賞

    •RCJ rescue A primary 2011 Japan Open 10th place
    •ロボカップジュニアレスキューAプライマリ 全国大会 10位

    •RCJ rescue A primary 2011 Keijina 2nd place
    •ロボカップジュニアレスキューAプライマリ2011 京滋奈大会 第二位

    •WRO 2010 World In The Philippines 28th place
    •WRO 2010 フィリピン世界大会 28位

    •WRO 2010 Japan 3rd place
    •WRO 2010 全国大会第三位

    •WRO 2010 Kansai 3rd place
    •WRO 2010 関西大会 第三位
    QRコード
    QRコード
    • ライブドアブログ