自律走行ロボットを
プログラミングするということ
~ET ロボコンの場合
古賀信哉
ETロボコン北海道地区実行委員会
はじめに


ET ロボコンの紹介



自律自立と走行



センサで回りと自分を見る



自律走行へ挑戦するために
ET ロボコンの紹介
どんなコンテスト?


目的




開催概要




若手技術者や学生向けの学習の場を提供・育成

自律走行ロボットの、走行実技と設計モデルを競う

年間スケジュール
実施説明会
 技術教育1、2 + 試走会1、2
 モデル提出~モデル審査
 地区大会実技コンテスト(一般公開)
 全国チャンピオンシップ大会

ロボットで何をやるの?


競技コース
 黒いラインを引いたコース



光センサを使ってライントレース
途中には、坂道やカーブもあり

 基本コースのゴール後に難所あり




階段、シーソー
機体を傾けないと通れない高さのゲート
ロボットで何をやるの?


競技コース
 黒いラインを引いたコース



光センサを使ってライントレース
途中には、坂道やカーブもあり

 基本コースのゴール後に難所あり




階段、シーソー
機体を傾けないと通れない高さのゲート
「アーキテクト部門」を新設。



パフォーマンスステージ(新設!)
 ベーシックコース後の自由パフォーマンス
何を競うの?


走行実技
 共通のハードウェアを使う
 ソフトウェアの出来を競う



設計モデル
 構造モデルと振る舞いモデルを中心に記述
 「これは走りそうだ」と分かる内容は高評価
何が難しいの?


ちゃんと走らせること
 直進コースを直進し、カーブで曲がる
 坂道で倒れず、ラインを見失わない

 難所に着いたことを検出して動きを変える



ちゃんと設計すること
 構造、振る舞いのモデルの一貫性(UML)
 前提の適切さ、仮説と検証の妥当性(性能)
何を使うの?


機体
 LEGO



Mindstorms NXT

OS とプラットフォーム
 nxtOSEK



(TOPPERS/JSP, etc.) (OSS)

プログラミング環境
 Cygwin/gcc


(OSS): C 言語

ARM ツールチェイン
機体が持っているもの

ジャイロセンサ

超音波センサ

ソフトウェア(CPU)
Bluetooth
ロータリエンコーダ
(左右のモータに付属)

光センサーと LED
左右の車輪(モーター)
自立と走行
~自律の前に、まず自立
どうやって立つの?


何が難しいのか



倒立振子制御 API


extern void balance_control(
F32 args_cmd_forward,
F32 args_cmd_turn,
F32 args_gyro,
F32 args_gyro_offset,
F32 args_theta_m_l,
F32 args_theta_m_r,
F32 args_battery,
S8* ret_pwm_l,
S8* ret_pwm_r);

前進/後退速度
旋回速度
ジャイロセンサ
ジャイロオフセット
ロータリエンコーダ左
ロータリエンコーダ右
バッテリ電圧
どうやって立つの?




何が難しいのか
倒立振子制御 API


extern void balance_control(
F32 args_cmd_forward,
F32 args_cmd_turn,
F32 args_gyro,
F32 args_gyro_offset,
F32 args_theta_m_l,
F32 args_theta_m_r,
F32 args_battery,
S8* ret_pwm_l,
S8* ret_pwm_r);

API が計算して出したモータ回転
強度の値を、モータ制御 API に渡
して動かす。

前進/後退速度
旋回速度
ジャイロセンサ値
ジャイロオフセット値
ロータリエンコーダ左
ロータリエンコーダ右
バッテリ電圧
モータ回転強度左
モータ回転強度右
デモで分かること(倒立制御)


完全静止できない!
デモで分かること(倒立制御)


完全静止できない!

倒立制御では、ジャイロセンサの値を
見ながら、倒れないように車輪を小刻
みに動かします。

車輪が動くので、静止できません。
走行するには


倒立振子制御 API
 静止の場合と



API は同じ

前進・後退
 前進・後退速度を指定



右旋回・左旋回
 旋回速度を指定
デモで分かること(走行制御)


直進しない!
デモで分かること(走行制御)


