OpenELが変える組込みシステム開発
対応デバイスのさらなる増加、他システムとの連携を実現！

2022年7月29日
技術本部 副本部長 兼
プラットフォーム構築委員会 OpenEL活用WG 主査
アップウィンドテクノロジー・インコーポレイテッド
中村憲一© Japan Embedded Systems Technology Association 2022

目次
n 組込みシステム開発における課題
n OpenELとは？
n OpenELの実装例
・ 対応デバイスの増加
・ 他システム（ROS2）との連携

n 令和4年度の事業計画
n 協力者募集© Japan Embedded Systems Technology Association2

組込みシステム開発における課題

組込みシステム開発における課題
1.
2.
3.

品質保証（Quality guaranteed）
開発コスト(development Cost)の削減
納期(Delivery time)の短縮

n これらの課題を解決するためにモデルベース開発が採用されているが、モデルベース開発にも課題が存在する。

モデルベース開発における課題
モデルベース開発ツール

デバイスドライバのAPIが各社、各デバイスでバラバラアプリケーションの設計

ソースコードを自動生成

手作業で1. デバイスドライバを新規開発
品質の保証は？
2. 各種デバイスドライバと結合品質の保証は？

実機試験：不合格
デバイスドライバのソースコードの自動生成は不可能

A社製 B社製 C社製 D社製 ・・・

設計・実装見直し
開発コストの増加
納期の遅延

モデルベース開発における課題
n 組込み用の自動コード生成の品質に問題がある。
n 品質を維持するためのノウハウの蓄積が難しい。
n ドライバのコードは生成されないため、ドライバを用意する必要がある。
n なるべくプログラムを書きたくない。
・ 瑕疵担保責任を負いたくない

6

組込みシステム開発における課題
n メーカーの課題
・ ソフトウェアの開発効率
・ ソフトウェアの品質
・ 自社製以外のソフトウェアにも保証義務

n ベンダーの課題
・ 他社製のソフトウェアとの相性は保証できない・ ベンダーごとに異なるインターフェース仕様
・ ハードウェアならプラグフェストで相互接続試験を実施する機会があるが、ソフトウェアは？
7

解決策の提案
nnnnn

アプリケーションプログラミングインターフェース（API）とドライバ用のテンプレートを標準化すれば良い。
→ 開発効率UP！
→ ソースコードの可読性が向上 → レビューが容易→ バグが入りにくくなる → 品質UP!
テストパターンを自動生成し、シミュレーターによるテストの実施 → 論理などの単純なバグはここで排除
テスト後の実行コードを実機にデプロイ
実機では実機特有のテストを重点的に実施→ 工数短縮!

品質と効率を上げる組込み用のモデルベース開発を実現！
8

OPENELとは？

OpenEL活用WG
n

目標
1.
2.
3.

n

活動
・・・・・nOpenELの国内外における普及
OpenELの仕様の強化
OpenELの国際標準への提案
WGの開催（毎月）OpenELに関連しそうな技術や規格の講演会の開催（年2回）
ユーザーの増加が見込まれるデバイスやプラットフォームへの対応
開発成果の一般公開
上流から下流まで一気通貫した開発を実現するための活動

メンバー
・・

会員(5)：アップウィンドテクノロジー、エヌデーデー、チェンジビジョン、東洋大学、
UCサロン
非会員(6)：京セラ、静岡大学、シマフジ電機、
Knowledge & Experience、日立産機システム、ルネサスエレクトロニクス

10OpenEL®(Open Embedded Library)とは？
n 目的・ ハードウェアの抽象化を実現し、QCDの向上および上流から下流まで一気通貫した開発を目指す

n 背景
・ 組込みソフトウェア技術者の不足
・ 製品やデバイスの多様化（多品種少量生産）
・ 上位層との標準インターフェースの欠如

n 課題
・ 品質保証（Quality guaranteed）
・ 開発コスト(development Cost)
・ 納期(Delivery time)

OpenEL®のロードマップ
ユーザー数10000010000

・上流から下流まで一気通貫した開発の実現

1000
・ユーザーの増加
・エコシステムの構築
・各種ツールの整備
100

・対応デバイスの増加

・仕様策定

・ドライバのテンプレート

・国内外における普及・国際標準への提案

