RoboCup2019Sydneyに参加することになりました

久しぶりの投稿になりますね

pallasの地面。(元南雲)です。

先週の水曜日(6/19)に突然メンターの先生からこんなメールが

 

>pallas,推薦きました!!至急返信願います!!

 

....

.......

........ファッ!!!????

6月の頭がちょうど大会1ヶ月前でそれ過ぎたらもう追加推薦なんてこないだろうと思ってたんです。

それでそろそろ相方とこれからどうしようかなんて話を始めようかなぁなんて考えてた矢先飛んできた突然の推薦。

2週間前ってヤバくない??国際大会だよ????

なんて混乱しつつ相方と電話して推薦をもらうことにしました。

 

いろいろ間に合う気がしませんでしたが全力でやろうと決めました。

大会期間中のことなんてのもできたら記事にできたらなぁと思います。

 

応援よろしくおねがいします!!

マッピング、とか

ソフトウェアの概要のところで丸投げしたマッピングと移動方向判断についてのことを書いていきます。(マッピングのことはまだです(殴))

 ソフトウェア概要のところで書いたように、pallasのロボットは進行方向の判断材料に”各タイルの通った回数”と”優先して進む方向”を用意し、それらを使って拡張右手法を使った探索をしています。

”優先して進む方向”はあらかじめ右→前→左の順に優先して進む、とプログラムに書いて置けるのですが、”各タイルの通った回数”はロボットが移動するごとに変わるのであらかじめ書いておきようがありません。

そのためロボットは移動するときに ”各タイルの通った回数”を記録し、必要なときに読み出して比較したりしています。
"各タイルの通った回数"はそのタイルの座標と紐付いていないといけないので、座標と"各タイルの通った回数"を一緒に保存します。
また、ちょっとした嬉しいこと*1があるのでpallasでは床の色(白/銀/黒)も同時に保存しています。

実装は適当に

struct node{
  short x,y; //座標
  short count; //何回通ったか
  char tilecolor; //タイルの色
};

node nodeArr[100];

こんな感じで。
一つ一つのタイル(ノード)情報を構造体にまとめてそれを一次元配列で大量に用意します。(1回の競技で100タイル以上の広さなんてないよね.....??)

ロボットは移動する前に、次に移動可能なタイルのノードがすでに作成されてるかを検索し、もしすでに作成されていた(つまり通ったことがある)ならばそこの通った回数を比較し、移動方向を決定します。

移動方向決定はこんな感じ

task read_judge(){

  Wall_L=getWall(LEFT);
  Wall_C=getWall(CENTER);
  Wall_R=getWall(RIGHT);
  underColor=getUnderColor(LightSensor);


  if(us_l<=Thre){//壁のあるなし判定
      leftNode=255;//〇〇Nodeはその方向のノードの通った回数を入れる変数。
  }//実際の壁があれば255を入れる
  else{
      leftNode=searchNode(IsNewNode,sL)://この関数は指定した方向の
  }//ノードの通った回数を返す

  if(us_c<=Thre){
      centerNode=255;
  }
  else{
      centerNode=searchNode(IsNewNode,sC):
  }

  if(us_r<=Thre){
      rightNode=255;
  }
  else{
      rightNode=searchNode(IsNewNode,sR):
  }
  if(underColor==SILVER){//チェックポイントの処理
      //checkPoint
  }
  else if(underColor==BLACK){//黒タイル。そのままバック
      moveAngle=GOBACK;//go back
  }
  else if(rightNode==255 && centerNode==255 && leftNode==255){//行き止まり
      moveAngle=GORETURN;//turn around//クルッと回って引き返す
  }
  else if(rightNode<=centerNode){//右のノードのほうが通った回数が少ない
      moveAngle=GORIGHT;//go right
      }
      putInZahyo(robot1);//現在位置更新用関数
  }
  else if(centerNode<=leftNode){
      moveAngle=GOFWD;//go fwd
      putInZahyo(robot1);
  }
  else{
      moveAngle=GOLEFT;//go left
  }

}


雑なプログラム&怪しい英語はお許しください

こんな感じで実装することで、最も通った回数の少ない方向へ進む&右を優先する動きになります。


補足 : 拡張右手法を使う理由
 
ただの右手法だとこの図のように赤く表示したタイルを通ることができません。
そうするともしこの赤タイルのところに被災者がいると発見できないため、拡張右手法を使います。

拡張右手法だと下図のように赤タイルも通ることが出来るので全探索をすることができます。
この図のマップでは緑のタイルでの動きがポイントになっています。
一回目に通るとき(赤矢印)は普通に右に沿って進みますが、二回目(青矢印)は進行方向に対して右と正面を一度通っているため左に曲がります。
そして三回目は左右正面どれも一度通っているため右を優先して進む動きになっています。



