AMR とは#
目標#
- 工場内の自律移動ロボットの製作
- 汎用 ROS 移動ロボットの基礎技術、資料の製作
条件#
- 既知環境内の移動
- 事前に決定されたポイント間を移動(実際の運用では荷物を乗せて複数地点を経由)
- 小型・軽量な部品の加工・組み立てを行う工場
- それぞれの工程ごとに製造装置が離れているため、工程完了後に輸送が必要
- 工場広さは中型、50m100m ほどの大きさ
- 工作機械や組み立て台は複雑な形状
- 壁面は比較的特徴が少ない
- 一部の壁には材料が立てかけられている
- 積み下ろしは人間が行う場合と「からくり」によって半自動的に積み込まれる場合がある
- からくり:移動ロボットが機械的接触を行うことで機構が作動するもの。電気的制御は用いず接触した際の力のみで稼働
- ロボットと人が通行する通路は同じレーン
- 人回避の必要性
- 通路内には荷物が置かれることはなくよく整備されている
- 通路外の部分に輸送用のコンテナーが積まれているが、これは頻繁に配置が変化する
- 通路の大部分はオレンジに塗られていて左右には白線が引かれている
- 狭い通路もあり、そちらは白線もなく、通行部分とそれ以外で見分けられない
- 照明状況は工場なので安定している
- 西陽など時間帯による変化は未検証
- 床面の反射が強い
現在使用されているロボットの概要と問題点#
- 現在稼働しているロボットはライントレース式の移動ロボット
- ラインは磁気テープ
- このライントレースロボットは 1 ステア機構
- ラインを中心に据え踏むように移動
- 近接センサーか何かが積んであり、衝突の可能性があるときは停止
- ロボットに行先をスイッチ?で指示すると移動し始める
- ロボット同士で通信は行っていなさそうに見える
- そこそこ(10 台以下)の台数が稼働していると思われる
- 移動速度は歩行速度よりも十分遅い
- ラインの更新費用が非常にかかるため、AMR に置き換えたい
現在考えている運用の流れ#
- 走行する可能性がある場所てすべてで 2d・3d 地図を作成する
- 作成した地図に後処理を施しノイズや人を除去する
- 作成した地図とホイールオドメトリをもとに自己位置推定を行う
- 自己位置推定開始の地点は地図作成開始した地点と同じ地点にするか、あらかじめ座標がわかっている地点にする(開始地点の設定を行う必要があるため)
- 実際の走行条件に合わせてロボットを走行させ、自己位置推定が破綻しないことを確かめる
- 状況が変化しても問題ないと確かめる(ex. 材料やボックス、人の移動があった時)
- 自己位置推定を行いながら輸送する経路を通り、経路を記録する ここは作成した 2d 地図からなんらかのアルゴリズムを用いて経路生成してもいいかもしれない
- 経路を設定し、経路追従アルゴリズムを用いて走行させる 実験を行うときには機器に衝突しないように常に緊急停止ボタンに手をかける
- 通路上に出現した障害物を検出できるか試す(人等衝突する可能性があるもの)
- 障害物を検出したときに安全に回避できるか試す 個人的には回避させると予期せぬ動作をする可能性があるので走行経路上に障害物が存在した場合、遠距離なら減速、近距離なら停止で対応した方が安全だと思う
- どこからどこに運ぶかを指定する仕組みを作り実際に稼働させる
使用技術と選定理由#
地図作成:3D LiDAR を用いた 2 次元・3 次元地図の併用#
- 既知環境であることから地図作成が有効
- 移動距離は中距離
- Livox Mid-360 という激安(2D より安い ←?)3D LiDAR を発見したため
- 今後 3D LiDAR の価格はさらに安くなる見通し
- 2D LiDAR を使用し、ある高さで工場内をスライスすると複数の問題が発生 ← 意外といけてるけど特定の場所で地図が作れない(自己位置が破綻)らしい
- 2 次元断面が複雑になりすぎて地図にノイズが多くなる
- 断面が単調で地図作成中・自己位置推定中の位置を推定することが難しい部分がある
- 2D の少ない情報量を使用すると壁面に立てかけられた材料やコンテナーの移動により地図の特徴が大きく失われ自己位置をロストする
- 特定の高さに存在するオブジェクトしか検出できない
- 椅子、机等特定の高さでは足しか検出できず、通行可能と判断されて激突する可能性がある
- 人か障害物なのかの検出が難しい
- そもそも出力される点群が疎で厳しい
- 3D LiDAR を使用し 3 次元地図のみを使用する場合の良い点・問題点
- 3 次元で地図を作るため、複雑なオブジェクトもしっかり地図に表すことができる
- 立体的な情報を用いることでセンサー取り付け高さへの依存性が低くなる
- 天井・床面などの情報を得られるようになり地図の特徴量が増す
- 自己位置推定は手法を選べば頑健になると考えられる
- 点群も密になりさまざまなものを検出できるようになる。とくに近距離では凄まじい解像度になるため人の検出も容易だと考えられる
- 椅子、机等の検出も可能 ← 十分密な点群を得られれば
- 出力される地図の形式が点の集まりなので見にくい
- 点群で出力されるため、干渉判定が行いにくい
- 通行可能領域が一目でわかりにくい
- 出力データが重い
- 3D LiDAR を使用し 2 次元・3 次元地図を使用する場合の良い点
- センサーから出力される点群のうち、ロボットに衝突する可能性がある高さ(0m~2m)の情報を取り出し、2 次元データに変換して利用する
- 3 次元地図と 2 次元地図をそれぞれで作成する
- 3 次元地図は自己位置推定に使用
- 2 次元地図を用いることで通行可能領域が画像として得られる
- 衝突判定が簡単に行える ← 経路を設定した段階で衝突判定を行い、安全確認
- 2 次元データのため軽量で処理を行いやすい
- 走行中、移動曲線上の周囲に障害物が検知された際に停止など
- 2 次元、3 次元地図の作成手法は Loop clese 付きの手法を用いる
- 工場内は外周部を周回できるような構造のため、ループとじこみを行うことで地図の精度向上が可能
- 地図作成のみを行うフェーズを用意しているのでループとじこみが発生して自己位置が大幅にジャンプしても問題ない
- 3 次元地図はスキャンコンテクスト付き、グラフベース、LIO(LiDAR イナーシャ オドメトリ)付きのものが良い。優先度は LIO>>>グラフベース>SC 現在は軽さ、単純さ優先の場合は FASST-LIO と Gmapping・精度優先で SC-LIO-SAM と SLAM ToolBox を使用
自己位置推定:ホイールオドメトリと hdl localization の併用#
- ホイールオドメトリとはモーターの回転数から移動量を推定する技術
- 機構の種類、機構のパラメーター(車輪径、トレッド幅等)から数学的に導出できる
- 微小時間あたりの回転量をもとに微小移動量を計算し、それを足し合わせる事で自己位置を推定
- amr_hw_control では BLV-R のモーターに搭載されているエンコーダーから回転速度を取得し計算している
- パラメーターのミスマッチやホイールのスリップによって徐々に誤差が積算
- とくに回転の積算誤差が自己位置推定の精度に致命的な影響をもたらす
- 内界センサーの限界=積算誤差
- 3d 地図を用いた自己位置推定手法:hdl localization
- 2d 地図での自己位置推定はモンテカルロフィルターなどを用いた手法やスキャンマッチングを用いた手法が有名
- 今回の環境では複雑すぎ、あるいは環境の変化が大きすぎて厳しいと判断
- Livox の LiDAR でも動作する hdl localization の使用を決定
- NDT スキャンマッチングベース、IMU の情報も使用できる手法
- odom→base_link の tf を渡すことで map→odom の tf を修正しながらパブリッシュしてくれるため、ホイールオドメトリオンリーの場合との比較が可能
経路生成:手動操縦した結果を保存・呼び出し#
- ROS の標準的な自律移動パッケージの move_base では 2d 地図と初期位置、目標位置から global な経路を計画する
- この経路生成は壁からの距離などを用いて評価関数が最小となるような経路を目標位置が与えられるたびに計算する
- ゴール位置が決定されている、工場内の部品搬送の用途においては毎回生成する必要はない
- 実際に走行してほしい経路を直接記録したほうがそれぞれの事情に合わせることができ有効であると判断
- たとえば、ロボットは通行可能だが通行してほしくない領域が存在する場合など地図の設定が難しい場合など
- ある程度移動するごとに hdl localization から推定した位置・姿勢を txt ファイルに追記する
- 現在の設定では 0.25m ごと
- 記録した経路を呼び出すときには txt ファイルから path トピックとして呼び出す
- txt ファイルを適宜修正することも可能
経路追従#
- 呼び出した経路と現在位置をもとに速度指令値を生成する(path + odom → cmd_vel)
- 経路追従手法は研究が盛んでさまざまな手法が提案されている
- 滑らかで予想しやすい挙動を示すコントローラーのほうが安全だと考えられるので車両制御でよく用いられる pure pursuit を採用
- 経路上の一定距離先にある target フレームと現在位置を円弧補完し、その円弧に沿うような速度指令値を生成する
- target フレームにある程度近づくと target フレームを更新する
- もともとアッカーマンジャントー機構用に作られたアルゴリズムのため、最大ステアリング角などの制限を適用できる
- つまり、対向二輪ではすこし自由度が落ちる(その場旋回をするような指令値は生成されないなど)
障害物検知・回避#
- 検討中