Follow_Line

メニュー画面から「ラボ」を選択します。


「ラボ」メニューから「DIYプログラミング」を選択します。



中央上部にある「Scratch」「Python」の「Scratch」を選択し、+マークを選択して新規プログラムの製作を
始めます。(上記画面では、すでに私が作成中の「Follow_Line」というプログラムが表示されています。)

【ライントレースの仕組み】



ROBOMASTERS1のカメラでラインを認識し、認識に成功した場合はライン座標を基に偏差を求めます。
求めた偏差をPID制御に使用します。
これによりジンバルの先端がラインのある場所に向くので ROBOMASTERS1 はラインの上を走行できる

【Line List のデータ構造】


ライン認識では、1次元配列の「LineList」に認識された各種のデータを格納します。
上図は、「LineList」のデータ構造を図で表したものです。


ライン認識では、ラインの情報を10個の点として LineList に格納します。
添え字は1から始まります。
1番目の要素には点の数を示す「10」が格納されます。
2番目の要素は、ラインの状態を表す [0] ~ [3] の番号が入ります。

 0:ライン無し
 1:直線
 2:分岐(ラインが Y 字に分岐)
 3:交差(2本のラインが交差している)

3番目以降の要素は、「X座標」、「Y座標」、「接線角」、「曲率」の値が続きます。
プログラムでは、これらの情報を使ってライントレースをします。

接線角は、ラインの向きを直線として捉え、その直線の傾きをタンジェントで表した値です。

曲率は、線の曲がり具合を示した値です。ラインが真っすぐだと曲率はセロとなります。
ラインが右に曲がると値はプラスに大きくなり、左に曲がると値はマイナスに大きくなります。

ラインの点の情報は、カメラに近い順番に格納されています。
今回は、一番手前のX座標を取り出します。
そしてX座標とカメラの中心との差を変数「Err」に格納します。
この「Err」の値をPID制御の偏差として使います。
これでPID制御を行い、出力値をジンバルの回転速度に当てはめると、ジンバルがラインに向くようになります。
ジンバル優先モードではシャーシの向きがジンバルの向きと一致するよう自動的に旋回するので、0度方向に進む
だけでラインに近づきます。

【2つの工夫】
ただ、このままでは安定的にライントレースは出来ません。
走行中に急角度なラインを通過しようとするとコースアウトの危険があるからです。
そこで下記のような工夫を取り入れてみましょう。

一つ目の工夫は、ラインがカメラの中心に存在しない場合に、シャーシを停止させる処理です。
シャーシの旋回の時間を増やすことでラインがカメラの中心に来やすい様にします。ラインが中心かどうかは偏差
の絶対値が0.2未満かで判断しています。
これを角度に換算すると、120度X0.2秒=24度、つまり偏差の絶対値が24度未満なら前進するという事になります

二つ目の工夫は、ラインが見つからない場合にシャーシを後退させる処理です。
カメラにラインが写らないのは、大体がカーブで前進しすぎる事が原因なので後退して撮りなおします。
このおかげで急カーブでも走行し続ける事ができます。

初めてのプログラムなので、10点あるライン情報のうち1点しか使用しません。
成功後、徐々にライン数を増やしていきます。


【スクラッチによるプログラミング】

プログラムの一番最初に設定する「移動モード」設定が出来ない。<いきなりNG>


「シャーシ優先モード」以外選択出来ない。
使いたいのは「ジンバル優先モード」、マウスで選択は出来るがレ点マークが移動しない。
マニュアルを見ても書いていない。
ROBOMASTERS1は、スクラッチとPythonの相性が良いので、Pythonと比較しながら進めます。
ただPythonで修正してもスクラッチには反映しない。スクラッチ->Pythonへの一方通行です。

Python で書いてみました。


色々エラーは出ましたがヒューマンエラーで修正後、実行してみましたが結果はNGでした。
動こうとはしていますが、ライン検出せず速度「0」の状態で、ジンバルも下向き15度が不安定。
まだプログラム的に修正を要します。

正常であれば、ステータス表示が
 ジンバルリード  0.1m/s   -15°  0.3°
変数
 LineList              長さ:45
 Err                0.003254

が表示されるはずが


速度が「0」要は停止状態
長さ「0」ライン認識がされていない。
Err が「0」ライン認識がされていないので偏差計算が出来ない状態と考えられる。


一度プログラムを詳細に見てみます。

1行目から3行目は、関数宣言
 pid_Follow_Line、list_LineList、variable_Err の3個を宣言
6行目から8行目は、上記関数のグローバル宣言
10行目:ジンバル優先モードに設定
11行目:シャーシの移動速度を設定(0.1m/s)
12行目:シンバルを下向き15度に向ける
13行目:ラインの識別開始
14行目:ラインの識別色を青に設定
15行目:PIDのパラメーター設定(Kp:100, Ki:0, Kd:10)
17行目:while文(無限ループ開始)
18行目:識別したライン情報を設定
19行目:ライン情報数が42になったら(10Pointすべての情報が入手できたら)
20行目:ラインを検出した場合(ラインリストの2番目の数値が1以上で検出)
21行目:ラインリスト3番目(Point0のX座標値から0.5(中央値)引くと中央ならエラーがゼロとなる)
22行目:エラー値でPID制御を計算する
23行目:計算結果よりジンバルをライン方向に向ける
24行目:エラー値の絶対値が、0.2以下であれば(ほぼ中央)
25行目:中央近傍なので直進する
26行目:ラインから離れているなら(エラー値が、0.2より大きい場合)
27行目:速度停止
28行目:ラインが検出できなければ
29行目:後退する

ライン情報数を通常は10ポイントで「42個」だが、実際は1ポイントのみしか使用していないので個数を
「6以上」としてみたが同様であった。

カメラからの情報入手部分の理解が出来ていないので、ここの理解を深めてから戻ってきます。


【 解決しました。】: メーカーブログラムバグ
メーカー曰く「タッチパネル機能の付いたPCでは、同様の現象が出るので機能が無いPCを使ってほしいとの事で
通常PCで確認して正常動作することを確認できました。
スクラッチでライントレースソフトを作成してみました。<うまく動作しました。>