## 今週のテーマ ロボットを与えた目的地まで移動させる - 移動方法は自分で実装する --- # 車輪移動ロボット --- ## 車輪による駆動 ### 2輪差動駆動(対向2輪型) - 最も一般的な駆動方法(特に小型ロボットで) - 2つの駆動輪(+いくつかのキャスタなどの補助輪): - 左右の車輪が同じ速度で回転すると直進する - 車輪の速度差がロボットの回転角度を決定する <img src="./v2_media/differential-steering-model.png" alt="" style="width: 250px;"/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="./v2_media/differential-steering.png" alt="" style="width: 450px;"/> - 長所: - シンプルなデザイン - 低価格 - 止まって回転できる ⇒ 狭いスペースで重要 - 短所: - 直線を維持するのは困難:車輪の速度の小さなエラーに敏感(エラーの理由は多数:不均一な車輪直径、凹凸のある床面、車輪のスリップなど) --- <iframe width="560" height="315" src="https://www.youtube.com/embed/n3UmgCXw5lY" frameborder="0" allowfullscreen></iframe> --- ### 車のような駆動(ステアリング型) - シンプルなデザイン - 屋外の地形にも適応 - 経路計画は複雑 <img src="./v2_media/image27.png" alt="" style="width: 300px;"/> --- <iframe width="560" height="315" src="https://www.youtube.com/embed/VB63D08XOPQ?start=75" frameborder="0" allowfullscreen></iframe> --- ### 全方位駆動 - 特別な車輪を使用する <img src="./v2_media/omniwheel2.png" alt="" style="width: 250px;"/> 一般的に、各車輪には独自の駆動モーターが付いている。 <img src="./v2_media/image29.png" alt="" style="width: 450px;"/> &nbsp;&nbsp;&nbsp;&nbsp; <img src="./v2_media/image30.jpg" alt="" style="width: 200px;"/> --- 長所: - 全方向に移動可能、移動と同時に回転可能 短所: - 直線移動を維持するのが困難 - 複雑、高価格 --- <iframe width="560" height="315" src="https://www.youtube.com/embed/3LdklhaYgX8?start=5" frameborder="0" allowfullscreen></iframe> --- # 2輪差動駆動ロボットの使用 ## どこにいるか?位置推定 **オドメトリ**(odometry)⇒ ロボットの運動モデルと測定された速度に基づいてロボットの位置を計算する - ローカリゼーション(位置推定)の最も簡単な方法 <br> > オドメトリ計算の簡単な例: > > - 2秒に速度0.5m/sで移動した ⇒ 1メートル前に進んだ > > - 3秒に角速度30度/sで回転した ⇒ 方向が90度変更した --- ### より詳細なオドメトリ計算 オドメトリ計算をより詳しく理解するために、計算がどのように実装されるかの例を以下に示す。 移動ロボットの姿勢は、空間内の位置を表す x と y、および方向(ロボットが向いている角度)を表す θ の3つの変数で記述される。オドメトリでは、ロボットの速度に基づいてこれらの変数の推定値を継続的に更新する。初期値は通常 x = 0、y = 0、θ = 0 に設定される。そして、以下の式を用いて一定の時間間隔で姿勢が更新される。 x = x + v * cos(θ) * T y = y + v * sin(θ) * T θ = θ + ω * T ここで: - v はロボットの線速度(移動の速さ) - ω はロボットの角速度(回転速度) - T は更新間隔の時間 これらの計算により、ロボットは時間経過に伴って自分の位置と方向を推定することが可能になる。 --- ### 速度の測定方法 - 車輪に与えられた速度コマンドを使用 → ただし、実際の速度と少し異なることが多い - 一般、車輪に付いているセンサ(エンコーダー)を使う <br> 以下、光学式エンコーダの測定原理と、安いタイプのエンコーダの写真 <img src="./v2_media/encoder.png" alt="" style="width: 300px;"/> &nbsp;&nbsp;&nbsp;&nbsp; <img src="./v2_media/encoder2.png" alt="" style="width: 250px;"/> ### オドメトリの誤差 - 原因 - 運動モデルパラメータの値が:車輪の直径、車輪間の距離、など - 車輪のスリップ、不均一な地面、など - 誤差が徐々に蓄積する! - 他のセンサは使わない → 修正できない オドメトリ誤差の蓄積の例:赤い線→実際の位置、緑の線→オドメトリで計算した位置 <br> <img src="./v2_media/odom_error.png" alt="" style="width: 450px;"/> ⇒ 普段はオドメトリだけで位置推定はしない - より良い方法は後日のローカリゼーションの演習で学ぶ --- ### シミュレータ・実際のロボットで使う場合 ・一般的に、オドメトリの情報が内部で計算されていて、自分でエンコーダの測定データから計算する必要がない ・オドメトリ情報が入ったメッセージがトピック /odom にパブリッシュされる --- ## どうやって目的地まで行くか?位置制御 ### 制御方法 1 - 最も単純な方法 <img src="./v2_media/control1_0.png" alt="" style="width: 25%;"/> (1)ロボットが目的置に向かうまでを回転させる <img src="./v2_media/control1_1.png" alt="" style="width: 25%;"/> (2)目的地まで一定の速度で直進する <img src="./v2_media/control1_2.png" alt="" style="width: 25%;"/> (3)必要であれば、希望の方向に達するまで回転させる <img src="./v2_media/control1_3.png" alt="" style="width: 25%;"/> 問題点: - 断続的な動き - ロボットのダイナミクスを無視する(速度は急に変換できない) - 直進(2)のときに直線からズレるとあとで修正しにくい --- ### 制御方法 2 <img src="./v2_media/control2.png" alt="" style="width: 40%;"/> - 位置の誤差: Δx、Δy - 目的地までの角度: atan2(Δy,Δx) - 角度の誤差(目的地までの角度マイナスロボットの向き):   α = atan2(Δy,Δx) - θ 一定の速度を保ちながら、角度の誤差を小さくするように角速度を制御する: - v = v_const - ω = K・α (これはいわゆる「比例制御」あるいは「P制御」である。Kは比例ゲイン係数である。) --- この制御方法を使ったロボットの軌跡: <img src="./v2_media/pid.png" alt="" style="width: 40%;"/> --- 速度に制限をかける - 最大角速度ω_maxを超えないように  ω = min(K・α, ω_max) - 目的地に近づいたらスピードを落とす(d→目的地までの距離)  v = min(v_const, d・v_factor) --- ### しかし - 上記のロボット制御方法は、目的地までに障害がないのが前提である! - これの解決方法は後日のナビゲーションの演習で学ぶ --- ### シミュレータ・実際のロボットで使う場合 ・一般的に、速度コマンドのメッセージをトピック /cmd_vel に送信 --- → [実習その1](v2_1.html) ↑ [ホームページ](index.html)