2018-07-01

Raspberry Pi3を使ったリアル波形描画(1) イントロダクション

書籍『リアルタイムOSから出発して組込みソフトエンジニアを極める』の改装版を2016年5月にリリースしてから、この手の専門書にしてはそこそこ売れているようだ。

2006年3月のこの本の初版を出版して以来、ずっと売れ行きをウォッチしているが、12年経った今の方がコンスタントに売れているような気がする。

「それはなぜか?」とずっと自問自答している。10年前はまだ組込みソフトウェアの開発規模はそれほど大きくなく、本の需要もそれほどなかったが、2020年を目前とした現在では、組込みソフトもゼロから作るようなこともなく、組込みソフトウェアの開発者も不足してきており、ソフトウェアの再利用を行わないと立ちゆかなくなってきたというのが、今この本が売れている理由ではないかと考えている。


この本が、他の本と違う点は、商品のビジネスモデルと組込みソフトウェアのアーキテクチャやソフトウェア技術を絡めて語っているところだと思う。ビジネスを成功させるためのソフトウェアアーキテクチャとは何かについて語っているつもりだ。

簡単に言えば、組込みソフトウェアの製品を効率良く開発し、利益を高めるために必要な技術や考え方は何かを Step by Step で説明している。(最近は聞くことが少なくなった MOT:Management Of Technologyを意識しているつもり。)

この本では 電子レジスターの商品群を想定して解説をしているのだけれども、ここ最近、この本を読んでくれている読者向けに、実物を使ってこの本に書いてあることを実践的に学ぶ教材があるといいなと考えるようになった。

そんな折、Raspberry Pi3 が6000円くらいで手に入り、OSが Linuxベースではあるが(Linux は基本的にマルチタスクOSでリアルタイムOSではない) Qt(キュート:オープンソース版は無償)の開発環境を使うと、安価な学習環境を構築できることが分かった。

そこで、この特集記事「Raspberry Pi3を使ったリアル波形描画」では、『リアルタイムOSから出発して組込みソフトエンジニアを極める』を実践的に理解するための教材(Qtを使い、Windows と Raspberry Pi のマルチプラットフォームで開発する教材)を紹介しながら、組込みソフトウェアの製品を効率良く開発し、利益を高めるために必要な技術や考え方を説明しようと思う。

組込み機器のものづくりで必要な技術・スキルとは?

ところで、技術系のソフトウェア研修を永年やってきて、ものづくりに必要な目に見えにくいスキルがあるなと感じる。それはものづくりを始めるにあたって「いける」かどうかが分かる、または「いける」かどうかを直感で感じる能力のことだ。別な言い方をするとものづくりを始める前に実現可能性があるかどうか、ものづくりを実現するために最も重要な要素やボトルネックを見分ける能力だ。それが出来る素養があることがものづくりのアーキテクトの素養があるかないかの違いだと思う。

チームのメンバー全員が持っている必要はないが、アーキテクトとしての素養を持ったスキルを持った者がチームに一人はいないと製品開発が実現しない。

アーキテクトの素養があるものは20人に1人と言われる。実際それくらいの割合だと感じる。アーキテクトの素養を持った者がいないチームで標準的な製品開発のプロセスを頭からなめさせると、ドキュメントは出来てきても、「もの」ができない。

別な言い方をすると、アーキテクトのいないチームはフィージビリティスタディ※1 をしないまま、何も恐れることなく製品開発に突入しようとする。

※1 フィージビリティスタディ(feasibility study):プロジェクトの実現可能性を事前に調査・検討することで、「実行可能性調査」「企業化調査」「投資調査」「採算性調査」とも呼ばれる。

組込みソフトウェア製品の場合、多くの場合は現在販売している製品があり、その製品の派生機種や後継機種を開発することが多いだろう。

だから、フィージビリティスタディはすでに終わっている、技術的なかなめとなる部分はもう分かっていることが多い。左図の左側の調査研究の中のコンセプト開発・研究試作の部分だ。

ただし、現行製品があるからといってコアな技術が資産化されているかどうかは分からない。ソースコードがあるからといって再利用可能な状態になっているとは限らないし、具体的なノウハウは1人の技術者の頭の中だけにあるかもしれない。

自分達の組織のコアな技術が何かを知るには、Raspberry Pi のような汎用プラットフォームをまだドメイン知識のないエンジニアに渡し、それで売り物の製品相当のものを作れるかどうか試してみると分かる。

