AIチャレンジに参加したいけどubuntu～autowareは初めて！な方へ

## 目的
AIチャレンジに参加したい（してしまった）けど、ずーっとwindows環境でプログラム書くこと無くMATLAB/simulinkでお仕事してきたので、Linux(Ubuntu)、Docker(rocker)、ROS2、autoware、おまけにｃ++まで知らない～という方（昨年の私）向けに、AIチャレンジを進めていく上でちょっとでも参考になればと作成してみました。
（ざっくりとしか書いてませんので、具体的なやり方、詳細等は、googleさんに聞いてください。）

:::note info
ということで、AIチャレンジ（ubuntu～autoware）歴１年程度ですので、間違ってたり、もっといいやり方あったり…すると思いますので、ご指摘等ぜひともコメントお願いいたします:pray:
:::

## 目次
1. Linux(Ubuntu)
1. Docker(rocker)
1. ROS2，autoware
1. ｃ++（おまけ）
1. 最後に

## 1. Linux(Ubuntu)
まず、セットアップでAWSIMとAutoware(Rviz2)が起動できるところまで到達するのが大変ですが、とにかくnvidia-smiの画面が出るまでがんばりましょう！（なんか変？な時は、潔くOSから再インストールした方が早いと思います［手順から外れて修復できるほど詳しくない場合］。）
それと、一通りセットアップが終わってうまく動くようになったら、アップデートはしないほうが良いと思います（特に締め切り直前）。以前にアップデート後に表示がおかしくなってOS再インストールする羽目になりました。
カレンダー前日にいいものがあります。

https://qiita.com/porizou1/items/ee08248be35e60debda0

* 端末(Terminal)
端末にautowareのlogが大量に出力され、また動作確認等のためにも出力させると思いますので、fontとスクロール行数を変更して表示量が多くなるようにしておくとよいです（保存はscriptコマンドもあるが、コピペで済ますならスクロール行数を多くしておきたい）。
またwindowsに慣れている方は、ショートカットも変えた方がストレスは減ります（コピーと貼り付け）。
* アプリ
昨年大会はパラメータ調整でyamlファイルを大量に編集する必要があったためwinmergeを、またtopic等の文字検索にGrevを使いたくて、wineをインストールして使ってましたが不安定だったので、今はMeldとSearchmonkeyを使ってます（結構探してやっと見つけたがLinux使いには有名？）。
エディタは、当然のことながらviやEmacsなど使えるわけもなく最初の頃は付属のgedit（←アプリ名最近知った）を使ってましたが、今はVSCode使ってます、使いこなせてないけどそれでも便利です。
あと、GitHubまだわかってません。git cloneで落とすしかできない…

## 2.Docker(Rocker)
これは全く知りませんでした。「# Rockerコンテナ内で」とさらっとコメントがあり、流れからRocker起動後のこととは思いましたが、起動した端末そのものなのか？他の端末でも起動後ならいいのか？複数起動する（できる）のか？のレベルでした（仮想環境、初めて〜）。で、googleさんに聞いたところ、以下のようです。
　イメージ：docker pull（落とすの時間掛かる）で入手するファイルたち
　（数GBのやつ。ローカル（ホスト）HDDのどっかに保存されている。）
　コンテナ：上記イメージを起動(docker run)した実行環境
　（１つのイメージから複数起動可。それぞれ独立している。）
　Rocker：直接docker runするのは大変らしくて、よろしくしてくれる
　（なので、Rockerコンテナ＝Dockerコンテナ。）

ということで、「# Rockerコンテナ内で」は、コンテナを起動したorコンテナに入った［下記参照］端末で実施してね、であって、横の端末でコンテナ起動したからｏｋ〜というわけではありません（コンテナ起動or入ることができると、端末のプロンプトに表示されるディレクトリが`~`［ホームディレクトリ］に変わり、ファイル等がホストHDDと異なる）。そのため、AWSIMとAutowareのように複数アプリをコンテナ内で実行したい場合、アプリを実行したい端末毎にコンテナ内にいる必要があります。
このとき、各端末でそれぞれ起動[`bash run_container.sh`※]すると独立したコンテナになりますが、１つの端末でコンテナ起動した後、別端末からそのコンテナに入ることもできます[`docker container exec -it コンテナ名 bash`]。コンテナ名（他にも何かと使う）は設定していないと起動毎に変わるので`docker container ls`で調べる必要がありますが、コンテナ起動時に、`--name container_ai`のようにオプションで名前を指定すると固定できます（同じ名前で複数起動できないので、複数起動時はnameを変えるかrun_container.shのように指定しない）。
　※aichallenge2023-racing/docker/train内

