シミュレータと実機を併用した開発実習
やってみた
LED-Camp実行委員会
祐源英俊

1

発表者自己紹介
祐源英俊（ゆうげんひでとし）• 2018年 LED-Camp6参加• 2018年より実行委員（4年目）• 教材開発グループに所属• オムロン株式会社 勤務(社会人2年目)• ジャズの演奏が趣味@Ke_N_551@ken5512

この発表では組込み初学者向け開発実習 LED-Campでの教材について喋ります
実施報告とともに、ハイブリッド（実機&シミュレータ）形式の教材が• どうやって実現されたか？
• 実際に使ってみてどうだったか？などを説明します。
加えて、開発型の研修・教育活動やその教材について、議論・意見交換をしましょう！
3

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに4発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに5そもそも，ってなんなん？

• 組込み初学者（学生，社会人1,2年目など）を対象とする合宿形式の研修• アジャイル，スクラム，MDDなど開発手法の講義・実践• 競技会に向けたソフトウェアをチームで開発する実習→チーム開発のコツ・難しさなどを経験的に学べる！

6

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに7オンサイト形式のLED-Camp• 下呂温泉（山形屋）での三泊四日の合宿• 講義，開発実習，発表会など密なスケジュール• ナイトセッションを始めとする交流の機会も（今年はコロナ対策で控えめ…）• Camp7（2019年）ではLED-Tank改（右写真）を教材に使用

8

LED-Tank（実機）構成
内製拡張基板

測距センサ

モータドライバ DRV8835
各センサ接続VL53L0X ToF型
レーザーセンサー

制御コンピュータ
Raspberry Pi Model 3 B
Raspbian OS

カラーセンサ
BH1745(底面)

ラインセンサ

内製キャタピラ台車

内製エンコーダ基板

内製フォトセンサ基板

タミヤのキャタピラキット＋内製（3Dプリンタ出力）部品＋モバイルバッテリー

DCモータ＋ロータリーエンコーダー(LBT-131フォトインタラプタ使用)
9

実機を使用する開発環境
参加者PC

コード生
成
UML図（astah*上）C++
Tank制御コード(実機向け)

Tank上RasPi

C++

Tankドライバ

コン
リパンイ
クル
・a.out
実行ファイル

実行！
10

実機での競技会（Camp7より）

11

実機、持ってきてます！
とくとご覧あれ12

オンライン形式のLED-Camp• 昨年のLED-Camp9は、初の完全オンライン開催• これまでの内容に加え，オンラインコミュニケーションおよびオンラインチーム開発の経験を目的に• ロボットシミュレータWebotsを用いたバーチャル競技会を実施

13

LED-Tank（シミュレータ）構成
測距センサ
DistanceSensor(Laser)

カラーセンサCamera

ラインセンサDistanceSensor(IR)

内製3Dモデル

モータ回転角センサ

Fusion360で作成
3Dプリント用データを一部使用

Motor+PositionSensor
14

実機を使用する開発環境
参加者PC

コード生
成UML図（astah*上）C++
Tank制御コード（シミュレータ向け）

C++
Tankドライバ（シミュレータ向け）

コン
リパンイ
クル
・.exe
実行ファイル

実行！
15

シミュレータでの競技会（Camp9）16

昨年度のデモ、あります！
https://github.com/LED-Camp/LED-Camp9_SWEST23_demo

17じゃあ今年は・・・？

18

• 組み合わせてみました

19

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに20

なんでハイブリッド形式に？
ハイブリッド形式の主な目的・狙いは以下• 開発実習中のボトルネック解消• 「シミュレータでのソフト検証は大事だよね」と伝えたい• 「でもそれに加えて実機検証も大事だよね」と伝えたい• 実行委員の興味
21

開発実習中のボトルネック• 筐体の制約• 場所の制約22

開発実習中のボトルネック（筐体）
コンパイル
エラー