今はインターネットでかなりの情報を収集できるから、未知の技術であっても大抵のことは調査できる。CQ出版のトラ技やインタフェースのバックナンバーなんかも有効な情報源だ。しかし、そういった情報を駆使しても、ドメイン知識のない技術者が製品相当のものを作れるとは限らない。

そして、それを試したときに、どんなに優秀なソフトウェアエンジニアであってもどうしてても、実現できない機能や性能があれば、それがあなたの組織のコア・コンピタンス(「競合他社を圧倒的に上まわるレベルの能力」「競合他社に真似できない核となる能力」)だ。

もちろん、コア・コンピタンスがメカやエレキのこともあるだろ。その場合、メカやエレキの技術が特許で守られていたり、流出しないように保護できていれば他社にまねされることもなくしばらくは安泰だ。

ただ、今の時代、メカ・エレキだけがコア・コンピタンスであり、ソフトウェアは付帯機能だというケースは少なくなってきており、メカ・エレキ・ソフトの複合的な資産がコア・コンピタンスになっていることが多いと思う。

そこで今回の特集記事では、メカ・エレキの機能や性能はあらかじめ提供されるという前提にして、ソフトウェアのコア資産を同構築していけばいいのかにフォーカスを当てて話を進めたいと思う。

商品開発の実現可能性を嗅ぎ分ける能力を養うには?

インターネットの情報でマネできる機能や性能は競争優位要因にはならない。真似できないコアな技術があってこそ、ビジネスで成功できる。汎用のソフトウェア資産を組み合わせただけではビジネスで優位に立つことはできない。

リアルタイム性能の部分が競争優位要因になることはあるが、それだけでは苦しいだろう。リアルタイムとソフトウェア資産とビジネスを意識した再利用を実践してこそ、競争に勝てる商品になる。

さて、新しい製品、これまでになかったサービスを実現しようとするとき、また、製品の内部を知り尽くしていた技術者がいなくなってしまい、既存システムのアーキテクチャが分からなくなってしまった場合、経験のない新たなメンバーで製品開発を実現させないといけない。

そんなとき、自分は、何かを作ろうと思ったときに「実現可能性」について確信がないと、ものつくりに着手するのが怖いという感覚がる。せっかく、やり始めたのにやっぱり出来なかったという結果にはなりたくない。前述のアーキテクトの素養というやつだ。

自分を成長させるためには失敗も必要だが、やはり成功体験を積み重ねる必要がある。時間には限りがあるし、ものづくりの成功はエンジニアとしてのモチベーションを高め、技術やスキルの吸収を加速する。『問題解決能力(Problem Solving Skills):自ら考え行動する力』の記事で書いたが、「問題解決キッズ」の成長スピードは「評論家くん」に比べて22倍速い。ようするに、問題を解決し、製品開発の成功を重ねるとものすごいスピードで成長する。(アーキテクトの素養が身につくと成長するスピードも格段に上がる。)

それを繰り返すと、開発を着手する前に「実現可能性」の確証といいうか「いけそうだ」というあたり感がないとイヤだと感じるようになる。そして、そういった感覚を研ぎ澄ませていくと、「その製品やシステムを開発するために必要なコアな技術は何か」を探る能力が高まる。

市販品を見るときにも、この製品のコア技術は何かをカタログから探ったり、分解記事をくまなく精査するようになる。

そして、そういった感覚が研ぎ澄まされていくと、コアな技術はなんとしても習得したいと思うようになる。コア技術と汎用技術があったら、真っ先にコア技術を学びたいと思い、その後製品実現のために汎用技術を学ぼうと思う。

この感覚はどんな簡単なものでもいいのだが、やはりものづくりの経験を積み重ねないと醸成されない。

だから、既存のアプリを利用する経験しかないと、「これはどうやって実現しているのだろうか」という視点が育たない。

そういった人たちを集めて、「さあ、何か作ってごらん」といってもなかなか難しい。プログラミングの研修にしても演習課題を繰り返すだけでなく、自分の考えで何かの目的を達成するプログラムを作るという経験を積み重ねさせる必要がある。

OJTで与えられた仕様についてプログラミングしたり、変更の依頼を実装したりすることだけやっていると、その経験はなかなかできない。

アーキテクトを養成するための研修教材が必要だと感じる。そういったこともあって、今回Raspberry Piを使ったリアル波形描画の教材を作ってみようと思った。