:::note info
私はなんとなく同じコンテナ内のほうがいいのかなと思い、AWSIMとAutoware実行はコンテナ１つ起動して、他の端末はそのコンテナに入る方法で行ってます。
（カレンダー前日の[porizou1](https://qiita.com/porizou1)さんも`docker exec -it`で入られているので、こっちのほうがいい？）
:::

なお、コンテナを起動してもイメージは変更されず、起動したコンテナ内で作成，変更されたファイルはコンテナ終了（exitコマンドや無理やり端末閉じる［コンテナ起動中に閉じようとすると確認が出る］等）で消えてしまうので、log等保存したい場合は、コンテナ終了前に`docker cp`でホストHDDにコピーしておく必要があります（よく消してしまった）。
一方、コンテナ内からホストHDD上のyamlファイル等を読めているっぽいのが謎でした（私だけ？）が、これはコンテナ起動時にホストHDD上のディレクトリが指定されているからみたいです(run_container.sh内の`--volume ../aichallenge:/aichallenge`部分)。これは複数指定できるようなので、例えば、`--volume $HOME/ai2023s:/ai`を追加しコンテナ内の`/ai`にアクセスすれば、ホストHDD上の`$HOME/ai2023s`にアクセスでき、ファイル保存したり、予め`$HOME/ai2023s`に用意したシェルスクリプトをコンテナ内から実行[`/ai/〜.sh`]できます（最初の頃はコマンドコピペしてたのでめんどくさかった）。

:::note info
`--volume`オプション、上記でうまくいっているのですが実際は奥が深いみたいです…
:::

## 3.ROS2，autoware
これらもそんなんあるらしい程度のレベルでした。autowareを動かすのにROS2の仕組みを使っているみたいで、経路生成、操舵制御など個別の制御(node)たちをよろしく生成，起動し、それらの間で通信(主にtopic)して車両制御を実現しているようです。
まずはAutowareの動作を把握するために、AWSIMとAutowareを実行している状態で更に別の端末を開いてこれら（`ros2 node list`と`ros2 topic list -t`）のコマンドを実行すると、作動しているnodeとtopicの一覧が表示されます（これらのコマンドを実行する端末はコンテナに入らなくてもいいですが、あかんかったときもあったような…）。

:::note info
通信は、topic,service,actionとありますが、topicだけで事足りると思います（私は他の２つ使ったこと無いです）。
あと、上記`-t`オプションをつけると、topic[msg]とmsg型も取得できます（`node info`はもれなくmsgが付いてきます）。
:::

一覧だけだと誰が何をお話しているのかわからないので、`ros2 node info node名`で各nodeの通信状況、`ros2 topic echo topic名`でtopicの内容を得ることができます（`ros2 topic echo`は通信周期毎に更新されるのですごい勢いでスクロールします［Ctrl-Cで停止］。`ros2 topic echo --csv topic名`でcsv形式になりますが、可変長データを取るのが難しいです）。
これらで各制御(node)の入出力とその内容を把握できますので、制御の流れをざっくり理解できると思います（簡単に書いてますが、昨年はほぼ全部乗せautowareだったので何度も心折れました）。
`ros2 bag record topic名…`，`rqt`，`rqt_graph`（本来はこれで流れを見るのがいいんでしょうね）は、ほとんど使ったことないです。

ROS2，autowareのファイルを見たり検索したりする場合、ROS2はローカル（ホスト）HDDにもインストールしているので簡単に（といいつつ、どこにあるのか結構探した[`/opt/ros/humble`]）アクセスできますが、autowareはDockerイメージ（コンテナ）内（AIチャレンジ用や編集対象の一部ファイルは`aichallenge2023-racing/docker/aichallenge/aichallenge_ws/src`にあり）にあるためGUIやsearchmonkey等のアプリが使えませんので、ローカルHDDにDL(git clone)しておくと楽に検索できます。
```Bash:保存したいディレクトリで実行
git clone https://github.com/AutomotiveAIChallenge/autoware.universe.git
```
autoware.universeディレクトリ内を見ると、ずらっとサブディレクトリが並んでて見る気が失せますが、それぞれ大きな制御のくくりで、planningはいろいろな経路生成、controlは車両制御（駆動＆操舵）といった感じです。下の階層に進むと、src等のディレクトリやpackage.xml，CMakeLists.txtと共にREADME.md(*.md)が見つかります（作成中や無いときも）。txtファイルなのですがMD(Markdown)形式だそうで（知らんかった…）、ブラウザで見ると図も入ってきれいに表示されます（github上でそのまま見ることもできる）。ただ、フローチャートは文字列のままなので（PlantUMLらしい）別途viewerが必要みたいです。

いよいよこのあたりからパラメータ変更やプログラム作成になりますが結構な量になりそうなので、次回（あるのか？）書くことにします。今回はここまでということで…

あと、AWSIM、Rviz2は全然わかってません。AWSIM改造できれば面白そうだし、Rviz2わかれば何かと便利そうだけど、なかなかそこまで手が回らない。

:::note info
ROSとROS2は別もんみたいです。`ROS〜`コマンドとかcatkinが出てきたときはROSのお話で、`ROS2␣〜`コマンドとかcolconが出てきたときはROS2のお話っぽいです。
:::

## 4.ｃ++（おまけ）
Delphi（昔々）、mスクリプト（MATLAB）などそれなりにプログラムを書いたことはありましたが、ｃはなかったです（仕事で大量に読んだことはありますが）。ポインタとかメモリ確保/破棄とか、よくわからないし変なことすると大変！と思ってましたが、c++になってこれらを使わなくても書けるようになってました。
配列の代わりにstd::vectorがあり（msgもこれ使ってた）、普通の変数っぽく使えて範囲外アクセスしても（よくします…）ちゃんと例外が出るので、非常に助かりました。また関数の引数も参照渡し（"&"使うやつ）があり、この夏の大会は怪しいながらも結構な量のコードを書いたのですが、１度も明示的にポインタ("*")を使わずに済みました。
また、動作確認のため端末に変数の値などを出力するときに、`std::cout << 変数 << std::endl;`で変数は数値のままでもよろしく出力してくれるので非常に楽でした（int8_tはchar扱いでうまく出力できないみたい）。
ほんと、ｃ++になってよかったです（ｃなら無理でしたね…）。

## 5.最後に
多くの方にとってはふつーにご存知の内容でしょうから、当たり前のことに長々とお付き合いいただきありがとうございます。最初にも書きましたが、こーしたほうがいいよ〜とか、これは知ってる？とか、いろいろアドバイスいただけると嬉しいです。
一方、私のように何も知らないけど、AIチャレンジにちょっと手を出してみたいという方は、そもそも何から手を付ければいいのか？何をgoogleさんに聞けばいいのか？からわからないと思いますので、進めていく中で役立ちそうなキーワードを並べたつもりです。ぜひ検索してちゃんとした解説等を見てください:point_up:
（googleさん無かったら絶対無理でしたね〜皆さまの情報に感謝:clap:）
- ちょっとチーム紹介:computer:
もともと自動車の制御系開発に携わっていたこともあり、昨年１１月のJSAEメルマガをきっかけにAIチャレンジやってみよう！と思い立ちＰＣを組みましたが、その時はGPU必須で結構なおねだん（手持ち流用できたのケースくらいでほぼ新規購入のため約30万…）になったため、「PC高かった」のチーム名で参加しました（１人チームです）。
上記の通り何も知らないところからのスタートでも何とかなりますので、興味あるけどよくわからんしな〜という方もぜひとも参加してみてください。とはいいつつ、2023年度AIチャレンジsimulation大会は制御を構築しないといけないでしょうから、昨年の私にはちょっと厳しいかも…（昨年はパラメータいじるだけでも何とかなった。）

では、AIチャレンジ楽しみましょう:wave: