LoginSignup
12
10

More than 1 year has passed since last update.

マルチECUシミュレーション環境・箱庭がCANデータをROS2で可視化する!

Last updated at Posted at 2022-08-12

概要

結論から言いますと,こういう環境が出来ました.
image.png

おそらくですが,上記のようなシミュレーション環境はオープンソースベースでは初めてではないのか?と思ったりしています.

理由

  • オープンソースベースの AUTOSAR 実装はないと思われる
  • オープンソースベースの RH850 のマイコンシミュレータはないと思われる(QEMUもやってない)
  • オープンのソースベースで時間同期を含んだマルチECUシミュレーション環境はないと思われる
  • さらに ROS2 でのCAN通信データのビジュアライズまでやっているのはあんまり聞かない.

なぜこういう環境を作れたのか?

TOPPERS箱庭WGがこれらの要素技術をすべてそろえてくれていた.

前提環境

本環境は,Docker 上で環境構築しています.
なので,OSの要件は以下の通りです.

  • OS
    • Docker が動作する OS(WSL2, Linux, Mac)

なお,本環境のベースとなる情報は以下を良記事を参照ください!

利用手順

リポジトリ取得

git clone -b hako --recursive https://github.com/toppers/hakoniwa-ecu-multiplay.git

docker イメージを作成する

cd hakoniwa-ecu-multiplay/hako
bash docker/create-image.bash 

端末を 5 個起動する

マルチECU環境なので,端末をたくさん立ち上げないといけないです...

  • 端末A:箱庭マスタ機能の起動用
  • 端末B:AUTOSARベースのCAN通信サンプルアプリ起動用
  • 端末C:CANデータをROS2変換するROS2ノード起動用
  • 端末D:ROS2トピック観測用
  • 端末E:箱庭コマンド実行用

上記端末を立ち上げたら,以下の要領で docker コンテナを起動します.

端末A:箱庭マスタ機能の起動用

bash docker/run.bash

端末B:AUTOSARベースのCAN通信サンプルアプリ起動用

bash docker/attach.bash
cd $HAKO_WS_CAN

成功すると,CANプログラムが存在するディレクトリに移動しています.

# pwd
/root/workspace/a-comstack/can/target/hsbrh850f1k_gcc/sample

端末C:CANデータをROS2変換するROS2ノード起動用

bash docker/attach.bash

端末D:ROS2トピック観測用

bash docker/attach.bash

端末E:箱庭コマンド実行用

bash docker/attach.bash

マルチECUシミュレーション実行準備

端末A:箱庭マスタの起動

hako-master 1000 10000

成功した時のメッセージ:

START
INFO: shmget() key=255 size=7040 

端末B:CAN通信プログラムの起動

hako-proxy ./proxy_config.json

成功した時のメッセージ:

add_option:/root/athrill-target-rh850f1x/athrill/bin/linux/athrill2
add_option:-c1
add_option:-i
add_option:-d
add_option:device_config_with_can_hako.txt
add_option:-m
add_option:memory_with_hako.txt
add_option:atk2-sc1.exe
INFO: PROXY start

端末C:CANデータをROS2変換するROS2ノードを起動

bash run.bash can_proxy rx

成功した時のメッセージ:

START:can_proxy_rx_node

端末E:箱庭コマンド実行する

ここまでで事前準備終了です.

まずは,箱庭コマンドで,箱庭アセットが登録されているか確認しましょう.

# hako-cmd ls
athrill_test_node
can_proxy_rx_node

上記のように2個のアセットが登録されていることがわかります.

次に,箱庭のシミュレーション状態をみてみましょう.

# hako-cmd status
status=stopped

シミュレーション停止状態ですね.

ということで,シミュレーション開始しましょう.

# hako-cmd start
start
# hako-cmd status
status=running

こうすると,これまでの端末上でログが出てきますが,まだ動きません.
なぜかというと,CAN通信プログラムを実行するマイコンシミュレータAthrillがデバッグモードになっているためです.

端末Bを見てみましょう.

pid:127
monitring:
exec_args_count=8
the_args[0]=/root/athrill-target-rh850f1x/athrill/bin/linux/athrill2
the_args[1]=-c1
the_args[2]=-i
the_args[3]=-d
the_args[4]=device_config_with_can_hako.txt
the_args[5]=-m
the_args[6]=memory_with_hako.txt
the_args[7]=atk2-sc1.exe
core id num=1
ROM : START=0x0 SIZE=1024
RAM : START=0xfede8000 SIZE=512
DEV : START=0xffff0000 SIZE=1024
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_HAKO_ASSET_NAME = athrill_test_node
DEBUG_FUNC_HAKO_ASSET_NAME = athrill_test_node
DEBUG_FUNC_HAKO_PUB_0 = channel0/CAN_IDE0_RTR0_DLC8_0x001/0
create_channel: id=0 size=28
DEBUG_FUNC_HAKO_SUB_0 = channel0/CAN_IDE0_RTR0_DLC8_0x123/1
DEBUG_FUNC_HAKO_SUB_1 = channel0/CAN_IDE0_RTR0_DLC8_0x122/2
DEBUG_FUNC_HAKO_SUB_2 = channel0/CAN_IDE0_RTR0_DLC8_0x003/3
DEBUG_FUNC_HAKO_SUB_3 = channel0/CAN_IDE0_RTR0_DLC8_0x004/4
DEBUG_FUNC_HAKO_ASSET_NAME = athrill_test_node
DEBUG_FUNC_FT_LOG_SIZE=1024
[DBG>
HIT break:0x0
[NEXT> pc=0x0 prc_support.S 256

こんな感じで,0x0番地でブレーク状態になっています.

さっそく,cコマンドで,Athrillのシミュレーションを開始すると,以下のように動き出します.

c
[CPU>
TOPPERS/ATK2-SC1 Release 1.4.2 for HSBRH850F1K (Aug 12 2022, 21:12:59)

== finished StartupHook ==
== Can_Init ==
== CanIf_ControllerModeIndication(0, 2) ==
LOADED: PDU DATA

CANデータ送信するログ(例):

== CanIf_TxConfirmation(3) ==

[FCN0] Can_Write(3) CAN-ID:0x1
DATA[0]:0x5
DATA[1]:0x6
DATA[2]:0x7
DATA[3]:0x8
DATA[4]:0x9
DATA[5]:0xa
DATA[6]:0xb
DATA[7]:0xc

== finished SendTask ==
== CanIf_TxConfirmation(3) ==

端末D:ROS2トピック観測する

端末Dで,ROS2トピック観測する準備をします.

source install/setup.bash

この状態で,トピック一覧を見てみましょう.

ros2 topic list
/channel0/CAN_IDE0_RTR0_DLC8_0x1
/parameter_events
/rosout

/channel0/CAN_IDE0_RTR0_DLC8_0x1 というのが,送信されているCANデータのROS2トピックになります.

では,これを見てみましょう.

ros2 topic echo /channel0/CAN_IDE0_RTR0_DLC8_0x1

こんな感じで,CAN通信データのヘッダ情報と中身のデータが見えますね!

head:
  channel: 0
  ide: 0
  rtr: 0
  dlc: 8
  canid: 1
body:
  data:
  - 39
  - 40
  - 41
  - 42
  - 43
  - 44
  - 45
  - 46

デモ

操作イメージのデモはこんな感じです.

multi-ecu.gif

その他

今回はCAN通信モジュールのシミュレーションしかお見せしていませんが,RTEを含めたシミュレーションも可能です.

また,本シミュレーション環境は,GitHub Codespacesでも体験できるようにしたいと考えておりますので,乞うご期待ください.

お知らせ:箱庭もくもく会

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

12
10
1

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
12
10