SlideShare a Scribd company logo
1 of 35
Download to read offline
2024/1/20
チームイエスマン 日川晃一
つくばチャレンジ1.0を終えて
自己紹介的な話.
X. About Me
• お仕事
➢ コンピュータビジョン,ロボティクスなどの研究開発業務.
• 画像処理技術&ロボティクスの知識を深めたい
• ものづくり大好き
➢ 過去にもロボコン参加歴あり.
• ETロボコン2013
• つくばチャレンジ 2015 ~ 2022
ETロボコンのロボット つくばチャレンジ第二ステージ つくばチャレンジ第三ステージ
X. 年表でみる,つくばチャレンジと僕
2015 2016 2017 2018 2019 2020 2021 2022
会社設立
2015年
• つくばチャレンジ初参加
• ハードウェアを作成
• このときは3年で完走するつもり
• 自己位置推定できず,“曲がれないロボット”
• 本走行距離:70m
• 転職(笑)
2017年
• カメラを使った自己位置推定がおぼろげな
がら実装でき,“曲がるロボット” に進化!
• 本走行:200m
2018年
• ひとまず先人のキャッチアップに方向転換
• i-cart mini と ROS を使った構成に
• 確認走行を始めてクリア!
• 本走行距離:200m
• 自己位置推定がずれで,コースアウト.
2019年
• ベース SW に Autoware を使用
• 3D Lidar を採用
• 出発時インタビューで「完走します!」と高ら
かに宣言.直後に自己位置推定破綻
• 本走行距離:2m
• 独立(笑)
2021年
• 横断歩道のルールを勘違い,途中リタイア(/ω\)
• 本走行としては,初めて確認走行区間を走破
• 本走行:540m
2022年
• 確認走行区間で自己位置推定破綻
• 本走行:140m
未完走のまま,8年目に
突入です.( ゚Д゚)
X. 7年間で変わったのはロボットだけでなく...
• つくばチャレンジ2015以降,転職(2015)しまして,独立(2019)しまして,会社(2020)作っちゃいました.
• 名だたる企業に紛れて非常に恐縮ですが,
社名が “C” から始まるという一点の理由のみで,毎年特等席をいただいております (/・ω・)/
X. 弊社の抱える大きな課題
「つくばチャレンジ完走してないのに,
Robotics を名乗っていいのか問題」
X. 課題の解決
仕事の状況的に,今年(2023)は結構時間が取れそうで,
ついに,3年来の経営課題解決を果たす時がやってきました!
ということで,つくばチャレンジ2023の目標を下記の通り設定しました.
“大人げなかろうが,セコイと思われようが,絶対完走する!”
ここから,目標に果敢にトライしたアラフォーおじさんの物語が始まります.
ざっくりとした話.
(今年の戦略とシステム構成)
X. 今年の戦略
1.平易なアルゴリズム/実装を優先する.
要素技術に関しては,できる限りシンプルなものを使う.(複雑な Planner や Controller を避ける)
【理由】
• 実装,アルゴリズムで課題が発生しても,自分で解決策を実装できる.
• システム全体の理解にかかる時間を抑える.
2.ロボットの挙動をシンプルにする.
ロボットの挙動をできる限りシンプルにして,完走を確実にする.
【理由】
• ロボットを実走させられる機会が限られるため,再現性の低い事象に悩まされたくない.
X. ロボットの挙動
ロボットの挙動はできるだけシンプルに,下記のようにまとめた.
【コース取り】
1.実験走行時に取得したウェイポイントに沿って走行.
【障害物回避】
1.ウェイポイント上に障害物を発見した場合,一定距離まで障害物に近づき待機する.
2.一定時間待機後においても,ウェイポイント上の障害物が存在する場合,障害物回避を実行する.
3.障害物回避後,ウェイポイントに沿って走行を再開.
【速度調整】
1.停止線/障害物への距離が一定以下となった場合,減速する.
X. システム構成 ~ Hardware
ハードウェア構成は昨年から大きく変わらず,i-Cart mini をベースとして,2-D & 3-D Lidar と IMU + Encoder の構成.
X.GPS デバイス(ZED-F9P)
位置の初期化にあった方が便利.
X.RTK位置補正サービス(Ichimill)
ただし,本年度は GPS 未使用.
X.6軸 IMU
(RT USB Output 9-axis
IMU)
X.2D Lidar
(UTM-30LX-EW)
※今回は近接検知(10cm
程度まで)に使用.
X.3D Lidar(VLP16)
メインセンサとして利用.但し,
90cm 程度までしか検知でき
ない.
X.ノートPC
(G-Tune P6-I7G60BK-A)
画像処理等を鑑みると,ゲーミングPCが便
利.バッテリー駆動ではパフォーマンスが落ち
る可能性があるので,要電源供給.
X.モバイルバッテリ
(Jackery ポータブル電源 708)
瞬間最大電力に要注意.小さければ,PC
への供給ができない.
X.駆動用電源
(LONG WP12-12 x 2)
モータ用の電源.
Components Qty Model
Platform 1 i-Cart mini (T-frog Project)
Motor/
Controller
1 TF-2MD3-R6 (T-frog Project)
2D Lidar 1 UTM-30LX-EW
3D Lidar 1 VLP16
IMU 1
RT USB Output
9-Axis IMU Sensor Module
GPS 1 ZED-F9P (未使用)
PC Battery 1 Jackery ポータブル電源 708
Lead-acid
Battery
2 WP12-12
PC 1 G-Tune P6-I7G60BK-A
X. システム構成 ~ Software
本年度,ソフトウェアについては刷新.内容としては,,,
1.ROS1 から ROS2 への移行.
2.“ちゃんと” 作ったステートマシン.
3.“ロストしない!” 自己位置推定.
4.といいつつも...“万が一のため” の自己位置復帰.
5.“ちょっとだけ柔軟な” 局所的経路計画(ローカルプランニング).
6.OSS(Teb Local Planner)を使った “華麗な” 障害物回避.
X. システム構成 ~ Software 構成図
黄色ブロックが自作モジュール,灰色ブロックが 3rd party のモジュールになります.
(この後の発表で触れる部分は赤色になっています.)
2. “ちゃんと”作ったステートマシン.
3. “ロストしない!”自己位置推定.
4. “万が一のため”の自己位置復帰.
5. “ちょっとだけ柔軟な” 局所的経路計画.
6. OSS を使った,“華麗な” 障害物回避.
細かい話.
(技術的な各論)
X. 環境地図作成 ~ 概要
【背景&動機】
地図作成については,昨年度と同様 Google Cartographer を使用.
3D Lidar (VLP-16) を用いて地図を作製.
昨年度,Autoware の ndt_scan_matcher との組み合わせで上手く動くことを確認済.
※地図作成に関しては特に自作した部分がないため,使用上のコツやハマった点をいくつか紹介.
【使用上のコツ】
コツ1:Cartographer 使用する場合,地図作成の成否は “ループ閉じの成否” にほぼ依存.
コツ2:オドメトリの精度が低いと,パラメータチューニングが難しくなる.オドメトリの精度はある程度担保したい.
初めて使う場合,ループ閉じの感覚をつかむことがとても重要で,下記の順番でやるのがおススメ.
1.GLOBAL SLAM を OFF にして,LOCAL SLAM だけで地図を作る.
2.GLOBAL SLAM を ON にして,ループ閉じのパラメータを大きく緩和する.(誤った閉ループができるくらいに.)
3.おそらく誤った閉ループができているので,ここからループ閉じのパラメータを調整する.
X. 環境地図作成 ~ 一連の流れ
【データの取得方法】
1.データの早い段階で,ループ閉じが発生するようにデータを取る.
(今回の場合だと,あえて市役所をもう一周する.)
【パラメータ調整】
1.Lidar のレンジを最大まで使わない.
(今回は 60m (最大100m) で設定.)
2.オドメトリの精度がある程度出ていることを確認.
(市役所一周して,始点と終点が離れすぎていない.)
3.GLOBAL SLAM を OFF にして,
市役所一周分に対してある程度マップができるか確認.
4.ループ閉じの閾値を大きく下げ,ひとまずループを閉じてみる.
5.市役所一周分の地図が正しくできたことを確認し,全コースの地図を作成.
【データ確認】
1.xy 平面だけでなく,xz 平面,yz 平面も確認する.(xy 平面が正しくても,他の平面でずれているとロストする!!)
ここでループが閉じるようにデータを取得し,
チューニングを繰り返す.
X. 環境地図作成 ~ 成功例 vs 失敗例
xy 平面で見るとできているが,
xz, yz 平面で路面が反っている.
Lidar から一定半径離れた点
にゴーストが発生したため,使用
距離を短くした.
・成功例 ・失敗例
X. ステートマシン ~ 概要
【背景&動機】
昨年度まで,if 分を使った簡易的な実装で状態遷移をごまかしていた.結果として,,,
モジュールが複雑になり,バグが入りやすくなって開発効率が低下.
翌年度,コードの解読が大変で,再利用性が低下する.
【方針】
ステートマシンを “ちゃんと” 作ってみようと一念発起.(; ・`д・´)
【設計】
状態遷移の定義:紙に状態遷移の定義をきちんと起こす.
フレームワークの使用:Boost の Meta State Machine をフレームワークとして使う.
ただし,ステートマシンを利用しても,状態/遷移条件が多くなると組み合わせが増え,結局複雑になってしまう.
これを避けるため,モジュール毎にステートマシンを分ける設計とした.
X. ステートマシン ~ ステートマシンと役割分担
ステートマシンの実装複雑化を避けるため,モジュール毎に分けた. 1. メインステートマシン
役割:
• ユーザとのやり取り.(ボタン押下)
• ステートマシン間の状態仲介
2. プランニングステートマシン
役割:
• 障害物検知.
• 障害物前停止.
• 障害物回避.
• 目標停止点到達
4. ルート管理ステートマシン
役割:
• ルート供給.
• 最終ゴール到達判定.
3. 自己位置管理ステートマシン
役割:
• 自己位置ロスト判定.
• 自己位置復帰.
実装的には,ある程度の量に収まった.
ただ,モジュール間の結合が本当に疎にできるかは要検討.みなさん,どうやって実装してます??
X. 自己位置推定 ~ 概要
【背景&動機】
昨年度まで,自己位置推定には Autoware の ndt_scan_matcher を利用.走行回数/距離が増えると,どうしても走行中に
ロストする場合が出てくる.昨年の本走行では確認走行区間で自己位置推定をロストし,リタイア.
【方針】
“ロストしない!” 自己位置推定の実現 & “万が一のため” の自己位置復帰ロジック.
【設計】
・オドメトリによる補完:スキャンマッチングの精度悪化をオドメトリによって補完する形にしたい.
・ロスト復帰の仕組み: Autoware の pose_initializer を参考に,自己位置復帰ロジックを作成.
X. 自己位置推定 ~ Ndt と Odom の統合
0.はじめに
マップ座標系(ndt の座標系)と odom 座標系において,変換を
T_map_to_odom とする.
x
y
z
z
y
x
Map
Odom
1. スイッチを入れた段階で,map 座標系と odom 座標系の関係(変換)きまる.
2-a. スキャンマッチングとオドメトリが完璧なら,Map 座標系と Odom 座標系の変換は一定.
2-b. 実際には,短い時間間隔ではスキャンマッチングの誤差で変換が変動し,長い時間間隔で
はオドメトリのドリフトが乗ってきて変換がずれてくる.
x
y
z
Map
z
y
x
Odom
z
y
x
z
y
x
x
y
z
Map
x
Odom
z
y
短い周期では,スキャンマッチングの誤差
で,真値近辺で振動するイメージ.
長い周期では,オドメトリのドリフトでズレが
広がっていくイメージ.
x
y
z
z
y
x
Map
Odom
スキャンマッチングとオドメトリの良いとこどりしたい!つまり,,,
“短い周期ではオドメトリを使って,長い周期ではスキャンマッチングを使いたい.”
X. 自己位置推定 ~ Ndt と Odom の統合
1.バッファリングされている要素(前提条件)
直近一定時間内における有効な Ndt 位置(Map 座標系),Odom 位置
(Odom 座標系),Ndt と Odom の変換がバッファリングされている.
バッファリングされている Ndt 位置と Odom 位置で時間的に近いものをとって,変換を計算.
t
t
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
x
y
z
t
T_map_to_odom
Ndt 位置
Odom 位置
2.バッファリングされている変換の平均をとって,現在のシステ
ムにおける T_map_to_odom とする.
+ + +
3.新たな Ndt 位置の有効/無効判定
直近の Odometry 位置との変換を計算し,現在のシステムの変換(2で計
算)と比較.差分が一定以内にある場合,この Ndt 位置を有効であるとしてバッ
ファリング.
Ndt の短期的な振動は平均化で緩和し,オドメトリのドリフトはバッファサイズを決め
ることで良いとこどりできた.(EKF を使おうとしたが,ロバストにできなかった.)
X. 自己位置推定 ~ 自己位置推定ロスト時の復帰
1.ロスト判定
下記の指標をロストの判定に用いる.
• 最適解までの収束回数.(ndt_scan_matcher)
• 最適解のスコア.(ndt_scan_matcher)
• Ndt 位置の有効/無効判定結果.(Ndt と Odometry の統合)
上記指標をモニタリングし,発生回数が一定以上になった段階でロストと判定する.
※1.上記事象が発生した場合には,Ndt 位置と Odometry 位置の変換(前
述)は更新されていない.
※2.最適解のスコアは環境によって変動するので,直近の収束解に対する値を比
較対象としてバッファリングしておき,この値に対する比の形で閾値を設けた.
2.現在の推定位置を中心として,正規乱数で粒子を生成.
(Autoware の pose_initializer の実装を参考にさせていただいた.)
z
y
x
粒子一つ一つに対してスキャンマッチング.推
定位置と真値の乖離が大きい場合なかなか収
束しないので,ロストしている間にオドメトリでど
こまで位置精度を保てるかが重要.
3.スキャンマッチングと復帰位置の選択
(ndt は Autoware 実装を使わせていただきました.)
スキャンマッチングのスコアが最もよかった粒子に対して,下記のチェックを実施.
• 現在のシステム位置と比較し,解離が一定範囲内.
• ロスト前の最適解のスコアと復帰位置候補のスコアとの比較.
上記の条件が満たされた場合,復帰位置が確定する.
【注意事項】
位置がロストした際にロボットの動きを止めてしまうと,Ndt が毎回同じ
局所解に陥ってしまう.この場合,解が局所解に陥っているのか正しい解
が求まっているのか判断ができなくなるため,位置がロストしてもロボットを
動かす必要がある.
本システムでは,走行速度を落とす仕様とした.
幸いなことに,全走行を通して自己位置ロストは一度も起こらず.
X. 局所的経路計画 ~ 概要
【背景&動機】
PurePursuit Controller による固定ウェイポイントの単純追従を実装していたが,問題が発覚.
1.自己位置推定のズレにより,ウェイポイントと静止物体が重なった場合.
2.植生等の変化で,ウェイポイントが衝突判定された場合.
上記のようなケースで走行を中断してしまう.
【方針】
“ちょっとだけ柔軟な” 局所的経路計画(ローカルプランニング)を実現する.
【設計】
完走への不安要素となるため,事前に与えたパスから大きく外れたくない.これを実現するため,事前に与えたパスの近傍でのみ経路変
更を実施する方法をとった.
X. 局所的経路計画 ~ 簡易経路生成
1.レファレンスパスに対するウェイポイント水増し.
データ取得時に取得したパス(ウェイポイント)をレファレンスとして,左右方向にそ
れぞれ n(本) のパスを一定間隔 dy (m) で生成する.
2.全ウェイポイントに対する衝突チェック
水増ししたウェイポイントすべてに対して,衝突チェックを実施.下図では,赤丸が
衝突判定されたウェイポイント.
3.全ウェイポイントに対するコスト計算
個々のウェイポイントに対して,コストを計算する.主に,障害物との距離や横方向
の移動量などを用いて計算.
X. 局所的経路計画 ~ 簡易経路生成
4.動的計画法による最適パスの探索
ステップ3にて計算したコスト総和が最小になるパスを動的計画法で計算する.
※実際の様子
X. 障害物回避 ~ 概要
【背景&動機】
簡易経路生成を用いても小さい障害物を回避することはできるが,一定以上の迂回が必要なケースでは対応できない.ただし迂回が大
きくなると経路生成が難しく,時間的に実装が間に合わない...
【方針】
OSS(Teb Local Planner)を使った “華麗な” 障害物回避を実現する.
【設計】
障害物回避を下記2通りの方法で実装する.
1.レファレンスパスからの小さな移動量で回避できる場合.
ー>前述した簡易経路生成によって,停止することなく回避.
2.レファレンスパスからの移動量が一定以上必要な場合.
ー>障害物前で一定時間停止し,Teb Local Planner に切り替える.
X. 障害物回避 ~ 簡易経路生成
X. 障害物回避 ~ Teb Local Planner
結果の話.
今までの経験上,3~4回程度連続で完走できるレベルにないと本番での完走が覚束ないため,今年は全コースを通した自律走行の
回数をできる限り増やすことを目標とした.
【方針】
繰り返し走行して不具合を洗い出すため,実験走行では毎回3回程度通して自律走行を実施.
X. 実験結果 ~ 実験走行の結果
7月 8月 9月 10月 11月
試走会2回目(7/16)
・実験走行初参加.
・手押しでの地図データ取得.
試走会3回目(9/23)
・確認走行クリア.
・全コース通し走行を実施するも,公園で停止.(不
具合発覚)
試走会4,5回目(10/21, 22)
・植生の変化でスタック発生!
(簡易経路生成の実装を決断.)
試走会6,7回目(11/3, 4)
・記録走行にて完走.初公式完走.
・ロスト復帰以外の実装は完了.
・両日3回テスト走行実施.
試走会8,9回目(11/17, 18)
・ロスト復帰ロジックの作成.
本番!(11/19)
X. 実験結果 ~ 本走行の結果
8度目の正直,達成しました!
【結果】
本走行においては,
1.静止障害物(コーン)回避
2.動的障害物との対峙・回避(他チームロボット)
が発生しましたが,問題なくクリアすることができました.
歓喜するアラフォーのおじさん
ここまでは偉大な先人のキャッチアップが中心でしたが,ここからオリジナリティを出していきます.(; ・`д・´)
に挑戦していきます!
参加当初からの目標,
だけを用いたコースの完走/課題のクリア
X. つくばチャレンジ2.0へ!
※カメラ・画像処理
皆様,今後ともよろしくお願いします (/・ω・)/
「私は7回(年)完走に失敗したのではない.
ただ,7通りの上手くいかない方法を見つけただけだ!」
最後に,エジソンおじさんの言葉をお借りして...
引用 「いらすとや」
ご清聴ありがとうございました

