機能的試作シリーズは、試作プロセスについて詳しく解説する技術資料集です。キーとなる概念やプロトタイピングのメリット、製品の選び方、その他の技術資料について紹介します。
アルゴリズムエンジニアリングは、「応用されたアルゴリズム設計」を意味する造語です。紙に鉛筆で描いたアルゴリズムの素案を、信頼性が高く、十分に検証された、使い勝手に優れた実装に落とし込むプロセスを指します。アルゴリズムをプロトタイプに実装して所要の機能を実現するこの作業は、製品開発サイクル全体の中で最も難しい仕事になるかもしれません。しかし、大きな見返りが得られる作業でもあります。実環境とインタフェースするI/Oハードウェアを使えば、アルゴリズムが実際に機能を果たす様子を自分の目で確認することができます。
本稿では、アルゴリズム設計時に陥りやすい問題点について説明するとともに、そうした課題をグラフィカルシステム設計を活用して解決する方法を紹介します。
アルゴリズムを機能的プロトタイプに実装するのは簡単な作業ではありません。以下に挙げるような、さまざまな要因があるからです。
たとえばFPGA (Field Programmable Gate Array) など、高いI/O性能を特長とする制御システムやプロセッサでは通常、1人の開発者が対応できるプログラミングに限界があります。複数の異なるプラットフォームでプログラミングをこなせる知識を備え、十分な経験を有するシステムレベル設計者は、実際にはごくわずかしかいません。
基本的な機能であっても、それを実現する低位のアルゴリズムを実装する作業はそれなりに時間がかかります。ところがプロトタイピングではスピードが最優先されるため、一般に良く知られたアルゴリズムについては、手元に既存のコードが無いからといってゼロから時間をかけて新規に作成する余裕はありません。
機能プロトタイピングでは、工程が進むのに伴ってアルゴリズムを実装するプラットフォームが変わっていくので、そのたびにアルゴリズムを別のプラットフォームに移植する必要が生じます。プラットフォーム間でランタイム環境が異なると移植元のコードは機能しません。このため、あるアプリケーションを開発する際に、試作から最終製品への実装までの工程を通して段階的にそのアプリケーションを拡張することは困難です。
システムが機能的な要件を満たせるかどうかをプロトタイピングの段階で見極めるのは困難です。しかし、後で結果が悪かったからといってもう一度やり直すとなれば、コストがかさみます。たとえば、採用予定のプロセッサでは所要の並列タスクを十分な速度で実行できないと判明するかもしれません。これでは、適切なサイクル時間を達成できない恐れがあります。また、プロセッサの負荷が高い解析については、リアルタイムで処理できない可能性もあります。
グラフィカルシステム設計を採用すれば、機能的プロトタイプ作成時のアルゴリズムエンジニアリングに潜む数多くの落とし穴を回避したり、その影響を軽減したりすることができます。グラフィカルシステム設計とは、グラフィカルで直感的なプログラミング手法と、柔軟性が高く市販品 (COTS:Commercial Off-The-Shelf) として入手可能なハードウェア製品を組み合わせることで、設計上の課題を解決する手法です。この手法を導入すれば、設計の全工程を通して1つの開発環境を使用することができます。以下では、上記で挙げた課題をこの手法によってどのように解決できるのか、詳しく説明します。
グラフィカルシステム設計のメリットの1つとして、どのような演算モデル (MoC:Model of Computation) で実装していても、プログラマがアルゴリズムを作成できるという点が挙げられます。アルゴリズムを実現するコードは複雑化の一途をたどっており、プログラマはコーディング能力を高めるためにさまざまな演算モデルを習得する必要に迫られています。以下に挙げるのは、グラフィカルシステム設計で使用可能な演算モデルのごく一例です。
データフローは、グラフィカルプログラミング環境であるNI LabVIEWで最もよく使われている演算モデルです。データフローでは、開発者は演算を実行する前にすべての入力にデータを供給しておく必要があります。データフローはその直感的なコーディング構造によって、並列処理などのアプリケーションを容易に実装できます。
複雑な関数を簡単に記述できるツールとしては、このほかにもテキスト型数式処理があります。テキスト数式演算を使用すると、複雑なアルゴリズムをスクリプト形式で容易に記述でき、高い可読性も実現することができます。テキスト数式演算の例としては、フォーミュラノードやMATLABスクリプトノードがあります。LabVIEWを使用して、アルゴリズムを開発する、信号処理の考え方を検討する、結果を分析するなど、アルゴリズム開発の各段階それぞれにおいて最も効果的な構文を利用できます。
場合によっては、もともとはC/C++言語で記述されていたアルゴリズムを使うこともあるでしょう。その際は、C/C++記述の既存コードを再利用することが可能です。インラインCノードまたはライブラリ関数呼び出しノードを使用することで、LabVIEW内で前のコードを直接呼び出すことができます。既存コードを用いる場合、あるいは値の小さい数値や配列アルゴリズムを実装する場合には、インラインCノードを使用します。DLLや共有ライブラリ内のCコードにアクセスする場合は、ライブラリ関数呼び出しノードを使用します。
LabVIEWでのPython、MathWorks® MATLAB ®ソフトウェア、およびC/C++の使用の詳細
LabVIEWプラットフォームは長年にわたって、さまざまな設計分野で広く導入されています。そのため、異なる設計ツールやシミュレーションツールとのデータの互換性を確保する必要性が高まりました。LabVIEWはそれに応えて、多くの統合ツールや、ライブラリ、ファイル形式との相互運用性を確立しています。さらにLabVIEWは、以下をはじめとする業界標準のソフトウェアツールや計測リソースに対応し、非常に広範な統合を実現しています。
これらのツールを活用することで、ほぼすべての計測器や制御器からの出力データを統合することが可能になります。LabVIEWを汎用のハードウェア通信インタフェースの標準規格と組み合わせることで、開発者は将来にわたって互換性や拡張性を確保できます。
LabVIEWは、数式処理や信号処理、確率、制御などさまざまな分野の基本的なアルゴリズムに対応した関数を何百も備えています。これらは、あらゆるカスタムアルゴリズムにとって不可欠な構成要素です。これらの関数を利用すれば、開発者は低位のコードを記述せずに済むので、エンジニアは「ソリューションの実装方法」ではなく「ソリューションそのもの」に注力できるようになります。
LabVIEWを利用すると、実環境のデータをとても簡単に集録できます。そのため、実環境のデータを使ってアルゴリズムをテストし、アルゴリズムを最適化するという作業を繰り返し行う際にLabVIEWは非常に有用です。この反復的なテスト手法では、異なる関数を試して期待通りの結果が得られるかどうかを確認できます。たとえば、フィルタを用いて信号を処理する場合、ソリューションを幅広い選択肢の中から選んで、実際に必要な信号を集録し、その結果をグラフやファイルで確認することが可能です。そのアプリケーションに適した結果が得られなかった場合は、別のフィルタを選択すればよいのです。一般的には、アルゴリズムに供給する実信号を集録してから、ソフトウェア上でシミュレーションする方が簡単です。
市販品 (COTS) として入手可能なハードウェア製品を用いると、コストを抑えつつ、迅速に試作に着手することができます。さらに、グラフィカルシステム設計と組み合わせれば、I/Oを内蔵するさまざまなターゲットにネイティブアルゴリズムを実装することが可能です。NI CompactRIOやPXIプラットフォームに搭載されているリアルタイムプロセッサを利用すると、I/Oの制御を確定的に実行でき、信頼性を高めることができます。このようなI/Oの確定性は、制御アルゴリズムの制御対象となる環境を動的にシミュレーションするためにハードウェアとソフトウェアを緊密に統合する必要がある、HIL (Hardware-In-the-Loop) アプリケーションなどで不可欠となります。
アプリケーションをLabVIEWで開発しておけば、FPGAを備えたリアルタイムプロセッサを利用できるほか、あるCOTSハードウェアから別のCOTSハードウェアへとコードを簡単に移植することもできます。たとえば、実環境のI/O信号を解析するデスクトップPC (パソコン) 用コードを、大幅に書き換えることなくPXIモジュールや組込プロセッサなどフォームファクタの異なるハードウェアに移植することが可能です。実際のところ、プロトタイプの設計や検証をまずデスクトップPC上で行ってから、組込システムを製品化する際に内蔵の32ビットプロセッサへと移植するという方法を用いると、開発期間を大幅に短縮できる上に、設計制約を満たせなかった場合に発生する手戻り作業のコストを削減できます。
LabVIEWはオープンプラットフォームであるため、計測データをシミュレーション結果にマッピングすることができます。動作モデリングのために、シミュレーションデータと実測データを入れ替えることもできます。さらに、シミュレーションの出力を物理テストの入力信号として利用し、堅牢なテスト環境を実現できます。
LabVIEWを用いたシミュレーションを使うと、設計の性能を設計指標に照らし合わせて検証したり予測したりすることができます。早期の段階では、複数の異なるシミュレーションツールを使って、それぞれに設計を読み込んで評価することも可能です。次の段階では、構築したプロセスを自動化するために、レイアウトもしくはモデル形成の自動化やツーリングが必要になります。システムの状態に関する情報と、もし可能であれば出力信号も保存しておくと、アプリケーションをデバッグしたり、アプリケーションの性能を仕様化したりする際に役立ちます。
線形/非線形/離散/連続型の制御システムを設計する際には、LabVIEW Control Design and Simulation Moduleに用意された制御ブロックダイヤグラムを活用してください。これは抽象化を用いたプログラミング手法であり、制御系の一般的な構成要素である伝達関数ブロックや積分器、微分器、フィードバックループなどを使ってプログラムを記述できます。このような抽象度の高いブロックダイヤグラムを利用することで、開発者はシステムに関する経験や知識を生かしながら、ソリューションを概念レベルから開発できるようになります。
図1.制御系設計/シミュレーションモジュールを使ったPID制御
プロトタイプに求められる機能を実現するためのアルゴリズムエンジニアリングは、プロトタイピングの中でも難しい工程です。グラフィカルシステム設計とは、直感的なグラフィカルソフトウェアとCOTSハードウェアを緊密に統合することで得られるメリットを生かした手法です。この手法を用いれば、アルゴリズムエンジニアリングの課題を克服し、高速に動作するプロトタイプを低コストで完成させることが可能になります。
紙面上の設計からソフトウェア設計への移行における技術的情報については、以下の関連資料をご覧ください。