質問は僕のツイッターかコメント欄までお気軽にどうぞ~

*1:同じ黒タイルに二度突っ込まずにすむ

ソフトについて

はい、ソフトについてです。 pallasでは3つの言語を使用してプログラムを組んでいます。

です。

プログラムの流れをざっくり書くと

  1. 初期化
  2. センサー値取得
  3. 移動方向判断
  4. マッピング等の処理
  5. 移動
  6. 2へ戻る

といった感じです。

また、これと並行して

・進行停止ボタンが押されたか

を常に監視するタスクを走らせています。

 

1. 初期化

文字通り初期化です。Arduinoとの通信やセンサーなどの初期化、調整をしてメインタスクスタートのボタンが押されるのを待機します。

 

2.  センサー値取得

これもまたそのまま。

移動方向の判断に使う超音波、光センサーの値を変数に読み込みます。

 

3.  移動方向判断

これもまた読んで字のごとく、です。

移動方向判断には拡張右手法、と言う方法を採用しています。

この方法は「最も通った回数の少ないタイルへ進み、進むことができる方向に2つ以上同じ回数通ったタイルがあるならば右→前→左の順に優先して動く」という方法になります。

これについて解説するのは長くなるので分けます。

書きました

nagumo-s-note.hatenablog.com

 

4.  マッピング等の処理

そのまま。

長くなりそうなのでこれも3と一緒に説明します

 

5.  移動方向判定のところから変数を使ってどの報告へ移動するかが指示されるので、それに従い移動します。

 

 

ハードについて

さて、ハード概要です。

 

この記事はとりあえず2018/12/23時点でのことを書いていきます。(今ほとんどばらして大改造中です。今のロボットが見せられるようになったら少しずつ追加していきます)

 

ハード構成です

 

メインマイコン:LEGO MindStormNXT

サブマイコン:Arduino Nano

センサー

  • 光センサー(LEGO)
  • 加速度/角加速度センサー(XGL1300L)
  • 超音波センサー*5(HC-SR04)
  • 温度センサー*2(TPA-81)
  • タッチセンサー*2(そのへんに転がってたマイクロスイッチ)
  • マイコン付きカメラモジュール*2(OpenMV M7)

駆動系

  • タイヤ駆動用モーター*2(NXTモーター)
  • レスキューキット放出用モーター(SG90)
  • 被災者発見通知用LED(そのへんに(以下略))

本体の素材

  • 車体 : LEGO
  • レスキューキット放出機構 : 3Dプリンタのやつ(素材はよくわからない)

となっております。

接続図?的なのはこちら

f:id:k-nagumo:20190123231335p:plain

プレゼンポスターに貼り付けるために作ったやつをそのまま。(適当)

 

こんな感じです。

<余談>

これを見てよく言われること

「えっ、まだNXT使ってるの?EV3にしないの?」

「NXT.....ぷぷっ....骨董品.....ぷぷぷ....」

うるせぇ!!!

いや、知ってます。EV3のほうがいろいろ能力高いの知ってますよ。

NXTモーターも使い始めてもう5年立ちますよ。今にも死にそうなんですよ。

でもいまさら変えられないしプログラミング言語も変えなきゃならんし大変だし、なによりもNXTに愛着があるので変えません。

<余談終わり>

 

NXTでは繋げられるセンサーの数が足りなかったり処理も大変になってしまうので、半分くらいArduinoに分担させてます。これについては後日記事を.....

と、ハード概要でした。

 

機体本体について→(未作成)

回路/通信について→(未作成)

 

 

僕らのチームpallasについて

pallasは現在関東ブロックに所属し、Rescue Maze (旧rescue B)に挑戦する2人組チームです

 

南雲

  • チームリーダー
  • 機体設計/作成
  • 回路設計/作成
  • メインプログラム作成
  • サブプログラム作成

T

  • 3D造形担当
  • カメラモジュールプログラム作成
  • その他工作系

 

といった感じの役割分担です。

 

pallasは2018年の4月頃に僕、南雲がMazeをやってみたくて始めてみました。

たしか8月頃までは一人で設計/作成を続けていたのですが、大会まで間に合わないしそもそも1人じゃあ出場できねぇじゃん!

と必死で参加してくれる人を探したところTさんが名乗り出てくれてそこから本格的に活動をはじめました。(本当はもう少し複雑なスタートだった)

 

現在(2019/1/23)は関東ブロック大会で2位でジャパンオープンに行けるか微妙なラインですが、来年も出るつもりなのでちょっとずつロボットは進化させています。

 

pallasの由来

pallasはギリシャ神話に出てくる戦略や知恵の神、Ἀθηνᾶ(アテナ)の別名で、チーム2人で知恵を出し合い、戦略を練って勝利をつかめるように、と名付けました。

別名なのはなんかそのままの名前だと単純だなぁと思ってそうしました。