More Related Content

What's hot

アジャイル開発導入のためにやってきたこと
アジャイル開発導入のためにやってきたことアジャイル開発導入のためにやってきたこと
アジャイル開発導入のためにやってきたこと
Arata Fujimura
 
Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩
kiita312
 

What's hot (20)

クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014 クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
 
超軽量経路探索 for Unity
超軽量経路探索 for Unity超軽量経路探索 for Unity
超軽量経路探索 for Unity
 
お茶の水女子大学附属高校「新教養基礎」での講演
お茶の水女子大学附属高校「新教養基礎」での講演お茶の水女子大学附属高校「新教養基礎」での講演
お茶の水女子大学附属高校「新教養基礎」での講演
 
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜
 
Substance勉強会 in Osaka
Substance勉強会 in OsakaSubstance勉強会 in Osaka
Substance勉強会 in Osaka
 
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
 
楽しいゲーム開発管理
楽しいゲーム開発管理楽しいゲーム開発管理
楽しいゲーム開発管理
 
続・パワポは「最後」に開く-もっとみがく!プレゼン資料作成術「大掃除編」
続・パワポは「最後」に開く-もっとみがく!プレゼン資料作成術「大掃除編」続・パワポは「最後」に開く-もっとみがく!プレゼン資料作成術「大掃除編」
続・パワポは「最後」に開く-もっとみがく!プレゼン資料作成術「大掃除編」
 
個人で作るRTK農業用ガイダンスシステム
個人で作るRTK農業用ガイダンスシステム個人で作るRTK農業用ガイダンスシステム
個人で作るRTK農業用ガイダンスシステム
 
「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
[IGC 2016] 이경혁 - 대중매체로서의 게임: 세상과의 상호작용
[IGC 2016] 이경혁 - 대중매체로서의 게임: 세상과의 상호작용[IGC 2016] 이경혁 - 대중매체로서의 게임: 세상과의 상호작용
[IGC 2016] 이경혁 - 대중매체로서의 게임: 세상과의 상호작용
 
KLabのゲーム開発を支える開発環境
KLabのゲーム開発を支える開発環境KLabのゲーム開発を支える開発環境
KLabのゲーム開発を支える開発環境
 
Azure kinect DKハンズオン
Azure kinect DKハンズオンAzure kinect DKハンズオン
Azure kinect DKハンズオン
 
アジャイル開発導入のためにやってきたこと
アジャイル開発導入のためにやってきたことアジャイル開発導入のためにやってきたこと
アジャイル開発導入のためにやってきたこと
 
UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話
 
Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 

Similar to つくばチャレンジ2023シンポジウム 発表資料

レーザーレンジスキャナーと
レーザーレンジスキャナーとレーザーレンジスキャナーと
レーザーレンジスキャナーと
edy555
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
Takuya Akiba
 
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
Taichi Furuhashi
 
Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924
Kosuke Isobe
 
3 dプリンタの使い方
3 dプリンタの使い方3 dプリンタの使い方
3 dプリンタの使い方
mgwsuzuki
 

Similar to つくばチャレンジ2023シンポジウム 発表資料 (18)

Si2017 チームイエスマン 発表スライド
Si2017 チームイエスマン 発表スライドSi2017 チームイエスマン 発表スライド
Si2017 チームイエスマン 発表スライド
 
空間情報システムⅠ 6/13課題
空間情報システムⅠ 6/13課題空間情報システムⅠ 6/13課題
空間情報システムⅠ 6/13課題
 
レーザレンジスキャナーとWebGL
レーザレンジスキャナーとWebGLレーザレンジスキャナーとWebGL
レーザレンジスキャナーとWebGL
 
レーザーレンジスキャナーと
レーザーレンジスキャナーとレーザーレンジスキャナーと
レーザーレンジスキャナーと
 
2012 08 11_josm-hamamatsu
2012 08 11_josm-hamamatsu2012 08 11_josm-hamamatsu
2012 08 11_josm-hamamatsu
 
03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう
03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう
03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
 
Klabの梅雨対策
Klabの梅雨対策Klabの梅雨対策
Klabの梅雨対策
 
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
 
㉘HTML5+CSS3でアニメーション!
㉘HTML5+CSS3でアニメーション!㉘HTML5+CSS3でアニメーション!
㉘HTML5+CSS3でアニメーション!
 