今の世の中、生まれたときから便利なものだらけで、使う側に圧倒的に時間を使う若い世代には、ものづくりには不利かのかなあと思うところもある。

でも、別な見方をすると Raspberry Pi のような安価でいろいろなことができるソフトウェア開発のプラットフォームも簡単に手に入る世の中になった。

また、Raspberry Pi を使った開発環境も無償で、開発に関する情報もインターネットから入手できるようになった。

ものをつくりたいというモチベーションがあるポテンシャルの高い人材なら、自力で実力を身につけることができる世の中になったとも言える。

リアルタイムOSから出発して組込みソフトエンジニアを極める』がそこそこ売れているということは、そういった人材が少数だがいて、どうすればソフトウェアアーキテクトとしてのスキルを高めたいともがいているのではないだろうか。

そういった人たちに、手を動かしながら学べる教材コンテンツを提供したいと思う。

『リアルタイムOSから出発して組込みソフトエンジニアを極める』を振り返る

リアルタイムOSから出発して組込みソフトエンジニアを極める』の概要は、初版を作成したときに気合いを入れて作った『組込みソフトエンジニアを極める(外伝)』を見てもらうと分かりやすい。(本を読んで「外伝」を見ていない人は、是非、登場人物5人の日記をザッピングしてもらうと面白いと思う)

この本では「リアルタイムシステム」を開発するためのソフトウェア技術と、リアルタイムシステム上で開発効率を高めたり、再利用性を高めるための「オブジェクト思考設計」の技術を 組田鉄男という主人公の成長とともに説明している。

技術的には、第一章の時間分割のハードルで、リアルタイムOSを使った設計技術を、第二章 の機能分割のハードルで、オブジェクト思考設計の技術を紹介し、第三章の再利用の壁で、商品群を開発する際のビジネスを成功するために必要なソフトウェアの再利用技術を紹介している。

この教育コンテンツでは、「リアルタイム制約」「オブジェクト指向設計」「ビジネス成功のためのソフトウェア再利用」という3つの要件を、Raspberry Pi3 を使って疑似体験することを目的としている。

今後、この特集記事の完結に時間がどれくらいかかるか分からないが、1年以内には完結させたいと考えている。

この特集記事を読み続けるとよい人

  • C言語は書けるけれど,C++はまだやったことがなくC言語との違いや特徴を実機ベースで実感したい人
  • オブジェクト思考設計の必要性を感覚的に掴みたい人
  • 組込みソフトウェア開発の経験は長いが,オブジェクト思考設計に踏み出せないでいる人
  • 製品のソフトウェア規模が100万行を超えてきて,開発効率が上がらなくて困っている人
  • 『組込みソフトウェアエンジニアを極める』を読んだけれども,上手くいく実感が湧かない人
  • 競合力の高いソフトウェア製品の商品群を展開したい人。
  • 理論より実践でソフトウェアの再利用や効率的開発を学びたい人。
  • 未来の組込みソフトウェアエンジニアを育てたい人

前提条件

  • ハードウェアプラットフォームに Raspberry Pi3 を使用する。
  • Raspberry Pi の OS はLinux Raspbian を使用する。
  • ソフトウェア開発の言語は C++ を使用する。
  • GUI 及び統合開発環境は Qt 5.10(Raspberry Pi上では Qt 4.8)を使用する。
  • Windows と Raspberry Pi のマルチプラットフォーム開発を行う。

 アナログアンプ、アナログフィルタ、A/D変換器の設計はしません。そのI/Fまでは設計するのでその部分は自作してください。
 デジタルフィルタや二次処理の部分はスケルトン(インタフェースは提供するが、実装コードは空の状態で紹介する)で提供します。

つくるもの

  • A/D変換器でアナログ波形をRaspberry Pi3に取り込んで、ディスプレイに波形を表示させるソフトウェアを作成する。
  • 単にソフトウェアを実装するのではなく、「ビジネス成功のためのソフトウェア再利用」という観点で、ソフトウェアのアーキテクチャを考えながら設計を進める。
こちらはPC上で波形表示を行ったデモ画像


こちらは 5インチのLCD上で波形表示を行ったデモ画像



完成したWindowsプラットフォームアプリ(Windows 上で動作する exe + QtのDLL。Raspberry Pi3上でも動作することは確認済み)をダウンロードしてご自分のPCで動かしてみたい方は次の手順でご依頼ください。

