つくばチャレンジ2023 筑波大学知能ロボット研究室チームAquaの取組み

この記事は [筑波NSミライラボ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tsukuba-ns-mirailabo) 17日目の記事です．

# 1. [つくばチャレンジ](https://tsukubachallenge.jp/2023/)とは
「つくばチャレンジ」は，2007年から毎年実施している，つくば市内の遊歩道等の市街地で移動ロボットが自律走行する技術チャレンジです．人々が普段使っているあるがままの**実環境（リアルワールド）における，自律走行技術の進歩を目的**としています．研究者と地域が協力して行う，先端技術への挑戦と公開実験の場です．下記に示す共通の課題に取り組み，**数回の実験走行を経て，本走行での一発本番の走行**に挑みます．

2023年度は，**全76チーム，約450名**の参加がありました．
⇒[チーム・ロボット一覧](https://tsukubachallenge.jp/2023/teams/list)


## 1.1 [コースと課題](https://tsukubachallenge.jp/2023/regulations/tasks)
### a. [課題コース](https://tsukubachallenge.jp/2023/wp-content/uploads/course_2023.png)
つくば市役所庁舎南側をスタートとして，市役所庁舎外周を一週回ったのち，研究学園駅南口交差点，研究学園駅前公園内の折り返し地点を通過して，市役所庁舎南東側のゴールへ戻る，**スタートからゴールまで約 2 kmのコース**です．
※2022年度からコースが少し変わりました．

### b. 課題
必須の課題と各チームが自由に実施を選択できる選択課題があります．
2023年度はコースの変更に伴い，難易度がUPした選択課題，配送の課題が新たに設定されました．

- **必須課題**
スタートからゴールまでの課題コースを自律走行すること

- **選択課題A　事前計測なしエリア通過** 
事前にロボットを走行させたり計測ができないエリア（市役所庁舎内）を自律走行すること

- **選択課題B　信号認識横断** <font color="red">難易度UP</font>
横断歩道で，歩行者用信号機と交差点内の安全を認識して，自律的に走行開始して横断すること
※横断歩道2ヶ所・往復で計4回の自律横断が必要

- **選択課題C　チェックポイント通過＋経路封鎖迂回**
公園内の指定されたチェックポイントをすべて通過し，経路封鎖の看板が置かれているコースを迂回すること

- **選択課題D1　集荷地点と配達先への訪問** <font color="red">New!</font>
集荷ボックスに接近して配達先を認識したのち，指定の宅配ボックスに接近すること

- **選択課題D2　荷物の回収と配達** <font color="red">New!</font>
D1において，集荷ボックスに置かれた荷物をロボット自身が回収し，指定の宅配ボックスに入れること

## 1.2 [課題達成の評価](https://tsukubachallenge.jp/2023/regulations/evaluation)
つくばチャレンジは，先端技術への挑戦と公開実験の場であり，順位をつける競争（コンテスト，コンペティション）ではないため，**タイムによる順位付けや賞金はありません**．
ただし，本走行において，完走かつ選択課題を2つ以上成功した場合には，**つくば市長賞** が授与されます．
各チーム「完走」さらには「つくば市長賞」を目指して，課題に取り組みます．


# 2. チームAqua紹介
背景の説明が長くなりましたが，チームAquaを紹介します．
[筑波大学知能ロボット研究室](https://www.roboken.iit.tsukuba.ac.jp/)のチームの1つです．

初出場は，2019年で，今回が5回目の出場になります．
2023年度は，7名のメンバー（M2:2名，M1:4名，B4:1名）で課題にチャレンジします．

## 2.1 機体と仕様
Aquaの外観を示します．サイズはW490mm×L630mm×H1100mm，重量約30kgです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/581e1cde-83db-12db-2fa4-e25e475ec594.png)


ハードウェアとソフトウェアについては以下の通りです．
### a. ハードウェア構成
- 差動2輪駆動方式：前輪2輪が駆動輪，後輪キャスタ
- モータドライバ：T-frog
- バッテリ：リチウムイオン二次電池 25.2V, 5.3Ah ×6
- 3D LiDAR：Velodyne VLP-16 ×1（自己位置推定に使用）
- 2D LiDAR：北陽電機 UTM-30LX ×1（障害物検出に使用）
- GoPro HERO10 ×1（信号・配達先ラベル認識に使用）
- CPU：Intel Core i7-9700K
- GPU：GeForce GTX 1050Ti
- RAM：32GB

### b. ソフトウェア構成
- OS：Ubuntu18.04
- ROS1 (Robot Operation System)
- Autoware.AI

## 2.2 つくばチャレンジ2023での目標
2022年度は（コースは若干違いますが）公園の折り返し地点を通過して，復路の横断歩道を渡ったところで，自己位置推定がうまくいかず，フェンスに衝突しそうになってリタイアしました．
2023年度は，**安定した再現性が高い走行を目標**として，課題コースの完走と２つの選択課題達成によるつくば市長賞を目指して取り組みました．
- **ミニマムサクセス：完走**
- **フルサクセス：選択課題B（信号認識横断）+ D1（集荷地点と配達先への訪問）**

## 2.3 手法
コースを自律走行するための方法について紹介します．

### a. 地図と自己位置推定
自己位置推定のために3次元の環境地図を予め作成します．事前にコースをマニュアル操作で走行させて，ロボット上部に搭載した3D LiDAR(Velodyne社製 VLP-16)のデータを取得します．そして，[LeGO-LOAM](https://github.com/RobustFieldAutonomyLab/LeGO-LOAM)という手法を用いて，3次元点群地図を作成しました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/25d60fff-751d-b165-540b-66e665d75701.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/70184767-d993-71bb-075b-efbaf451c655.png)



自律走行させる際には，事前に作成した地図と現在センサで取得している点群のマッチングを行うことで，地図上でロボットがどこにいるかの自己位置を推定します．実装にはROS1をベースとした自動運転システム用オープンソースソフトウェアである[Autoware.AI](https://github.com/autowarefoundation/autoware/tree/autoware-ai)のndt_matchingを利用しました．NDT(Normal Distribution Transform) スキャンマッチングとは，地図とセンサの膨大な点群の位置合わせを高速に行うために提案された手法です．

少し見づらいですが，自己位置推定の様子を以下に示します．事前に作成した白色点群の地図に対して，色付き点群で示されている現在3D LiDARで取得された点群を合わせるように自己位置が推定されています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/58ce4d0b-b953-51ee-7abb-06df5f72e3fb.png)

※環境地図生成・自己位置推定（NDTスキャンマッチング）については，[この辺](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwiP8tXT-oyDAxULZ94KHbeVBHcQFnoECAsQAQ&url=http%3A%2F%2F4c281b16296b2ab02a4e0b2e3f75446d.cdnext.stream.ne.jp%2Frandc%2Fmirai%2F1-3_Localization.pdf&usg=AOvVaw1K1vyhFiU1Hba-OvYBNHr-&opi=89978449)を参照されるとよいと思います．


### b. 自律移動
コース内を走行する経路（大域的経路：グローバルパス）を予め設計して，その経路を辿るように走行させます．まず，自己位置推定しながら走らせたい経路をマニュアル操作で走行させて，移動軌跡を記録します．移動軌跡のデータを間引いた経由点（ウェイポイント）列を，走行させたいグローバルパスとして設定します．

実際の環境には，人や他のロボット，障害物が存在するため，設定したグローバルパスに追従しながら，障害物を回避する必要があります．実装では，ROSの [teb_local_planner](http://wiki.ros.org/teb_local_planner/Tutorials) を用いて，車体前方に取り付けた2D LiDAR（北陽電機社製 UTM-30LX）で検出した障害物を回避しながら，設定したウェイポイント列に追従する少し先までの経路（局所的経路：ローカルパス）をリアルタイムに計画しながら走行させます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/62fdb71e-d051-2d78-0c92-51b21b96104b.png)



### c. 選択課題B　信号認識横断
横断歩道の道路端で一時停止して，歩行者用信号機が赤から青に変わって，横断歩道上に車両がいないことを確認したら自律で走行を開始して，赤信号になる前に横断歩道を渡りきるという課題です．
※2023年度から，横断歩道2か所・往復の計4回の成功が必要になります．

信号認識横断には，ロボット上部に搭載したGoProカメラを使用しします．取得した画像に対して，深層学習による物体検出器である[YOLOv8](https://github.com/ultralytics/ultralytics)を用いて，赤信号と青信号，車を認識させます．特に逆光の際に認識が難しいので，時間を変えて撮影した画像を用いて，赤信号と青信号を学習させました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/e946556f-d139-5ef5-6798-7a8260e65aac.png)


### d. 選択課題D1　集荷地点と配達先への訪問
2023年度から新規導入された課題です．
公園内の緑の集荷ボックスに接近して，配達先ラベル(a,b,c)を認識して，指定されたエリア内のどこかにある青色の宅配ボックスに50 cm以内まで近づいて3秒間停止する，という課題です．

- **配達先ラベル認識**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/b3e3c6e3-cafc-8f08-1b07-28025dec45f0.png)

配達先ラベルの認識には，画像から文字を認識する[PyOCR](https://pypi.org/project/pyocr/)を利用します．
配達先認識の手順は以下の通りです．
① 集荷ボックス検出
　GoPro画像からOpenCVを用いて，色の閾値を設定して集荷ボックスの緑色の領域を抽出し，最大領域の輪郭抽出します
② 集荷ボックスに貼付された配達先ラベル画像の抽出
　集荷ボックスを検出した枠に対して，配達先ラベルが貼られている領域を切り出し，二値化します
③ 配達先の文字認識
　②の画像をPyOCRに入力して，文字認識する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/7995ff31-3b16-1b56-ecd9-d9351426fdb7.png)


- **配達先への訪問**
配達先ラベルの認識結果に従って，宅配ボックスが置かれている範囲へ移動します．宅配ボックスは，[指定の範囲](https://tsukubachallenge.jp/2023/wp-content/uploads/delivery_area_2023-2.png)内のどこに置かれているか分からないので，範囲内を走行してボックスを見つける必要があります．
今回は各配置範囲に対して，ボックスを見つけるための探索経路を予め設計しておき，走行中にボックスを見つけたら接近位置を決定して，その点まで移動するという方針にしました．青色の宅配ボックスの検出には，集荷ボックスと同様に色による抽出を用いました．




# 3. 本走行の結果
⇒ [本走行の記録](https://tsukubachallenge.jp/2023/records/final)
⇒ [本走行の様子(YouTube)](https://www.youtube.com/watch?v=lf-L6gyJUB8) 　 [Aaua出走](https://www.youtube.com/watch?v=lf-L6gyJUB8&t=1h30m32s)　[横断歩道～公園](https://www.youtube.com/watch?v=lf-L6gyJUB8&t=1h51m20s) 

**選択課題D1実施の途中で走行できなくなりリタイア，残念！**
- スタートから交差点の横断歩道まで到達
- 選択課題B：信号認識横断<font color="blue">失敗</font>（諦めて手動での横断に切り替え）※自律走行は継続可
- 公園内へ到達
- 選択課題D1：集荷ボックスの文字認識<font color="blue">失敗</font>（aをbと認識）
  - 配達先bに向かう，宅配ボックスを発見
  - 接近位置がベンチとに近い位置に設定されてしまい，近づこうとするが障害物回避が働いて到達できず，右往左往した挙句に，センサで障害物が見えない後進でベンチとボックスの間に無理に侵入して動けなくなり：<font color="blue">**リタイア**</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/9a03250e-c1d3-8840-2a77-780cd0d94253.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625698/91f09fe4-2470-7520-2c4d-8289f6f1d34d.png)



宅配ボックスに近づけない場合には選択課題D1は諦めて，完走を目指すような仕組みも用意していたのですが，バグで動かなかったようです．．．
いろんなことを想定した事前の準備が大切ですね．

スタックした位置から自律走行を再開させたところ，ゴールまで無事たどり着きました．
完走できるポテンシャルはあっただけに残念！

**来年度以降の活躍にこうご期待！**