・組込み用の誰でも使えるモデルベース
開発環境の提供・Digital Twin・ドライバのシミュレー
・他システムとの連携 ター（上位層の技術者の取り込み）・ハードウェアの抽象化

10・カプセル化・QCDの向上
2011

2018

2019

2020

2021

2022

2025

2030

2040

時間

OpenEL®の何が嬉しいのか？期待される効果n

品質（Quality ）の向上
・n

開発コスト（Cost）の削減
・・・・n

・

APIが標準化されているため、異なるプラットフォーム、異なるベンダーのデバイスでもソースコードの変更が不要
テスト済みのソフトウェア部品（コンポーネント）を組み合わせることにより開発期間とテスト期間を短縮！

ソフトウェア開発力の強化
・・nn

デバイス毎に異なっていたAPIを学習する期間を削除！
ソフトウェア部品（コンポーネント）の新規開発の削減！
テスト済みのソフトウェア部品（コンポーネント）を再利用することにより開発期間を短縮！
車輪の再発明を排除！

納期（Delivery）の短縮
・n

テスト済みのソフトウェア部品（コンポーネント）を再利用することにより品質を保証！

アクチュエーターやセンサーを専門としない組込みソフトウェア技術者による制御システ
ムの開発が可能に
エンタープライズシステムの技術者によるIoTシステムなどの開発も可能に

応用範囲(シミュレーターやWebとの接続)の拡大
ユーザーの増加OpenEL ®で何がどうなるのか？
分析

数値解析、
シミュレーション

シミュレーターで実機レス検証が可能に

設計

モデリング

完全なソースコードの自動生成が可能に

アプリ実装

アプリケーション、
ミドルウェア、OS
APIを統一デバドラ実装OpenELで上流から下流まで一気通貫した開発が可能に！

デバイスドライバ
14

OpenEL®(Open Embedded Library)とは？
nn

制御システムやIoTデバイスなどのソフトウェアの実装仕様（API）を標
準化する組込みシステム向けのオープンなプラットフォーム
特徴
・・

デバイスの制御に特化し厳選された19個のAPI
Surface層とDevice層の複数層によるハードウェアの抽象化を実現— デバイスを交換してもアプリケーションのソースコードの修正は不要！
・ Device層によるハードウェア制御のノウハウの隠蔽化を実現

n

実装言語
・n

n

C/C++/C#

対応プラットフォーム
・Application

Non-OS、Embedded RTOS、Linux、Windows、macOS

Middleware
Surface層

Other
Middleware

OpenELOS

Device層

Hardware

対象ユーザー
・

組込みシステム技術者からエンタープライズシステム技術者まで

Sensor A

Sensor B

Motor A

Motor B

OpenEL ®の歴史
2011年5月、プラットフォーム研究会ロボットWGにより開発着手
2012年5月、OpenEL 0.1を公開
2013年5月、OpenEL 1.0を公開
2015年4月〜2018年2月、経済産業省の国際標準開発事業に採択
2015年7月、OpenEL 2.0を公開
2018年6月、OpenEL 3.1をGitHubで公開
https://github.com/openel/openel
2020年10月〜2021年2月、経済産業省「地域分散クラウド技術開発事業」に採択、OpenEL 3.2を開発
2021年7月〜2022年2月、経済産業省「次世代ソフトウェアプラットフォーム実証事業」に採択、OpenELの拡張開発
16

OpenEL® 3.2 仕様

Surface層

Device層

OpenEL® 3.2 仕様

OpenEL® 3.2 仕様

OpenEL® 3.2 仕様（C言語）nコンポーネント共通

HALRETURNCODE_T HalInit(HALCOMPONENT_T *halComponent);
HALRETURNCODE_T HalReInit(HALCOMPONENT_T *halComponent);
HALRETURNCODE_T HalFinalize(HALCOMPONENT_T *halComponent);
HALRETURNCODE_T HalAddObserver(HALCOMPONENT_T *halComponent, HALOBSERVER_T*halObserver);
HALRETURNCODE_T HalRemoveObserver(HALCOMPONENT_T *halComponent, HALOBSERVER_T*halObserver);
HALRETURNCODE_T HalGetProperty(HALCOMPONENT_T *halComponent, HALPROPERTY_T*property);
HALRETURNCODE_T HalGetTime(HALCOMPONENT_T *halComponent, int32_t *timeValue);nイベントタイマー

