Re: The history of "M&Y"

Team "M&Y" and "花鳥風月"
the soliloquy of the father
毎日更新!

New Rescue Simulation を動かしてみる・・・その7

2020-09-18 | RoboCup2020

前の記事はこちら New Rescue Simulation を動かしてみる・・・その6

 

さて・・・このシリーズも7回目・・・(まあ、誰も期待していないと思いますが・・・笑)

今回は、フィールドを一周する(一周できる)プログラムを目指します。

これまでで、右手法のプログラムを作りましたが・・・右の壁(通常は外周ですね)を伝って進むと、黒のタイル(落とし穴)があり、必ずそこに落ちて・・・競技進行停止(Lack of Progress )になり、スタート地点に逆戻りです。

ですので、今回は黒のタイルを判断して、落とし穴に落ちないように回避します。(さて、できますか!?)

 

New Rescue Simulation のロボットには、被災者を発見するためのカメラが3台搭載されています。さらに、床の色を判断するためのカメラが1台搭載されています。(合計4台のカメラって、贅沢ですね!)

今回は、この床の色を判断するカメラを使います。

解説は Tutorial 2: Sensing & Victim Detection にあります。

Content Summary に Using the colour camera to identify swamp and trap areas と書かれています。

Exemplar Code のところに、サンプルのプログラムが掲載されていますが・・・code2.py は古いプラットフォーム用なので、現在の最新のプラットフォーム(release 6)では動作しません。最新のプラットフォームで試すのは、code2_webinar_updated.py の方を試しましょう。

(ただ、この code2_webinar_updated.py も、Tutorial 1のサンプルプログラムをベースに作成されているのでランダム走行です。まあ、今回は、あまり関係ないですが・・・)

このサンプルプログラム(code2.py)は・・・「黒のタイルを判断して、そこに入らないようにする」→ はい、これは正しいですね。 しかし、なぜか、沼地(swamp)にも入らないようになっています。 謎です!? 沼地は入ってはいけない場所ではなく、単にスピードが遅くなるだけです。 確かに入りたくない気持ちはありますが・・・沼地の先に被災者やチェックポイントがあって、通り過ぎないと得点できないかもしれません。 先がどうなっているかわからないので、行くしかないと思うのですが・・・

 

話が、ズレました。

Tutorial 2 に Stepping through the code にサンプルプログラム(code2.py)についての解説があります。

この中から、床の色の判断に関するところを取り出します。

In this world we are now dealing with black trap holes and brown swamps. To aid detection later we are going to define the colour of these. We do this by converting the color in the binary value, using the b'color' format. Here we are assuming that the hole and swamp colour is a particular RGB value. You may want to make sure that this is the case so the robot does in fact detect them. To do so, run the calibration code in order to print out on the console what values the colour camera is sensing once the robot is above these tiles.

hole_colour = b'\x1e\x1e\x1e\xff'
swamp_colour = b'R\x89\xa7\xff'

色のバイナリ値を定義しましょう・・・黒の色はコレ、沼地の色はコレ、これらの色を検知したら、入るのをやめよう・・・はい、なんとなく正しいのですが、これに大きくはまりました。

まず、床の色のキャリブレーションをするために、calibrateColourSensor.py を実行します。それから、プラットフォームの Tools → Console を指定すると、フィールドの下にテキストが表示されるコンソールの領域が表示されます。これで、ロボットを移動すれば、そのロボットのカメラが検知した色情報がコンソールに表示されます。

これを、いろいろな場所で実施して、カメラが検知した色情報を記録します。

 

で・・・まず、何もせずに code2_webinar_updated.py を動かしてみます・・・

何もしないと、フィールド内の同じところをグルグル回ってループするので、適当に止めて、手で移動して・・・黒タイルの手前に置いてみます。

すると、ロボットが上に向かって黒タイルに入ると、ちゃんと回避できるのに、下向きに黒タイルに入ると(回避せずに)そのまま穴に落ちることがわかりました。(なんで?)

いろいろ試すと、右向きは回避OKでも、左向きではやっぱり穴に落ちます。

 

原因を追究するために、calibrateColourSensor.py で、上向き、下向き、左向き、右向き・・・いろいろな向きで黒タイルに近づけてみて、床の色情報を記録しました。

すると・・・HSVの値は同じでも、バイナリ値が微妙に違うことがわかりました。

つまり、同じ黒のタイルでも、入る向きによって、ロボットのカメラが検知する色が複数あることがわかりました。

ということで、バイナリ値で判断するのは良くないようです。

知恵袋のU君に相談したら、やっぱり「バイナリ値は光の当たり方によっても幅があるので、HSVの値の方の範囲で検知したほうが良い」との回答を得ました。

 

ということで、Tutorial 2 の床の色の検知のプログラムはあまり参考になりません。(キッパリ!)

 

じゃあ、何を、どうすれば良いのか・・・一時はあきらめかけましたが・・・HSVの判定方法の例を見つけました。

ExamplePlayerController_updated.py

の中に、avoidTilesHSV() という定義があり、(このプログラムの中では使われていませんが)沼地と黒タイルをHSVで判断していました。

avoidTiles() の代わりに、avoidTilesHSV() を使用したら、黒タイルを的確に判断するようになりました。

 

これで、私が作った右手法の単純なプログラムに黒タイルの判断を組み込んで・・・(落とし穴に落ちずに)フィールドを一周する(できる)プログラムができました。

長かった・・・(うれし涙)

 

プログラム全文を載せるのもナニなので、床の色を判断するカメラ関係の部分だけ・・・

宣言

# Declare colour sensor underneith the robot
colour_camera = robot.getCamera("colour_sensor")
colour_camera.enable(timeStep)

 

メインループ内

        # Avoid if any tiles are detected
        colour = colour_camera.getImage()
        img = np.array(np.frombuffer(colour, np.uint8).reshape((colour_camera.getHeight(),colour_camera.getWidth(), 4)))
        img[:,:,2] = np.zeros([img.shape[0], img.shape[1]])
        hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)[0][0]
        if (hsv[2] < 35):
            speeds[0] = -0.4 * max_velocity
            speeds[1] = 0.6 * max_velocity
            startTime = robot.getTime()
            duration = 0.7

 

New Rescue Simulation の GenerateMap.py が作成するフィールドは、スカスカの迷路が多いので、右手法だと「ただ外周を一周」を繰り返す感じですが・・・例えば、こんなフィールドでは、ほとんどの場所を巡ることができます。

 

さあ、次は被災者の発見か・・・!?

 

続きの記事はこちら New Rescue Simulation を動かしてみる・・・その8

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする