0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

自動運転AIチャレンジ2024決勝まで、残り2週間を切りました。
参加者の皆様、開発は順調に進んでおりますでしょうか…?

さて、前回の記事ではaccel_brake_map_calibratorを使って、
accel_map.csv / brake_map.csv のオフラインキャリブレーションを試しました。

残りのsteer_map.csvはどのように調整するのかな〜と迷っていたところ、以下learning_based_vehicle_calibrationを見つけました。

ニューラルネットワーク(3層MLP, MSELoss)で該当マップを学習させており、
システムの非線形性をうまく捉えることができるようです。

なんだかすごそう…ということでさっそく使ってみました。

先に結論です。この方法で 簡単に競技成績が良くなることはない と思います。

機械学習を使ったキャリブレーション自体は動いて、
マップCSVファイルも作成されるのですが、これを使って自動運転ができません。

具体的には、以下のようにステアリング指令値がバタついて走りません。
そしてこれは、デフォルトで提供されているsteer_map.csvも同様のようです。
そもそもマップを使ったステア補正は現状OFFされているので非推奨なのかもしれません。

ezgif-2-7da60e5819.gif

従って、steer_map.csvは使わない方がベター…と思います。
(本気でやったら効果はあるのかもしれませんが、沼な気配を感じています…)

learning_based_vehicle_calibrationの使い方

縦方向ダイナミクスキャリブレーション (accel_map.csv / brake_map.csv作成) と
ステアリングダイナミクスキャリブレーション (steer_map.csv作成) がありますが、
今回はステアリングダイナミクスのみ試してみます。

以降出てくるコマンドは、すべてdocker開発環境内で実行してください。

ステアリングダイナミクスキャリブレーション

前回同様、運営様から共有されたbagファイルを使ったオフラインキャリブレーションを試してみます。

1. 事前準備

まずは以下をaichallenge-2024/aichallenge/workspace/src/aichallenge_submit下にクローンします。基本はこのREADME.mdに沿って実行すれば動きます。ありがたや。

コマンドはこちら。

Terminal 1
cd /aichallenge/workspace/src/aichallenge_submit
git clone https://github.com/pixmoving-moveit/learning_based_vehicle_calibration.git && cd learning_based_vehicle_calibration

続いて、依存関係をインストールします。Pytorch/CUDA等、10分ほど時間を要します。

Terminal 1
pip install -r requirements.txt 
sudo apt install ros-humble-can-msgs -y

ビルドします。

Terminal 1
cd /aichallenge
./build_autoware.bash

2. 実行

データ収集モデル学習・キャリブレーションマップ作成 の2ステップで、
steer_map.csvが作成されます。

2.1. データ収集

このステップでは、各種トピックからキャリブレーション用データを取得し、CSVファイルとして保存します。
この処理はノードdata_collection_steerが担当し、以下の Sub / Pub を用います。

$ ros2 node info /data_collection_steer
/data_collection_steer
  Subscribers:
    /sensing/gnss/chc/imu: sensor_msgs/msg/Imu
    /sensing/gnss/chc/pitch: std_msgs/msg/Float32
    /vehicle/status/actuation_status: tier4_vehicle_msgs/msg/ActuationStatusStamped
    /vehicle/status/steering_status: autoware_auto_vehicle_msgs/msg/SteeringReport
    /vehicle/status/velocity_status: autoware_auto_vehicle_msgs/msg/VelocityReport
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /scenarios_collection_steering_progress: learning_based_vehicle_calibration/msg/SteeringProcesses
  Service Servers:
    /data_collection_steer/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /data_collection_steer/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /data_collection_steer/get_parameters: rcl_interfaces/srv/GetParameters
    /data_collection_steer/list_parameters: rcl_interfaces/srv/ListParameters
    /data_collection_steer/set_parameters: rcl_interfaces/srv/SetParameters
    /data_collection_steer/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:

  Action Clients:

実行コマンドはこちら。上限車速とスロットル閾値をデフォルトから変えています。

Terminal 1
source /aichallenge/workspace/install/setup.bash
cd /aichallenge/workspace/src/aichallenge_submit/learning_based_vehicle_calibration
ros2 launch learning_based_vehicle_calibration calibration_steering_launch.py max_velocity:=10.0 throttle_threshold:=50

以下のような表示が出たらOKです。

image.png

次に別ターミナルを開き、bagファイルを再生する以下コマンドを実行します。
data_collection_steerに渡せるように、IMUトピックをリネームしておきます。

Terminal 2
source /aichallenge/workspace/install/setup.bash
sudo ip link set multicast on lo
sudo sysctl -w net.core.rmem_max=2147483647 >/dev/null
ros2 bag play /output/0920_demo_interface_only/0920_demo_interface_only_0.db3 --clock --start-offset 415.0 --remap /sensing/imu/imu_raw:=/sensing/gnss/chc/imu

一応、pitch情報も渡しておきます。なくても動きそう…

Terminal 3
source /aichallenge/workspace/install/setup.bash
sudo ip link set multicast on lo
sudo sysctl -w net.core.rmem_max=2147483647 >/dev/null
ros2 topic pub /sensing/gnss/chc/pitch std_msgs/msg/Float32 "data: 0.0" -r 10

モニタリングスクリプトも実行しておくと吉です。

Terminal 4
source /aichallenge/workspace/install/setup.bash
sudo ip link set multicast on lo
sudo sysctl -w net.core.rmem_max=2147483647 >/dev/null
python3 /aichallenge/workspace/src/aichallenge_submit/learning_based_vehicle_calibration/scripts_steering/data_monitor_steer.py 

キャリブレーションに必要なデータがPubされているときは以下のような表示で、
image.png

不足していると以下のようにエラーを出してくれます。便利。
image.png

2.2. モデル学習・キャリブレーションマップ作成

bagファイルの再生が終わると、以下のようにデータが溜まっていると思います。
十分とは言い難いですが、これでキャリブレーションしてみます。

image.png

まずは、steering_0x.csv/aichallenge/workspace/src/aichallenge_submit/learning_based_vehicle_calibration下にあることを確認します。

image.png

Terminal 1で実行中のlaunchをCtrl+Cで停止させ、次いで以下を実行します。
まずはデータの可視化です。

Terminal 1
python3 scripts_steering/steering_data_visualization.py

image.png

明らかにデータが不足している感がありますが、いったん目を瞑ります。

次がいよいよ学習とマップ作成です。以下を実行します。
データが少ないので、フィルタ条件を緩和してほぼ全て学習に使用可能とします。

Terminal 1
ros2 launch learning_based_vehicle_calibration neural_network_steering_launch.py filter_vel:=100.0 filter_cmd:=100.00 filter_acc:=100.0

以下のような、フィッティング結果と学習データのヒストグラムが5つ表示されます。
steering_0x.csvに対応付いた学習結果のようです。

image.png

ここまで来れば、/aichallenge/workspace/src/aichallenge_submit/learning_based_vehicle_calibration下にsteer_map_x.csvが作成されていると思います。こちらが最終アウトプットのキャリブレーション用マップとなります。

image.png

デフォルトのsteer_map.csvとの比較がこちら。
※ 図中の Map 6 が デフォルトのマップです。

image.png

むむ、なんだかスケールが全然違うぞ…と不穏な空気が漂いますが、先に進みます。

3. シミュレーション

作成したマップを使って、自動運転シミュレーションをしてみます。

まずは、steer_map_2.csv/aichallenge/workspace/src/aichallenge_submit/aichallenge_submit_launch/data/下にコピーします。

For example, the first calibration table is valid for steering angles between 5% and 20%, the second one is valid for steering angles between 20% and 40% etc.

本来は、ステア角ごとに参照するマップを変えることを想定しているようですが、
簡単にできなさそうなのでマップは固定します。

そしてreference.launch.xmlを以下のように変更します。
ステアリング補正はデフォルトだとOFFになっていますので、ONにしています。

reference.launch.xml
  <!-- vehicle -->
  <group if="$(var launch_vehicle_interface)">
    <include file="$(find-pkg-share raw_vehicle_cmd_converter)/launch/raw_vehicle_converter.launch.xml">
      <arg name="converter_param_path" value="$(find-pkg-share aichallenge_submit_launch)/config/converter.param.yaml"/>
      <arg name="csv_path_accel_map" value="$(find-pkg-share aichallenge_submit_launch)/data/accel_map.csv"/>
      <arg name="csv_path_brake_map" value="$(find-pkg-share aichallenge_submit_launch)/data/brake_map.csv"/>
+     <arg name="csv_path_steer_map" value="$(find-pkg-share aichallenge_submit_launch)/data/steer_map_2.csv"/>

      <arg name="max_throttle" value="1.0"/>
      <arg name="max_brake" value="1.0"/>
      <arg name="convert_accel_cmd" value="true"/>
      <arg name="convert_brake_cmd" value="true"/>
-     <arg name="convert_steer_cmd" value="false"/>
+     <arg name="convert_steer_cmd" value="true"/>

      <arg name="input_control_cmd" value="/control/command/control_cmd"/>
      <arg name="input_odometry" value="/localization/kinematic_state"/>
      <arg name="input_steering" value="/vehicle/status/steering_status"/>
      <arg name="output_actuation_cmd" value="/control/command/actuation_cmd"/>
    </include>
  </group>

./run_evaluation.bashでシミュレーションを実行してみると…

ステアが暴れまくって、そもそも走れませんでした…😭

ezgif-2-7da60e5819.gif

デフォルトのマップsteer_map.csvでも同じ挙動でした…😭

正直ここの変更は沼っぽく、現状デフォルト設定で走れているなら手を入れない方が良さそうです…データ量が問題の可能性もあるので、事前練習でのbagファイルを使ってみるのはアリですが、なんとなく難しそうだなあという感想です…

おわりに

機械学習を使ったステアダイナミクスのキャリブレーションにトライしてみましたが、残念な結果に終わりました…
もう少し深堀りするか悩みますが、他にも重大な問題が山積しているので、優先度は下げようかな…と思います。
来年度以降、これに挑戦する方のために記事を残しておきます… 後は頼みます。

この記事は、AI文章校正ツール「ちゅらいと」で校正されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?