HALRETURNCODE_T HalEventTimerStartTimer(HALEVENTTIMER_T *eventTimer);
HALRETURNCODE_T HalEventTimerStopTimer(HALEVENTTIMER_T *eventTimer);
HALRETURNCODE_T HalEventTimerSetEventPeriod(HALEVENTTIMER_T *eventTimer, int32_teventPeriod);
HALRETURNCODE_T HalEventTimerAddObserver(HALEVENTTIMER_T *eventTimer,
HALTIMEROBSERVER_T *timerObserver);
HALRETURNCODE_T HalEventTimerRemoveObserver(HALEVENTTIMER_T *eventTimer,
HALTIMEROBSERVER_T *timerObserver);OpenEL® 3.2 仕様（C言語）n

モーター制御#define HAL_REQUEST_NO_EXCITE#define HAL_REQUEST_POSITION_CONTROL#define HAL_REQUEST_VELOCITY_CONTROL#define HAL_REQUEST_TORQUE_CONTROL#define HAL_REQUEST_POSITION_ACUTUAL#define HAL_REQUEST_VELOCITY_ACUTUAL#define HAL_REQUEST_TORQUE_ACUTUAL

(0)
(1)
(2)
(3)
(5)
(6)
(7)

HALRETURNCODE_T HalActuatorSetValue(HALCOMPONENT_T *halComponent, int32_t request, HALFLOAT_T value);
目標角度/位置、目標角速度/速度、目標トルクまでモータを動作させる. 本メソッドは非同期であり，モータが目標値に到達するまでは待たない. モータが目標値に到達する前に，再度本メソッドが呼ばれた場合には，目標値が更新される. モータが目標値に到達したことは，HALObserver を使用してアプリケーション側に通知される.ただし，この通知は，最終的な 目標値に到達した場合のみ発行される.このため，本メソッドを複数回呼び出し，目標値が更新された場合には，最終的な目 標値を設定したメソッドに対応した通知のみ行われる.
HALRETURNCODE_T HalActuatorGetValue(HALCOMPONENT_T *halComponent, int32_t request, HALFLOAT_T *value);
対象モータの現在角度/位置、現在角速度/速度、現在トルク/力を取得する.
現在値が測定できない要素の場合には，推定値もしくは指令値を返す.
位置 単位[rad] または [m](製品仕様)
速度 単位[rad/s] または [m/s] (製品仕様)
トルク 単位[N・m] または [N] (製品仕様)

OpenEL® 3.2 仕様（C言語）n

センサー入力HALRETURNCODE_T HalSensorGetValueList(HALCOMPONENT_T *halComponent,int32_t *size, HALFLOAT_T *valueList);
センサーから値を取得する
HALRETURNCODE_T HalSensorGetTimedValueList(HALCOMPONENT_T *halComponent,int32_t *size, HALFLOAT_T *valueList, int32_t*timeValue);
センサーから値と時間情報を取得する

OPENELの実装例

OpenELの実装例（C言語）n 二足歩行ロボット
UTRX-17n Raspberry Pi Zero W+ PCA9685
n OpenELでサーボモー
ターを制御

24

OpenELの実装例（C++言語）
nnnn

M5Stack FIRE +M5BALA
M5Stack FIREにSH200Q（3軸加速度センサー、3軸ジャイロ）が搭載
OpenELで倒立2輪ロボットを制御
Arduino IDEで開発

25

M5Stack BALA2nnnn

M5Stack Gray + BALA2
M5Stack Grayに
MPU6886（3軸加速度センサー、3軸ジャイロ）が搭載OpenEL(C++)で倒立2輪ロボットを制御
Arduino IDEで開発

26

C#への対応
nnnnn

二酸化炭素センサー（Sensirion SCD30）に対応したことにより、換気具合の可視化「密の見える化」を実現
C#に対応したことにより、OpenELコンポーネント
内部でネットワーク通信の利用を実現
大規模リアルタイム通信エンジン「Diarkis」に対応したことにより、遠隔地のCO2濃度の測定を実現
拠点間で相互にCO2濃度のリアルタイム監視を実現
ET&IoT West 2021とET&IoT 2021のJASAパビリオンで展示

C#への対応：Windows GUIアプリの例
C#への対応によりWindowsのGUIアプリでもOpenELの利用が可能に！

28

LEGO EV3nnn

ev3dev環境(Debian Linuxベース)
モーター3個、光センサー、タッチセンサー、距離センサー、ジャイロセンサーに対応
ETロボコン走行体でライントレースを実現reTerminalnnnnnRaspberry Pi CM4搭載
温度/湿度/気圧センサー BOSCH BME280
CO2/温度/湿度センサー Sensirion SCD41
I2Cモータードライバ＋DCファンモーター
二酸化炭素濃度を検知して自動的に換気を行うシステムを構築

温度/湿度/気圧センサーのデモ

CO2/温度/湿度センサーのデモ

CO2濃度を検知する自動換気システムのデモ経済産業省「次世代ソフトウェアプラットフォーム実証事業」
nnnn

NVIDIA JetBotの追加
・
Vendor IDの追加（0xB：NVIDIA）
・
Product IDの追加（0x1：JetBot）
・
Device Kind IDの追加（0xD：電流センサー）
OpenEL®コンポーネントの追加
・LEDディスプレイドライバ NXP
PCA9685（モーター制御）
・電流センサー TI INA219（バッテリー監視）
ROS2に対応
・
OpenELノード(Publisher/Subscriber)の追加
・
機体番号、前後進距離[cm]、旋回角度[deg]ROS2に対応したdockerイメージの作成速度制御試験（-15π〜15π[rad/s]）

前後進試験

旋回試験

自己位置推定(Odometry)による移動電力管理機能
応用例：バッテリーの電圧降下を検知してモーターの回転速度を制御することも可能

車輪回転速度-15π〜15π[rad/s] 負荷電圧[V]

充電検知
充電完了（12V以上）検知

シャント電圧[V]
電力[W] 電流[A]開発成果をGitHubで広く一般に公開• M5Stack BALA2、EV3、JetBot向けの実装を公開！
• 日本語仕様書以外に、英語仕様書やチュートリアルも追加• https://github.com/openel/openel

開発成果をdockerhubで広く一般に公開• ROS2をセットアップ済みのJetBot向けDockerイメージを公開！
• JetBotにダウンロードするだけで、すぐにOpenELが利用可能！
• コンパイル不要！
• ROS2を起動してメッセージをPublishするだけでJetBotが動作！
• https://hub.docker.com/r/openel/jetbot

Dockerイメージの使い方(Subscriber)Open the first terminal window
1. SSH into Jetbot$ ssh jetbot@192.168.xxx.yyy
2. Pull docker image$ docker pull openel/jetbot
3. Run docker image$ docker run -it --name uti_ros2_foxy -h nano-4gb-jp45 --device /dev/i2c-1
ubuntu_uti:20220119 /bin/bash
4. Set the jetbot number

root@nano-4gb-jp45:/# cat /home/jetbot/dev_ws/src/openel_pubsub/openel_subscriber.yaml/openel_subscriber:ros__parameters: jetbot_number: 1 <--- Change this number to the one which you want to use.
use_sim_time: false5. Set up ROS2 environment
root@nano-4gb-jp45:/# source /opt/ros/foxy/setup.bash
root@nano-4gb-jp45:/# source /home/jetbot/dev_ws/install/setup.bash
6. Run OpenEL package
root@nano-4gb-jp45:/# ros2 run openel_pubsub openel_listener --ros-args --params-file/home/jetbot/dev_ws/src/openel_pubsub/openel_subscriber.yaml[INFO] [1642562106.391263209] [openel_subscriber]: My jetbot_number: 1