• 実機はチーム（3-4人）に１台ロジックのミス→分散的な開発が難しい

パラメータ
調整

• コンパイルにラズパイが必要→実機検証の手前で時間がかかる• プログラム検証で実機を占有・・・。

→狙ったプログラムの完成に時間がかかる

23

開発実習中のボトルネック（場所）• コースは全チームに対し1-2セット（タイムスライス制）

24

開発実習中のボトルネック（場所）• コースは全チームに対し1-2セット（タイムスライス制）

・・・。

・チームの作戦が検証できない
・実機での動作確認ができない
25

シミュレータの利用によるボトルネック
解消• 筐体のボトルネック：個人がシミュレータを利用して解決• シミュレータ上でビルド可否を検証可能→コンパイルエラーを個人作業に• シミュレータ上である程度の振舞は把握可能→イージーミス修正を個人作業に• 場所のボトルネック：チームがシミュレータを利用して解決• 作戦の検証を全チーム並列にできるように• 実機動作確認の代わりは狙わず
26

「なんだかんだ実物を使う検証が大事だよね」と伝えたい• 実機ーシミュレータ の完全な一致は不可能→実際のシミュレータ・エミュレータ使用時には、どこまでできるか？の理解が大事
シミュレータと実機を同時に触ることで• 「こういうところの振る舞いが違う」という気付き• 「こういう理由で振る舞いが違う」という分析• 「振る舞いが違うのでこう使おう」という工夫
27

実行委員の興味• おもしろいかなとおもったから・・・・

28

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに29

実機版・シミュレータ版のソフト構造
Tank制御コード（参加者が作成）

実行委員で実装

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

ユーザ用API

内部実装用API

各モジュールのドライバ（実機版）

内部実装用API

各モジュールのドライバ（シミュレータ版）

GPIOドライバ・ライブラリ(wiringPiなど)

Webotsライブラリ

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

ラズパイ版

シミュレータ版

30

どれくらい使いまわしたの？
Q.ほぼ同じ構造だけど、まるっと使いまわしたの？
A.Tank制御コードとその下のAPI以外は基本的に作り直しました
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API

ユーザ用API

TankコントローラTankコントローラ

ユーザ用API
各モジュールAPI
内部実装用API

ユーザ用API
各モジュールAPI
内部実装用API

各モジュールのドライバ

各モジュールのドライバ

ラズパイ版

シミュレータ版

31

各モジュールのドライバの中身は？
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

ユーザ用API

内部実装用API

各モジュールのドライバ（実機版）

内部実装用API

各モジュールのドライバ（シミュレータ版）

GPIOドライバ・ライブラリ(wiringPiなど)

Webotsライブラリ

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

ラズパイ版

シミュレータ版

32

各モジュールのドライバ実装例
ラインセンサの値を取得する getLineValue()の中身は・・・
Webotsのセンサから連続値を取得→スレッシュで区切って0/1にしてリターン

ラインセンサからのLo/Hi値をピンのinputで取得
ラズパイ版

シミュレータ版

33

各モジュールのドライバ実装例
Webotsのセンサから同名のAPIに連続値を取得→スレッシュで区切って異なるインタフェース0/1にしてリターン

ラズパイ版

シミュレータ版

34

各モジュールのドライバの中身は？
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

ユーザ用API

内部実装用API

各モジュールのドライバ（実機版）

内部実装用API

各モジュールのドライバ（シミュレータ版）

GPIOドライバ・ライブラリ(wiringPiなど)

Webotsライブラリ

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

ラズパイ版

シミュレータ版

35

メイン関数 初期化処理は？

初期化処理はメイン関数にべた書き
ラズパイ版

シミュレータ版

36メインループの中身は？
Webotsのセンサからプラットフォーム依存の部分が連続値を取得→スレッシュで区切ってやや多くなっている
0/1にしてリターン

ラズパイ版

シミュレータ版37

コントローラ部分の中身は？

Webotsのセンサからインターフェースの違いにより連続値を取得→スレッシュで区切って呼び出し側も使いまわし不可に0/1にしてリターン

ラズパイ版

シミュレータ版

38

各モジュールのドライバの中身は？
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

ユーザ用API

内部実装用API

各モジュールのドライバ
（実機版）
ガチガチ
GPIOドライバ・ライブラリ(wiringPiなど)

内部実装用API

各モジュールのドライバ（シミュレータ版）
ガチガチ
Webotsライブラリ

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

ラズパイ版

シミュレータ版

39

Tank制御コードについて
Q. じゃあ、制御コードはどれくらい共通化してるの？
A. ほぼほぼ手を加えていません！
（そもそもシミュレータ開発時に変更ないことを目指した）

参加者のコード（Tank制御コントローラ）を、• UMLクラス図・ステートマシン図からの生成• 内製APIの仕様によって、ある程度定型化していたため
40

各モジュールのドライバの中身は？
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API

ユーザ用API

Tankコントローラ、メインループ（実機版）

Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

内部実装用API
ユーザ用API
内部実装用API
ユーザ用APIで、各モジュールのドライバ各モジュールのドライバ
これより下層の実装を吸収（実機版）（シミュレータ版）
ガチガチ
ガチガチ
GPIOドライバ・ライブラリ
Webotsライブラリ(wiringPiなど)

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

ラズパイ版

シミュレータ版

41

余裕があればこうしたかった1• コントローラからプラットフォーム依存の実装を分離
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（シミュレータ版）

ユーザ用API

内部実装用API

モジュールのドライバ

ラズパイ用
抽象化レイヤライブラリ(wiringPiなど)

ユーザ用API

内部実装用API

モジュールのドライバ

Webots用
抽象化レイヤWebotsライブラリ

Raspbian(RasPi OS)

Webots

ラズパイ・筐体など

Windows PC

42

余裕があればこうしたかった2
ラズパイ用バイナリのクロスコンパイル化&オプションによる選択
参加者PC

コード
生
成
UML図（astah*上）

C++

.exe

Tank制御コード実行ファイル(実機向け)

実行！

Tank上RasPi

C++

Tankドライバ

コン
リパンイ
クル・a.out
実行ファイル実行！
43

おまけ：micro:bitの導入について• 今年度前半は、制御部分をRaspberry Piからmicro:bit（v2.2）に変更しようとしていた！
• 基板も勝手に製作（ラズパイ用基板から流用）

44

なぜmicro:bitに？
• クロス開発必要でより”組込み”ぽい• 加速度センサ・コンパスを搭載• Windowsで比較的簡単に環境構築できそう• C++で開発できる• BLEモジュール搭載でprintデバッグできそう• 調達ができた45

micro:bitでの開発

46

開発時の計画
Tank制御コード（参加者が作成）

Tank制御コード（参加者が作成）

ユーザ用API
Tankコントローラ、メインループ（実機版）

ユーザ用API
Tankコントローラ、メインループ（micro:bit版）

ユーザ用API

ユーザ用API

内部実装用API

各モジュールのドライバ（実機版）

内部実装用API

各モジュールのドライバ（micro:bit版)

GPIOドライバ・ライブラリ(wiringPiなど)

micro:bit SDK

Raspbian(RasPi OS)

RTOS
もしくはベアメタル

ラズパイ・筐体など

micro:bit

ラズパイ版

micro:bit版

47

課題点
• printfの扱いが要検討• micro:bit→BLE シリアルで出力予定だった• シリアル出力用のAPIを作成→下回りを変更、が妥当？

• 処理性能が足りるか不安• ラズパイ（Cortex-A53 1.2GHz）→micro:bit（試作→検証が必要な状況
48

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに49

LED-Camp10概要• 8/29~9/1, 下呂温泉木曽屋で実施• 参加者は9名• 社会人2名、大学院生2名、学部生1名、高専生4名• 開発チームは3人/チーム×3チーム• 開発時間は約9時間（90分のスプリント×6）• Tankで円柱を押し出す競技内容

