GitHub Codespaces でできる！ 仮想シミュレーション環境での車載アプリ

# 以前にGitpodでもやってましたが

数年前にもGitpodで同じような記事を書きましたがcodespacesも使えるようになったので、もうちょっと加えて車載アプリ環境を試してみました。前回との違いは次になります。

- ローカルPCでDocker環境があれば、ローカルPCでも動かせるようになっています。
- Os(TOPPERS/ATK2)だけでなく、 Com(TOPPERS/A-COMSTACK)、　Rte(TOPPERS/A-RTGEN)も追加して、CAN通信の実行も追加しました

codespacesの機能がまだいくつか実装されていないものがあるらしく、思った通りの環境にはなっていないのですが（違っていれば教えてください）メモとして書いておきます。

# 準備

- codespacesが起動するブラウザだけでもいけますが、VSCodeプラグインがあると便利です。
  - https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces
- ローカルPCで行う場合はDocker環境が必要です。


# codespacesで起動する
リポジトリ（ https://github.com/toppers/hakoniwa-ecu-multiplay ）に移動し、 `Code` から` Create codespace on main` を選択します。
![toppers_hakoniwa-ecu-multiplay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/9196c5ca-458d-049b-958d-092d04d3ead5.png)

しばらく待つと ワークスペースはクローンされた状態でターミナルは ` /workspaces/hakoniwa-ecu-multiplay` がカレントの状態で出力されます

## ローカルPCで行う場合
次のようにDockerの環境を構築して実行します
```
docker build -t hakoniwa/ecu-multiplay .
docker run -it hakoniwa/ecu-multiplay
```

# ワークスペース環境を整える
codespaces で起動すると `/workspaces/hakoniwa-ecu-multiplay` になってしまい、現状変更が難しそうなので、手動でワークスペースを整えます。（今後この作業は変わっていく予定です）
VS codeのエクスプローラから右クリックでメニューを出して、`ワークスペースにフォルダを追加...` を選択します。
（もしくは`menu` > `file` > `ワークスペースにフォルダを追加...`でもOK）
(`file` > `Add Folder to Workspace...` in English or Codespaces(for Web))
![hakoniwa-ecu-multiplay__Codespaces__—_Visual_Studio_Code_と_Slack___athrill___hakoniwa___1_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/cf9f5d24-65cc-ac48-33c8-c9cd47107ca4.png)

追加するフォルダは `/root/workspace` です。
![hakoniwa-ecu-multiplay__Codespaces__—_Visual_Studio_Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/1f4a0838-0f03-7514-268f-05cc78f2868f.png)

追加をすると エクスプローラは次のように見えます。
![未設定__ワークスペース_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/646d8524-edaf-b14e-fa6e-47c699d1b5a6.png)

workspaceの下には
- a-comstack
- a-rtegen
- atk2-sc1

フォルダが作られているので、これがあることを確認してください。

# AUTOSAR Os(ATK2)のサンプルプログラムの実行