Dockerイメージの使い方(Publisher)
1. SSH into Jetbot$ ssh jetbot@192.168.xxx.yyy
2. Connect to the running container
jetbot@nano-4gb-jp45:~$ docker exec -it uti_ros2_foxy /bin/bash
3. Set up ROS2 environment
root@nano-4gb-jp45:/# source /opt/ros/foxy/setup.bash
root@nano-4gb-jp45:/# source /home/jetbot/dev_ws/install/setup.bash
4. Send the command to control Jetbot
By publishing the array [Jetbot number, forward / backward distance (grain size: 3 cm), turning angle (grainsize: 3 degrees)] in / openel_topic, the specified Jetbot will operate.
root@nano-4gb-jp45:/# ros2 topic pub --once /openel_topic std_msgs/msg/Int16MultiArray"{data: [1,3,3]}"
publisher: beginning loop
publishing #1: std_msgs.msg.Int16MultiArray(layout=std_msgs.msg.MultiArrayLayout(dim=[],data_offset=0), data=[1, 3, 3])
The log is displayed in the first Terminal, and the JetBot is working.
[INFO] [1642562229.934486853] [openel_subscriber]: I heard: 1,3,3
Move:3[cm]Turn:3[degree]令和3年度（2021年度）の活動成果
nnnnn

2021年7月2日に、OpenEL 3.2（C#版）をGitHubで公開した。
https://github.com/openel/openel-cs2021年10月30日にGitHubでOpenELの英語版ページを公開した。
https://openel.github.io/
2021年11月7日にGitHubでArduino(M5Stack BALA2)用OpenEL 3.2（C++版）と英語版入門文書を公開した。
https://github.com/openel/openel-arduino
https://openel.github.io/openel-arduino/
2022年3月12日にGitHubでLEGO EV3およびNVIDIA JetBot用のOpenELコンポーネントを公開した。
https://github.com/openel/openel
2022年3月12日にDockerHubでNVIDIA JetBot用のOpenELコンポーネントを使用するROS2イメージを公開した。
https://hub.docker.com/r/openel/jetbot

2022年7月現在の対応デバイスと実装例
n対応デバイス・・・・・・・・・・・・・・n

モーター（速度制御、位置制御、トルク制御）
ジャイロセンサー
トルクセンサー
加速度センサー
地磁気センサー距離センサー
力センサー
温度センサー
湿度センサー
気圧センサー
二酸化炭素センサー
カラーセンサー
タッチセンサー電流センサー

実装例
・・・・

二足歩行ロボット UTRX-17
M5Stack Fire/BALA/BALA2
LEGO Mindstorms NXT/EV3
NVIDIA JetBot

令和4年度の事業計画
2022年4月〜、ユーザーの増加、対応デバイスの増加、他システムとの連携、OpenELエコシステムの構築を目指して活動中
n 対応デバイスの増加
・ ETロボコンSPIKEキットへの対応
・ シマフジ電機（株）SEMB1401への対応

n 他システムとの連携
・ W3C WoTへの対応（WoT-JP CGとの連携）
・ クラウドへの対応（Microsoft Azure、AWS、GCP）

n OpenEL エコシステムの構築
n OpenEL 勉強会の開催

令和4年度の事業計画

n ETロボコンSPIKEキットへの対応

令和4年度の事業計画

n シマフジ電機（株）SEMB1401への対応

OpenEL エコシステム
協力者、ユーザー募集！
数値解析、シミュレーショ
ン
クラウド
Digital Twin

モデリング・開発ツール

各種コンポーネントの実装
各種ツールの対応
勉強会講師
ユーザーサポート
貴社の顧客への提案等、貴社のビジネスツールとしてもご活用ください。

アプリケー
ション

ハードウェアWGメンバー
アップウィンドテクノロジー
エヌデーデー
オーバートーン
京セラ
静岡大学
シマフジ電機チェンジビジョン
東洋大学
Knowledge & Experience
日立産機システム
UCサロン
ルネサスエレクトロニクス

WGメンバー

JASA会員デバイス
ドライバ

ミドルウェアOS49協力者、ユーザー募集！

n ご静聴ありがとうございました。

「OpenELが変える組込みシステム開発」
2022/7/29 発行
発行者

一般社団法人 組込みシステム技術協会
東京都 中央区 入船 1-5-11 弘報ビル5階
TEL: 03(6372)0211 FAX: 03(6372)0212
URL: https://www.jasa.or.jp/

本書の著作権は一般社団法人組込みシステム技術協会(以下、JASA）が有します。
JASAの許可無く、本書の複製、再配布、譲渡、展示はできません。
また本書の改変、翻案、翻訳の権利はJASAが占有します。
その他、JASAが定めた著作権規程に準じます。

© Japan Embedded Systems Technology Association 2022