2026.06.18
ETロボコン PID制御でライントレース挑戦してみた
#PID制御 #電子工作 #C #ETロボコン #電気電子 #組込制御
トップ > 技術ナレッジのアーカイブ > ETロボコン PID制御でライントレース挑戦してみた
2026.06.18
#PID制御 #電子工作 #C #ETロボコン #電気電子 #組込制御

こんにちは。テクノプロ・デザイン社の沖廣です。
私は組込みソフトウェア開発を専門としており、趣味の一つとしてロボコンにも取り組んでいます。
今回は、組込みソフトウェア技術を学べる教育型ロボットコンテスト「ETロボコン」に参加した際に取り組んだ、PID制御によるライントレースについて紹介します。
ライントレースは、ロボットがコース上のラインを認識しながら自律走行する技術です。一見単純そうに見えますが、高速かつ安定した走行を実現するためには制御理論の知識が欠かせません。本記事では、
★ETロボコンとはどのような大会なのか
★ライントレースの基本的な仕組み
★PID制御を用いた走行アルゴリズム
★実際に行ったチューニング方法
について、実際のプログラム例を交えながら解説します。

大阪支店所属。2000年中途入社。組込みソフトウェア開発を専門とし、日々ものづくりに携わる。趣味は映画鑑賞、ランニング、ロボコン。休日にはロボット製作や競技にも取り組んでいる。
ETロボコン(Embedded Technology Robot Contest)は、組込みソフトウェア技術の学習を目的とした教育型ロボットコンテストです。
学生だけでなく社会人も参加でき、単純にタイムを競うだけではなく、「モデル(設計)」と「走行(実装)」の両方が評価対象になることが大きな特徴です。参加者のレベルに応じて複数のクラスが用意されています。
プログラミングや設計の未経験者向けのクラスです。シミュレータ上で開発を行うため、ロボット実機がなくても学習できます。
プログラミングや設計の基礎知識を持つ方向けのクラスです。実機を用いた開発を通じて組込み技術を学べます。
基礎を習得した参加者向けの上級クラスです。より高度なアルゴリズムや設計技術が求められます。
ライントレースとは、コース上に描かれた黒線(または白線)をセンサーで検知し、そのラインに沿ってロボットを自動走行させる技術です。
この技術はロボット競技だけでなく、工場の搬送ロボットや教育用ロボットなど、さまざまな分野で活用されています。
ETロボコンではカラーセンサーを使用してコースの明暗を検知し、ラインとの位置関係を判断しながら走行します。
ライントレースにはさまざまな制御方法がありますが、代表的なものとして「ON/OFF制御」「P制御」「PID制御」があります。
最もシンプルな制御方法です。
ラインから外れた場合に大きく方向転換し、ライン上に戻ったら真っ直ぐ進むという動作を繰り返します。
実装は容易ですが、ロボットの動きがガタガタしやすく、高速走行には向いていません。
現在のラインからのズレ量に応じて旋回量を変化させる方法です。
ズレが大きければ大きく曲がり、ズレが小さければわずかに曲がるため、ON/OFF制御よりも滑らかな走行が可能になります。ただし、急カーブではラインを見失ったり、振動が発生したりすることがあります。
今回採用したのがPID制御です。
PID制御は、
P(Proportional:比例)
I(Integral:積分)
D(Derivative:微分)
の3つを組み合わせた制御方式です。P制御で現在のズレに応じた修正を行い、I制御で長時間続くズレを補正し、D制御でズレの変化を予測して先回りした制御を行います。
イメージとしては、
P:ズレた分だけ曲がる
I:ズレが続いたら補正を強める
D:ズレ始めた瞬間にブレーキをかける
という役割になります。
PID制御は「Pで動かし、Dで安定させ、Iで微調整する」と考えると分かりやすいでしょう。
今回のライントレースでは、このPID制御を利用して安定した走行を目指しました。
実際のライントレース処理は、以下の流れで実行しています。
まずカラーセンサーからRGB値を取得します。取得したRGB値は、そのままでは扱いにくいため、グレースケール値へ変換します。
- mRGB = pup_color_sensor_rgb(gSettingSPIKE.fg_color_sensor); mGlayscale = (uint16_t)((((double)mRGB.r)/4) * 0.3 +(((double)mRGB.g)/4) * 0.59 +(((double)mRGB.b)/4) * 0.11);
人間の視覚特性を考慮した重み付けを行い、RGB値を1つの明るさ情報へ変換しています。
次に、白と黒の中間値を目標値として設定し、現在の輝度との差を計算します。例えば白の輝度が203、黒の輝度が10の場合、
(203 + 10) ÷ 2 = 106.5
が目標値となります。
ロボットはこの値を維持するように制御され、白側へ寄れば右へ、黒側へ寄れば左へ旋回することでラインを追従します。
偏差が求まったら、PID制御を用いて旋回量を計算します。今回使用したPIDゲインは以下の通りです。
- #define KP_L 0.5 #define KI_L 0.032 #define KD_L KI_L * 2.5
プログラムでは、前回の偏差と今回の偏差から比例項(P)、積分項(I)、微分項(D)を計算し、それらを合算して旋回量を求めています。
- mIntegral_black += ((mDiff_black[0] + mDiff_black[1]) / 2.0) * DELTA_T; P_cal = p_para * mDiff_black[1]; I_cal = i_para * mIntegral_black; D_cal = d_para * ((mDiff_black[1] - mDiff_black[0])) / DELTA_T; pid_black_value_return = P_cal + I_cal + D_cal;
また、計算結果が極端な値にならないよう、旋回量には上限値を設けています。このようにして求めた旋回量をもとに、ロボットがラインから外れないよう制御を行います。
PID制御によって旋回量が求まったら、その値を左右モーターの出力へ反映します。
- left_motor_power = (int)(gSettingSPIKE.gMax_speed +(gSettingSPIKE.gMax_speed * turn_amount / 100)); right_motor_power = (int)(gSettingSPIKE.gMax_speed - (gSettingSPIKE.gMax_speed * turn_amount / 100));
左モーターと右モーターの出力差を変化させることでロボットを旋回させます。
例えば右へ曲がりたい場合は左モーターの出力を大きくし、左へ曲がりたい場合は右モーターの出力を大きくします。
この差動制御によって、ライントレースに必要な滑らかな旋回を実現しています。
ここまでの処理を一定周期で繰り返し実行します。
ライントレースの基本アルゴリズムでは、
という一連の処理を10〜20ms周期で繰り返します。ロボットは走行中も常にセンサー値を監視し続けているため、ライン位置の変化に素早く反応することができます。
ライントレースを行う前に、カラーセンサーのキャリブレーションを実施します。
キャリブレーションとは、コース上の白・黒・青それぞれの輝度値を実際に測定し、その値をプログラムへ反映する作業です。
例えば今回の環境では以下の値となりました。
- const uint16_t WHITE_BRIGHTNESS = 203; const uint16_t BLUE_BRIGHTNESS = 42; const uint16_t BLACK_BRIGHTNESS = 10;
センサー値は会場の照明環境やコースの状態によって変化します。 そのため、事前に正確な値を取得しておくことが安定走行の重要なポイントとなります。
PID制御は実装しただけでは十分な性能を発揮できません。 実際にロボットを走行させながら、各ゲインを調整する必要があります。
Pゲインを大きくすると曲がる力が強くなります。
しかし大きくしすぎるとラインを行き過ぎてしまい、左右に蛇行する現象が発生します。逆に小さすぎるとカーブへ対応できず、ラインアウトしやすくなります。
今回使用した値は以下です。
- #define KP_L 0.5
Iゲインはズレが長時間続く場合に補正を強めるための値です。長いカーブやセンサー誤差の補正に有効です。
- #define KI_L 0.032
Dゲインはズレの変化速度に反応します。
曲がり始めのタイミングで制御を強めることで、振動やオーバーシュートを抑制できます。
今回のプログラムではIゲインを基準に設定しました。
- #define KD_L (KI_L * 2.5)
PIDゲインだけでなく、走行速度も重要な要素です。
- #define MinPower_LAP 40 #define MaxPower_LAP 80
速度を上げるとタイムは向上しますが、その分だけ制御も難しくなります。
そのため、
という順番で調整を進めると比較的スムーズにチューニングできます。
実際には何度も試走を繰り返しながら、蛇行しない範囲で最も速く走行できるポイントを探していきました。
今回はETロボコンで取り組んだPID制御によるライントレースについて紹介しました。
ライントレースは単純な制御に見えますが、安定した走行を実現するためにはセンサー値の取得、キャリブレーション、PIDゲインの調整など多くの工夫が必要です。ETロボコンは、実践的なソフトウェア開発及びチーム開発を学べる貴重な機会です。
社外交流、自由チャレンジ(失敗リスクなし)も大きな魅力です。
ETロボコンに是非ご参加ください。