2010 12 04_ngk_open_streetmap-iphone
2010 12 04_ngk_open_streetmap-iphone2010 12 04_ngk_open_streetmap-iphone
2010 12 04_ngk_open_streetmap-iphone
 
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
20140710 地図がつなぐ人と人~まちづくりにおける地図の役割~
 
FutureKreateロボットシミュレータ
FutureKreateロボットシミュレータFutureKreateロボットシミュレータ
FutureKreateロボットシミュレータ
 
確率ロボティクス第六回
確率ロボティクス第六回確率ロボティクス第六回
確率ロボティクス第六回
 
Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924
 
㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2
 
Gps動態管理システムのご提案 2012 august
Gps動態管理システムのご提案 2012 augustGps動態管理システムのご提案 2012 august
Gps動態管理システムのご提案 2012 august
 
3 dプリンタの使い方
3 dプリンタの使い方3 dプリンタの使い方
3 dプリンタの使い方
 

つくばチャレンジ2023シンポジウム 発表資料

  • 3. X. About Me • お仕事 ➢ コンピュータビジョン,ロボティクスなどの研究開発業務. • 画像処理技術&ロボティクスの知識を深めたい • ものづくり大好き ➢ 過去にもロボコン参加歴あり. • ETロボコン2013 • つくばチャレンジ 2015 ~ 2022 ETロボコンのロボット つくばチャレンジ第二ステージ つくばチャレンジ第三ステージ
  • 4. X. 年表でみる,つくばチャレンジと僕 2015 2016 2017 2018 2019 2020 2021 2022 会社設立 2015年 • つくばチャレンジ初参加 • ハードウェアを作成 • このときは3年で完走するつもり • 自己位置推定できず,“曲がれないロボット” • 本走行距離:70m • 転職(笑) 2017年 • カメラを使った自己位置推定がおぼろげな がら実装でき,“曲がるロボット” に進化! • 本走行:200m 2018年 • ひとまず先人のキャッチアップに方向転換 • i-cart mini と ROS を使った構成に • 確認走行を始めてクリア! • 本走行距離:200m • 自己位置推定がずれで,コースアウト. 2019年 • ベース SW に Autoware を使用 • 3D Lidar を採用 • 出発時インタビューで「完走します!」と高ら かに宣言.直後に自己位置推定破綻 • 本走行距離:2m • 独立(笑) 2021年 • 横断歩道のルールを勘違い,途中リタイア(/ω\) • 本走行としては,初めて確認走行区間を走破 • 本走行:540m 2022年 • 確認走行区間で自己位置推定破綻 • 本走行:140m 未完走のまま,8年目に 突入です.( ゚Д゚)
  • 5. X. 7年間で変わったのはロボットだけでなく... • つくばチャレンジ2015以降,転職(2015)しまして,独立(2019)しまして,会社(2020)作っちゃいました. • 名だたる企業に紛れて非常に恐縮ですが, 社名が “C” から始まるという一点の理由のみで,毎年特等席をいただいております (/・ω・)/
  • 9. X. 今年の戦略 1.平易なアルゴリズム/実装を優先する. 要素技術に関しては,できる限りシンプルなものを使う.(複雑な Planner や Controller を避ける) 【理由】 • 実装,アルゴリズムで課題が発生しても,自分で解決策を実装できる. • システム全体の理解にかかる時間を抑える. 2.ロボットの挙動をシンプルにする. ロボットの挙動をできる限りシンプルにして,完走を確実にする. 【理由】 • ロボットを実走させられる機会が限られるため,再現性の低い事象に悩まされたくない.
  • 11. X. システム構成 ~ Hardware ハードウェア構成は昨年から大きく変わらず,i-Cart mini をベースとして,2-D & 3-D Lidar と IMU + Encoder の構成. X.GPS デバイス(ZED-F9P) 位置の初期化にあった方が便利. X.RTK位置補正サービス(Ichimill) ただし,本年度は GPS 未使用. X.6軸 IMU (RT USB Output 9-axis IMU) X.2D Lidar (UTM-30LX-EW) ※今回は近接検知(10cm 程度まで)に使用. X.3D Lidar(VLP16) メインセンサとして利用.但し, 90cm 程度までしか検知でき ない. X.ノートPC (G-Tune P6-I7G60BK-A) 画像処理等を鑑みると,ゲーミングPCが便 利.バッテリー駆動ではパフォーマンスが落ち る可能性があるので,要電源供給. X.モバイルバッテリ (Jackery ポータブル電源 708) 瞬間最大電力に要注意.小さければ,PC への供給ができない. X.駆動用電源 (LONG WP12-12 x 2) モータ用の電源. Components Qty Model Platform 1 i-Cart mini (T-frog Project) Motor/ Controller 1 TF-2MD3-R6 (T-frog Project) 2D Lidar 1 UTM-30LX-EW 3D Lidar 1 VLP16 IMU 1 RT USB Output 9-Axis IMU Sensor Module GPS 1 ZED-F9P (未使用) PC Battery 1 Jackery ポータブル電源 708 Lead-acid Battery 2 WP12-12 PC 1 G-Tune P6-I7G60BK-A
  • 12. X. システム構成 ~ Software 本年度,ソフトウェアについては刷新.内容としては,,, 1.ROS1 から ROS2 への移行. 2.“ちゃんと” 作ったステートマシン. 3.“ロストしない!” 自己位置推定. 4.といいつつも...“万が一のため” の自己位置復帰. 5.“ちょっとだけ柔軟な” 局所的経路計画(ローカルプランニング). 6.OSS(Teb Local Planner)を使った “華麗な” 障害物回避.
  • 13. X. システム構成 ~ Software 構成図 黄色ブロックが自作モジュール,灰色ブロックが 3rd party のモジュールになります. (この後の発表で触れる部分は赤色になっています.) 2. “ちゃんと”作ったステートマシン. 3. “ロストしない!”自己位置推定. 4. “万が一のため”の自己位置復帰. 5. “ちょっとだけ柔軟な” 局所的経路計画. 6. OSS を使った,“華麗な” 障害物回避.
  • 15. X. 環境地図作成 ~ 概要 【背景&動機】 地図作成については,昨年度と同様 Google Cartographer を使用. 3D Lidar (VLP-16) を用いて地図を作製. 昨年度,Autoware の ndt_scan_matcher との組み合わせで上手く動くことを確認済. ※地図作成に関しては特に自作した部分がないため,使用上のコツやハマった点をいくつか紹介. 【使用上のコツ】 コツ1:Cartographer 使用する場合,地図作成の成否は “ループ閉じの成否” にほぼ依存. コツ2:オドメトリの精度が低いと,パラメータチューニングが難しくなる.オドメトリの精度はある程度担保したい. 初めて使う場合,ループ閉じの感覚をつかむことがとても重要で,下記の順番でやるのがおススメ. 1.GLOBAL SLAM を OFF にして,LOCAL SLAM だけで地図を作る. 2.GLOBAL SLAM を ON にして,ループ閉じのパラメータを大きく緩和する.(誤った閉ループができるくらいに.) 3.おそらく誤った閉ループができているので,ここからループ閉じのパラメータを調整する.
  • 16. X. 環境地図作成 ~ 一連の流れ 【データの取得方法】 1.データの早い段階で,ループ閉じが発生するようにデータを取る. (今回の場合だと,あえて市役所をもう一周する.) 【パラメータ調整】 1.Lidar のレンジを最大まで使わない. (今回は 60m (最大100m) で設定.) 2.オドメトリの精度がある程度出ていることを確認. (市役所一周して,始点と終点が離れすぎていない.) 3.GLOBAL SLAM を OFF にして, 市役所一周分に対してある程度マップができるか確認. 4.ループ閉じの閾値を大きく下げ,ひとまずループを閉じてみる. 5.市役所一周分の地図が正しくできたことを確認し,全コースの地図を作成. 【データ確認】 1.xy 平面だけでなく,xz 平面,yz 平面も確認する.(xy 平面が正しくても,他の平面でずれているとロストする!!) ここでループが閉じるようにデータを取得し, チューニングを繰り返す.
  • 17. X. 環境地図作成 ~ 成功例 vs 失敗例 xy 平面で見るとできているが, xz, yz 平面で路面が反っている. Lidar から一定半径離れた点 にゴーストが発生したため,使用 距離を短くした. ・成功例 ・失敗例
  • 18. X. ステートマシン ~ 概要 【背景&動機】 昨年度まで,if 分を使った簡易的な実装で状態遷移をごまかしていた.結果として,,, モジュールが複雑になり,バグが入りやすくなって開発効率が低下. 翌年度,コードの解読が大変で,再利用性が低下する. 【方針】 ステートマシンを “ちゃんと” 作ってみようと一念発起.(; ・`д・´) 【設計】 状態遷移の定義:紙に状態遷移の定義をきちんと起こす. フレームワークの使用:Boost の Meta State Machine をフレームワークとして使う. ただし,ステートマシンを利用しても,状態/遷移条件が多くなると組み合わせが増え,結局複雑になってしまう. これを避けるため,モジュール毎にステートマシンを分ける設計とした.
  • 19. X. ステートマシン ~ ステートマシンと役割分担 ステートマシンの実装複雑化を避けるため,モジュール毎に分けた. 1. メインステートマシン 役割: • ユーザとのやり取り.(ボタン押下) • ステートマシン間の状態仲介 2. プランニングステートマシン 役割: • 障害物検知. • 障害物前停止. • 障害物回避. • 目標停止点到達 4. ルート管理ステートマシン 役割: • ルート供給. • 最終ゴール到達判定. 3. 自己位置管理ステートマシン 役割: • 自己位置ロスト判定. • 自己位置復帰. 実装的には,ある程度の量に収まった. ただ,モジュール間の結合が本当に疎にできるかは要検討.みなさん,どうやって実装してます??
  • 20. X. 自己位置推定 ~ 概要 【背景&動機】 昨年度まで,自己位置推定には Autoware の ndt_scan_matcher を利用.走行回数/距離が増えると,どうしても走行中に ロストする場合が出てくる.昨年の本走行では確認走行区間で自己位置推定をロストし,リタイア. 【方針】 “ロストしない!” 自己位置推定の実現 & “万が一のため” の自己位置復帰ロジック. 【設計】 ・オドメトリによる補完:スキャンマッチングの精度悪化をオドメトリによって補完する形にしたい. ・ロスト復帰の仕組み: Autoware の pose_initializer を参考に,自己位置復帰ロジックを作成.
  • 21. X. 自己位置推定 ~ Ndt と Odom の統合 0.はじめに マップ座標系(ndt の座標系)と odom 座標系において,変換を T_map_to_odom とする. x y z z y x Map Odom 1. スイッチを入れた段階で,map 座標系と odom 座標系の関係(変換)きまる. 2-a. スキャンマッチングとオドメトリが完璧なら,Map 座標系と Odom 座標系の変換は一定. 2-b. 実際には,短い時間間隔ではスキャンマッチングの誤差で変換が変動し,長い時間間隔で はオドメトリのドリフトが乗ってきて変換がずれてくる. x y z Map z y x Odom z y x z y x x y z Map x Odom z y 短い周期では,スキャンマッチングの誤差 で,真値近辺で振動するイメージ. 長い周期では,オドメトリのドリフトでズレが 広がっていくイメージ. x y z z y x Map Odom スキャンマッチングとオドメトリの良いとこどりしたい!つまり,,, “短い周期ではオドメトリを使って,長い周期ではスキャンマッチングを使いたい.”
  • 22. X. 自己位置推定 ~ Ndt と Odom の統合 1.バッファリングされている要素(前提条件) 直近一定時間内における有効な Ndt 位置(Map 座標系),Odom 位置 (Odom 座標系),Ndt と Odom の変換がバッファリングされている. バッファリングされている Ndt 位置と Odom 位置で時間的に近いものをとって,変換を計算. t t x y z x y z x y z x y z x y z x y z x y z x y z x y z x y z x y z x y z x y z x y z t T_map_to_odom Ndt 位置 Odom 位置 2.バッファリングされている変換の平均をとって,現在のシステ ムにおける T_map_to_odom とする. + + + 3.新たな Ndt 位置の有効/無効判定 直近の Odometry 位置との変換を計算し,現在のシステムの変換(2で計 算)と比較.差分が一定以内にある場合,この Ndt 位置を有効であるとしてバッ ファリング. Ndt の短期的な振動は平均化で緩和し,オドメトリのドリフトはバッファサイズを決め ることで良いとこどりできた.(EKF を使おうとしたが,ロバストにできなかった.)
  • 23. X. 自己位置推定 ~ 自己位置推定ロスト時の復帰 1.ロスト判定 下記の指標をロストの判定に用いる. • 最適解までの収束回数.(ndt_scan_matcher) • 最適解のスコア.(ndt_scan_matcher) • Ndt 位置の有効/無効判定結果.(Ndt と Odometry の統合) 上記指標をモニタリングし,発生回数が一定以上になった段階でロストと判定する. ※1.上記事象が発生した場合には,Ndt 位置と Odometry 位置の変換(前 述)は更新されていない. ※2.最適解のスコアは環境によって変動するので,直近の収束解に対する値を比 較対象としてバッファリングしておき,この値に対する比の形で閾値を設けた. 2.現在の推定位置を中心として,正規乱数で粒子を生成. (Autoware の pose_initializer の実装を参考にさせていただいた.) z y x 粒子一つ一つに対してスキャンマッチング.推 定位置と真値の乖離が大きい場合なかなか収 束しないので,ロストしている間にオドメトリでど こまで位置精度を保てるかが重要. 3.スキャンマッチングと復帰位置の選択 (ndt は Autoware 実装を使わせていただきました.) スキャンマッチングのスコアが最もよかった粒子に対して,下記のチェックを実施. • 現在のシステム位置と比較し,解離が一定範囲内. • ロスト前の最適解のスコアと復帰位置候補のスコアとの比較. 上記の条件が満たされた場合,復帰位置が確定する. 【注意事項】 位置がロストした際にロボットの動きを止めてしまうと,Ndt が毎回同じ 局所解に陥ってしまう.この場合,解が局所解に陥っているのか正しい解 が求まっているのか判断ができなくなるため,位置がロストしてもロボットを 動かす必要がある. 本システムでは,走行速度を落とす仕様とした. 幸いなことに,全走行を通して自己位置ロストは一度も起こらず.
  • 24. X. 局所的経路計画 ~ 概要 【背景&動機】 PurePursuit Controller による固定ウェイポイントの単純追従を実装していたが,問題が発覚. 1.自己位置推定のズレにより,ウェイポイントと静止物体が重なった場合. 2.植生等の変化で,ウェイポイントが衝突判定された場合. 上記のようなケースで走行を中断してしまう. 【方針】 “ちょっとだけ柔軟な” 局所的経路計画(ローカルプランニング)を実現する. 【設計】 完走への不安要素となるため,事前に与えたパスから大きく外れたくない.これを実現するため,事前に与えたパスの近傍でのみ経路変 更を実施する方法をとった.
  • 25. X. 局所的経路計画 ~ 簡易経路生成 1.レファレンスパスに対するウェイポイント水増し. データ取得時に取得したパス(ウェイポイント)をレファレンスとして,左右方向にそ れぞれ n(本) のパスを一定間隔 dy (m) で生成する. 2.全ウェイポイントに対する衝突チェック 水増ししたウェイポイントすべてに対して,衝突チェックを実施.下図では,赤丸が 衝突判定されたウェイポイント. 3.全ウェイポイントに対するコスト計算 個々のウェイポイントに対して,コストを計算する.主に,障害物との距離や横方向 の移動量などを用いて計算.
  • 26. X. 局所的経路計画 ~ 簡易経路生成 4.動的計画法による最適パスの探索 ステップ3にて計算したコスト総和が最小になるパスを動的計画法で計算する. ※実際の様子
  • 27. X. 障害物回避 ~ 概要 【背景&動機】 簡易経路生成を用いても小さい障害物を回避することはできるが,一定以上の迂回が必要なケースでは対応できない.ただし迂回が大 きくなると経路生成が難しく,時間的に実装が間に合わない... 【方針】 OSS(Teb Local Planner)を使った “華麗な” 障害物回避を実現する. 【設計】 障害物回避を下記2通りの方法で実装する. 1.レファレンスパスからの小さな移動量で回避できる場合. ー>前述した簡易経路生成によって,停止することなく回避. 2.レファレンスパスからの移動量が一定以上必要な場合. ー>障害物前で一定時間停止し,Teb Local Planner に切り替える.
  • 28. X. 障害物回避 ~ 簡易経路生成
  • 29. X. 障害物回避 ~ Teb Local Planner
  • 31. 今までの経験上,3~4回程度連続で完走できるレベルにないと本番での完走が覚束ないため,今年は全コースを通した自律走行の 回数をできる限り増やすことを目標とした. 【方針】 繰り返し走行して不具合を洗い出すため,実験走行では毎回3回程度通して自律走行を実施. X. 実験結果 ~ 実験走行の結果 7月 8月 9月 10月 11月 試走会2回目(7/16) ・実験走行初参加. ・手押しでの地図データ取得. 試走会3回目(9/23) ・確認走行クリア. ・全コース通し走行を実施するも,公園で停止.(不 具合発覚) 試走会4,5回目(10/21, 22) ・植生の変化でスタック発生! (簡易経路生成の実装を決断.) 試走会6,7回目(11/3, 4) ・記録走行にて完走.初公式完走. ・ロスト復帰以外の実装は完了. ・両日3回テスト走行実施. 試走会8,9回目(11/17, 18) ・ロスト復帰ロジックの作成. 本番!(11/19)
  • 32. X. 実験結果 ~ 本走行の結果 8度目の正直,達成しました! 【結果】 本走行においては, 1.静止障害物(コーン)回避 2.動的障害物との対峙・回避(他チームロボット) が発生しましたが,問題なくクリアすることができました. 歓喜するアラフォーのおじさん