ETロボットにおける制御-まいまい式-
ライントレースを行う際に、重要なのは外乱光への対応です。
照明の当たりかたなどによって、光センサから取得される
黒線の明るさや白の明るさが、コース上で大きく異なることもよくあります。
さらに、コース上にできるロボット自身の影によっても光センサから取得される値が
変わります。
ライントレースを行う際には閾値を利用してライン上の黒線と白地を認識しているのですが、
外乱光によって取得される光センサの値が変わってしまうと、
この白と黒の認識がうまく行えなくなります。
外乱光に対応するために、まいまい式というのが提案されています。
まいまい式に関しては以下のブログが詳しいです。
すねいる ETロボコン日記
http://www.chihayafuru.jp/etrobo/?p=1349
さらに、まいまい式のサンプルコードも公開されています。
http://www.chihayafuru.jp/etrobo/?p=1326
このサンプルコードを参考に、TECS上でまいまい式を実装しました。
20ms周期で光センサに搭載されているLEDのon/offを繰り返して、LEDオン時の光センサの値とLEDオフ時の光センサの差分を利用しています。
今回、10ms周期で動く、ライントレースを行うタスク(tLinetracerTaskBody.c)上に実装しました。
以下がそのサンプルコードです。
if(count%4==0){
//LEDon時の光センサの値を取得
cLightSensor_getValue(&lightUpperd);
cLightSensorControl_off();
}else if(count%4==2){
//LEDoff時の光センサの値を取得
cLightSensor_getValue(&lightDowned);
cLightSensorControl_on();
}
if(lightUpperd != 0 && lightDowned != 0){
light = VAR_lightThreshold;
if(lightDowned - lightUpperd > 0){
lightDiff = lightDowned - lightUpperd;
}else{
lightDiff = 0;
}
k = (1.0382e-3 * lightDowned - 6.3295e-1) * lightDowned + 1.1024e+2;
//LEDon時を基準に補正
brightness = (float32_t)200 + (float32_t)(lightUpperd - lightDiff * 450 / k);
light=(uint16_t)(brightness);
}
count++;
TECS上で光センサのLEDをオン/オフ操作は、
cLightSensorControl_off();
cLightSensorControl_on();
で出来ます。
タスクが一度立ち上がるたびにcountを加算し、その値を4で割ったあまりを使って
ライントレースを行う際には閾値を利用してライン上の黒線と白地を認識しているのですが、
外乱光によって取得される光センサの値が変わってしまうと、
この白と黒の認識がうまく行えなくなります。
外乱光に対応するために、まいまい式というのが提案されています。
まいまい式に関しては以下のブログが詳しいです。
すねいる ETロボコン日記
http://www.chihayafuru.jp/etrobo/?p=1349
さらに、まいまい式のサンプルコードも公開されています。
http://www.chihayafuru.jp/etrobo/?p=1326
このサンプルコードを参考に、TECS上でまいまい式を実装しました。
20ms周期で光センサに搭載されているLEDのon/offを繰り返して、LEDオン時の光センサの値とLEDオフ時の光センサの差分を利用しています。
今回、10ms周期で動く、ライントレースを行うタスク(tLinetracerTaskBody.c)上に実装しました。
以下がそのサンプルコードです。
if(count%4==0){
//LEDon時の光センサの値を取得
cLightSensor_getValue(&lightUpperd);
cLightSensorControl_off();
}else if(count%4==2){
//LEDoff時の光センサの値を取得
cLightSensor_getValue(&lightDowned);
cLightSensorControl_on();
}
if(lightUpperd != 0 && lightDowned != 0){
light = VAR_lightThreshold;
if(lightDowned - lightUpperd > 0){
lightDiff = lightDowned - lightUpperd;
}else{
lightDiff = 0;
}
k = (1.0382e-3 * lightDowned - 6.3295e-1) * lightDowned + 1.1024e+2;
//LEDon時を基準に補正
brightness = (float32_t)200 + (float32_t)(lightUpperd - lightDiff * 450 / k);
light=(uint16_t)(brightness);
}
count++;
TECS上で光センサのLEDをオン/オフ操作は、
cLightSensorControl_off();
cLightSensorControl_on();
で出来ます。
タスクが一度立ち上がるたびにcountを加算し、その値を4で割ったあまりを使って
20ms周期にLEDの値を取得しています。
ライントレースを行うタスクの周期を8msや、6msにしてみましたが、
光センサから取得される値が安定しませんでした。
光センサの値を取得する周期タスクを別で立てたほうがいいかもしれません。
補正係数kはサンプルコードの値を利用させていただきました。
サンプルコードでは、コース明度の計算をlightDiff / kとされていましたが、
LEDon時に取得される光センサの値を基準に、扱い易くするため適当な値(200, 450)を用いて補正しています。
まいまい式を利用したことで、コースの一部にライトを当てても、
補正係数kはサンプルコードの値を利用させていただきました。
サンプルコードでは、コース明度の計算をlightDiff / kとされていましたが、
LEDon時に取得される光センサの値を基準に、扱い易くするため適当な値(200, 450)を用いて補正しています。
まいまい式を利用したことで、コースの一部にライトを当てても、
室内の蛍光灯を消したりつけたりしても、ラインを認識することができるようになりました。