[以前](https://qiita.com/mitsu48/items/460aa5a60ef8aac6430b#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E7%A7%BB%E5%8B%95)と同じです。
ATK2にあるsample1アプリを動かします。

## ビルド方法
```
cd /root/workspace/atk2-sc1/
mkdir OBJ ;cd OBJ
../configure -T hsbrh850f1k_gcc
cp /root/athrill-target-rh850f1x/params/rh850f1k/atk2-sc1/* .
make
```
## athrillを使った起動方法
ビルドしたディレクトリで次のコマンドで起動します
```
athrill2 -c1 -i -d device_config.txt -m memory.txt atk2-sc1
core id num=1
ROM : START=0x0 SIZE=1024
RAM : START=0xfede8000 SIZE=512
ELF SET CACHE RIGION:addr=0x0 size=62 [KB]
Elf loading was succeeded:0x0 - 0xf89b : 62.155 KB
Elf loading was succeeded:0xf89c - 0x1205c : 0.220 KB
ELF SYMBOL SECTION LOADED:index=16
ELF SYMBOL SECTION LOADED:sym_num=597
ELF STRING TABLE SECTION LOADED:index=17
DEBUG_FUNC_FT_LOG_SIZE=1024
[DBG>
HIT break:0x0
[NEXT> pc=0x0 prc_support.S 256
```
ここで表示がストップするのでターミナルから「c」を入力して、athrillの実行を継続します
```
c      <======  INPUT `c` 
[CPU>
TOPPERS/ATK2-SC1 Release 1.4.2 for HSBRH850F1K (Jul 17 2022, 09:27:45)

Input Command:
```
TOPPERSのバナーが出力され、sampleが入力待ち状態になります。入力コマンドなどについてはsample1.cに書いていますので詳しくはそちらを読んでください。

# CAN通信のサンプルプログラム
athrillはデバイスI/Oをrosトピックとして扱う機能があるので、それを活用してCANの送受信を行うことができます。
CAN通信アプリはA-CANで用意しているサンプルプログラムを使用してます。
サンプルプログラムは定期的にCANデータを送信し、受信データを出力してくれます。

## 箱庭(仮想シミュレーション環境)の構成
サンプルプログラムはathrillでシミュレーションを行い、CAN通信の対向はROSトピックのコマンドで対応します。
また別途ROSマスターが必要になります。

![alt](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuShBJqbLS7RqUzoqzN7pviVDqnythmQJQnytRNZSlF9nymA8cgByuiVD7O-RfpnkRdxSjFvnSz_ZvZsFcpkHPESzRjhvk6a_K9mBluaAkhheEXIi58ByWpM0-busD3xPlr2J2vU5U3K_xPyEripba9gN0lGV0000)

以下それぞのノードごとにターミナルコンソールが必要になります。
## ROSマスターの起動
ROSマスターの起動スクリプトは用意されていますので、そのスクリプを実行します。
```
/workspaces/mnt/master/ros-master.bash 
... logging to /root/.ros/log/a9400e2e-05b3-11ed-bf83-000d3ac8da62/roslaunch-codespaces-4a7fa1-8259.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://codespaces-4a7fa1:41219/
ros_comm version 1.14.13


SUMMARY
========

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.13

NODES

auto-starting new master
process[master]: started with pid [8307]
ROS_MASTER_URI=http://codespaces-4a7fa1:11311/

setting /run_id to a9400e2e-05b3-11ed-bf83-000d3ac8da62
process[rosout-1]: started with pid [8326]
started core service [/rosout]
```

## サンプルアプリのビルドと起動
ROSマスターとは別のターミナルを起動して次のコマンドを実行します。
```
cd /root/workspace/a-comstack/can/target/hsbrh850f1k_gcc/sample/
make can
make
cp /root/athrill-target-rh850f1x/params/rh850f1k/atk2-sc1/* .
```
これで`atk2-sc1.exe`というサンプルプログラムが生成されるので、実行します。
```
athrill2 -c1 -i -d device_config_with_can.txt -m memory.txt atk2-sc1.exe
core id num=1
ROM : START=0x0 SIZE=1024
RAM : START=0xfede8000 SIZE=512
ELF SET CACHE RIGION:addr=0x0 size=57 [KB]
Elf loading was succeeded:0x0 - 0xe680 : 57.640 KB
Elf loading was succeeded:0xe680 - 0x128c4 : 0.160 KB
ELF SYMBOL SECTION LOADED:index=16
ELF SYMBOL SECTION LOADED:sym_num=602
ELF STRING TABLE SECTION LOADED:index=17
DEBUG_FUNC_MROS_TOPIC_PUB_0 = channel0/CAN_IDE0_RTR0_DLC8_0x001
DEBUG_FUNC_MROS_TOPIC_SUB_0 = channel0/CAN_IDE0_RTR0_DLC8_0x123
DEBUG_FUNC_MROS_TOPIC_SUB_1 = channel0/CAN_IDE0_RTR0_DLC8_0x122
DEBUG_FUNC_MROS_TOPIC_SUB_2 = channel0/CAN_IDE0_RTR0_DLC8_0x003
DEBUG_FUNC_MROS_TOPIC_SUB_3 = channel0/CAN_IDE0_RTR0_DLC8_0x004
DEBUG_FUNC_FT_LOG_SIZE=1024
mros_master_ipaddr=0.0.0.0
mros_slave_port_no=11411
[DBG>mros_uri_slave=http://127.0.0.1:11411
mros_publisher_port_no=11511
**********mROS main task start**********

HIT break:0x0
[NEXT> pc=0x0 prc_support.S 256
**********mROS sub task start**********
**********mROS mas task start**********
DEBUG_FUNC_MROS_NODE_NAME = athrill_test_node
**********mROS mas task start**********
**********mROS pub task start**********
**********mROS slv task start**********
WARNING: topic [/channel0/CAN_IDE0_RTR0_DLC8_0x123] does not appear to be published yet
WARNING: topic [/channel0/CAN_IDE0_RTR0_DLC8_0x122] does not appear to be published yet
WARNING: topic [/channel0/CAN_IDE0_RTR0_DLC8_0x003] does not appear to be published yet
WARNING: topic [/channel0/CAN_IDE0_RTR0_DLC8_0x004] does not appear to be published yet
```
ここで止まるので、今度はROSトピックのターミナルを起動します。
このターミナルはサンプルプログラムのターミナルと一緒に見たいので、並べるように表示させてください。
ターミナルを分割すると並べて表示することができます。
![README_md_—_未設定__ワークスペース_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/f65c934b-d8df-d8cc-1cfa-9aa2d37d782e.png)

## ROSトピックのノードを起動
ROSの環境変数を整えてから、CAN通信を行なっているROSトピックの設定を行います。
```
source /opt/ros/melodic/setup.bash
rostopic echo /channel0/CAN_IDE0_RTR0_DLC8_0x001
```
## サンプルプログラムの実行
先ほどathrillを起動したところで止まっていた、サンプルプログラムを継続実行します。`c`を入力します。
そうするとTOPPERSがバナーが表示されてサンプルアプリからCANのデータ出力されたときに、ROSトピックがわでCANデータが表示されます。
```
c
[CPU>
TOPPERS/ATK2-SC1 Release 1.4.2 for HSBRH850F1K (Jul 23 2022, 01:41:36)

== finished StartupHook ==
== Can_Init ==
== CanIf_ControllerModeIndication(0, 2) ==
[FCN0] Can_Write(3) CAN-ID:0x1
DATA[0]:0x0
DATA[1]:0x1
DATA[2]:0x2
DATA[3]:0x3
DATA[4]:0x4
DATA[5]:0x5
DATA[6]:0x6
DATA[7]:0x7
```
VSCodeで見るとこんな感じで確認ができます。

![README_md_—_未設定__ワークスペース_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/0feb9380-3db9-2f0e-23f1-bf8310acf36d.png)

# お知らせ：箱庭もくもく会
TOPPERS箱庭WGでは，もくもく会を不定期に開催しています．
本記事の内容を実際に試してみたい方や試してみたけど詰まっている方は，ぜひご参加ください．画面共有しながら参加者同士でサポートしたり，一緒に新しい機能を実装したりと”もくもく”しましょう．

https://hakoniwa.connpass.com/