50

開発してみてどうだった？(1/2)• 実機→シミュレータ は結構大変• 実機にあってシミュレータにない機能の代替実現手法など• 実機・シミュレータのコード共通化はすぐ• もともと同一生成コードを使うようにしていたため• パラメータ調整はかなり大変• シミュレータ・実機でとれる値を大体そろえなければならない• 筐体の個体差を減らすため、全個体で調整
51

開発してみてどうだった？(2/2)• 教材開発のため、シミュレータ固有の使いかたを習得する必要あり（他シミュレータに転用しにくい知識）• シミュレータ内のオブジェクト・API• 設定パラメータの触り方など• 「単一のプラットフォーム上で動けばよし」
から1ステップ進むので、勉強になる• シミュレータの動作が参加者PC依存なので少しハラハラする52

実行委員から見た参加者の様子(1/5)• 実機・シミュレータの使いかたについてトラブルなし• 生成コードを書き換える必要がなかったため• シミュレータでの実行手順が易しかったため• 参加者いわく、情報過多にはなっていなかった• シミュレータの動作もあまりもっさりせず• もともと、比較的軽量• V2022aでめっちゃ軽くなった？
53

実行委員から見た参加者の様子(2/5)• 序盤、中盤、終盤で活用度合いが異なった• 序盤：ほとんど使わず（実機の特性把握に注力）• 中盤：かなり使ってもらっていた（各人の要素的な開発、コンパイル・動作検証など）• 終盤：やや使ってもらっていた（同上、ただ実機直接も）終盤のコンパイルエラーはない様子
54

実行委員から見た参加者の様子(3/5)
ボトルネック解消はある程度できていたといえそう• 筐体の側面• それぞれがそれぞれの開発• 1人がシミュレータでコード整備、2人が実機で動作検証• 場所の側面• フィールド待ちの間にシミュレータで動かしつつ全員で議論• とはいえ終盤はフィールドが予約でいっぱいに55

実行委員から見た参加者の様子(4/5)• シミュレータは割り切って使ってもらっていた（はず）• 序盤・中盤は“シミュレータで実装、のちに実機で検証”の方針も• 実機に比べてシミュレータは精度がよすぎる、という理解• 「待ち時間中の作戦会議＆理想的な動作の正当性の検証」
としてのシミュレータ
56

実行委員から見た参加者の様子(5/5)
シミュレータ併用による効果？
例年に比べて• 「終盤でコンパイルエラーに焦る」が少ない• イージーミスによる想定外の動作が少ない• 競技会はどのチームも高得点• 情報共有会が盛り上がっていた
57

58

59参加者の反応は？

60

参加者の反応は？

61

参加者の反応は？

62

参加者の反応は？

63

発表目次
1. LED-Campってどんなイベント？
2. 実機TankとシミュレータTank
3. “なぜ”併用したの？
4. “どうやって”併用したの？
5. 併用して”どうだった”の？
6. 終わりに64発表まとめ• ロボットシミュレータと実機を併用したハイブリッド形式の開発研修やってみた• 開発の加速と気づきの獲得が目的（と、実行委員の興味）• 内製API以下の差し替えにより、UML→コード生成部分を流用• 概ね好評だった一方、改善の余地はアリ• 実行委員大募集中！！！！
65

ここからは・・・？
開発形式の研修（ハイブリッド形式含む）について語りあいましょう！
• デモ・ハンズオンの延長戦• LED-Camp10開催してみてどうだったの？聞きたい！
• ハイブリッド形式の研修をやってみようと思うけど・・・• ハイブリッド形式の研修やってみたらこうだった！
• こんなハイブリッド形式の研修があったよ！
66

おまけ

Ver. 2021.b

Ver. 2022.a67

原因は・・・？

Ver. 2021.b

Ver. 2022.a68