直進しない!
同じ回転強度をモータ制御 API に指定
しても、左右のモータの特性が違いま
す。思った通りには直進しません。

車輪の取り付けがわずかに左右ずれて
いれば、それも影響します。
自立と走行(まとめ)


自立の仕組み
 ジャイロセンサで傾き動作(角速度)検出
 傾きを解消するために車輪を動かす





ジャイロセンサ API と倒立振子制御計算 API
モーター制御 API

課題
 倒立振子は静止しない

 まっすぐ走らない
 車は急に止まらない・走らない
自立と走行(まとめ)


自立の仕組み
 ジャイロセンサで傾き動作(角速度)検出
 傾きを解消するために車輪を動かす





ジャイロセンサ API と倒立振子制御計算 API
モーター制御 API

課題
 倒立振子は静止しない

 まっすぐ走らない

前進・後退中に速度を一気に落とすと、
簡単に転倒します!

 車は急に止まらない・走らない
センサで回りと自分を見る
~目を開いてみよう
機体に装着されたセンサの一覧


ジャイロセンサ:角速度



光センサと LED



ロータリエンコーダ



超音波センサ



タッチセンサ:スタート指示に使える
地面の色(明るさ)を見る


光センサと LED:反射光



地面の色が反射光の強さに対応



デモで分かること
車輪の動きで自分の動きを知る


ロータリエンコーダ:車輪の回転角



剛体モデルで考える



デモで分かること
前方障害物との距離を知る


超音波センサ:前方物体までの距離



距離計測の仕組み



デモで分かること
センサで回りと自分を見る(まとめ)


センサで検出できるもの
 傾き角度動作:

ジャイロセンサ
 左右の車輪の回転角: ロータリエンコーダ
 前方物体との距離: 超音波センサ


課題
 光センサからの入力値は不安定




外乱光
倒立振子機体の傾き動作
センサ自体の精度
センサで回りと自分を見る(まとめ)


課題(続き)
 足元の障害物は検出できない(難所攻略時)


どうやれば?

 理想モデルと実データのかい離



まずは実測!
実測に基づいてモデルを修正
自律走行へ挑戦するために
自律って何だろう


ライントレース?



自分を知る、世界を知る
制御動作の最適化


車は急に止まれない、曲がれない



比例制御



積分制御、微分制御
自己位置推定


剛体モデルで計算



推定結果と現実の違いを補正
難所攻略


階段に出くわしたことを知るには



走り過ぎて落ちないために



シーソーを通り抜ける
ライントレースの精度を上げる


外乱の影響をどうやって防ぐ?



自己位置推定を補完



「チェックポイント」を作ろう



適応型にするために
これから始めるには


ET ロボコン
 http://www.etrobo.jp/2013/



LEGO Mindstorms NXT の入手先
 http://www.afrel.co.jp/lineup/robocon




http://afrel-shop.com/shopdetail/008000000003/order/

NXT 拡張ファームウェアと nxtOSEK の入手先


http://lejos-osek.sourceforge.net/jp/installation_enf.htm
仕組みをもっと知っておこう


nxtOSEKのタスク/スレッド仕様
 nxtOSEK/toppers_osek/doc/
 リアルタイム処理用の優先度仕様



Etrobo APIの内部
 センサからの入力をどう受け取っているか



ハードウェアの特性
 センサやモータのばらつき、入力・応答特性
 電池の残量の違いにも注意
仕組みをもっと知っておこう


nxtOSEKのタスク/スレッド仕様
 nxtOSEK/toppers_osek/doc/
 リアルタイム処理用の優先度仕様
スリープ関数がスリープしない(busy
loop による待ち動作)なので要注意!



Etrobo APIの内部

マルチスレッド実装は「周期アラーム」が
便利。

 センサからの入力をどう受け取っているか



ハードウェアの特性
 センサやモータのばらつき、入力・応答特性
 電池の残量の違いにも注意
ここから先は、みなさんで


今日のプレゼンで使ったソースコード
 以下のページで公開しています:
http://www.stprec.co.jp/project/

自律走行ロボットをプログラミングするということ ~ETロボコンの場合~