【注意点】
  • Windows 7 と 10で動作することは確認しています。
  • Qt のプロジェクトファイルやソースコードは今の段階では公開していません。本特集記事を進めていく過程で公開方法を考えます。
  • 本アプリは心電図をRaspberry Pi3に取り込み、心拍数を計測することを想定した教材ですが、デジタルフィルタの中身は空(スケルトン)になっています。また、心拍の計測アルゴリズム等も教育用に簡易的に作成したもので実用に耐えうるものではありません。
  • 本当に心電図計測を行うためにはアルゴリズムの設計やデジタルフィルタの設計が必要です。
  • 本教材は、そういったアルゴリズムやデジタルフィルタのインタフェースを定め、カプセル化するとデバッグ効率や再利用性が高まり、ビジネスを成功に導くことができることを学ぶことを目的としています。
  • 本教材は再配布や有償セミナ等への二次利用はできません。(公共の教育機関の方が教材として使用されたい場合は個別にご相談ください。)
  • 圧縮ファイルとパスワードを受け取った方は、本注意点について許諾したことになります。
【完成形を確認する Windowsアプリの入手方法】

次のメールアドレスに件名:パスワード送信希望 と書いてメールをお送りください。(”パスワード送信希望”というキーワードが件名に含まれていないと返信されません。
メールアドレス:CriticalSoftwareConsulting[あっとまーく]gmail.com

折り返し、ファイルのダウンロード URL と パスワードをお送りします。
なお、ファイルは パスワード付きのZIPファイルで約20Mバイトあります。

本教育教材システムのクラス図
P.S.

CPUの性能が上がり、カラー液晶や有機ELが安価に手に入るようになった現在では、GUIのソフトウェアをゼロから作り上げるなど考えられないし、やはりWindowsやLinuxマシン上で表示の出来を確認して、そのままそのソースコードを実機で動かすことができれば開発効率が上がる。

そういった開発環境を Qt は用意してくれる。ちょっとしたソフトウェアの exe を作成するだけでも容量が大きくなる(実際今回のアプリも20Mバイトだった)のが玉にきずだが、そこはマルチプラットフォーム開発ができるのだからがまんしたい。

C++で提供されているQt の豊富なライブラリや機能を使っていると、なぜC言語ではなく、オブジェクト指向言語であるC++が必要なのかがよく分かる。

再利用可能なライブラリをサクサク使い、どうやって実現しているのかよく分からなくてもやりたいことが実現できる、それこそがオブジェクト指向言語を使う理由だ。

同様に、自分達が作ったソフトウェアを再利用して開発効率を高めたいのなら、C言語では難しいと思う。オブジェクト指向言語を使ってI/Fを定め、実現方法は隠蔽して、ソフトウェア資産を構築していかないと、ソフトウェアの採用の効率は上がらない。ちなみに、オブジェクト指向言語を使ったからといっても、再利用可能な資産になるとは限らない。

その点をこの特集記事では解説していきたいと思っている。

デモ動画を見てもらうとわかるが、波形をリアルタイムに右から左に流す(ムービング)の波形表示は LCDとLCDドライバとCPUのリソースでC言語でゼロから作ったら気が遠くなるような時間がかかる。

それが QtQCustomPlotのライブラリ(無償)を使うと、簡単にPC上で実現でき、そのソースをそのまま Raspberry Pi3上で HDMI の I/Fを持つディスプレイで再現させることができる。

Linux で正確なタイマー割り込みを発生させるかどうかちょっと不安だったが、なんとか大きなジッターなしに実現できた。

感覚的には数ヶ月もかかる組込みソフトウェアシステムの開発が開発期間を数日で実現できた感じだ。実際にはRaspberry Pi、Qt、QCustomPlot 等を使うのが始めてだったので、それらを使いこなせるようになるには数ヶ月かかったが、実際に動くものが出来たときに、「これが、オブジェクト思考言語やオブジェクト思考設計を使う根拠になる」と思った。

組込みではないけれども『猫でも分からないオブジェクト指向入門』を読むと、過去から現在に至るまでに、どうしてオブジェクト思考設計が必要になってきたのかが理解できる。

永年C言語を使い続けてきて、いまさらC++やオブジェクト指向設計はハードルが高いと思っている方は、この特集記事を読み進んでもらって、オブジェクト思考設計とソフトウェアの再利用資産を使って効率よく組込みソフトウェアが開発できることを実感してもらいたい。

0 件のコメント: