モデリングはどこから手をつけたらいいの?

2011年8月11日(木)
吉田 彩花舟元 拓斗

コーディングする

  1. [吉田]じゃあ、設計クラスを元にコーディングするね。オブジェクト指向の観点で分析・設計しているから、オブジェクト指向言語のC++で実装するよ。今回は設計したクラスをそのままC++のクラスとしてコーディングするね。
  2. [舟元]C++!! いつの間に。

lineTraceクラス

#include "motor.h"
#include "touchSensor.h"
#include "gyroSensor.h"
#include "lightSensor.h"
#include "balanceCalculator.h"
#include "nxt2011.h"
#include "course.h"
#include "pCalculator.h"
#include "turnCalculator.h"

#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

motor motorR(NXT_PORT_B);
motor motorL(NXT_PORT_C);

touchSensor touch(NXT_PORT_S4);
gyroSensor gyro(NXT_PORT_S1);
lightSensor light(NXT_PORT_S3);
balanceCalculator balance(623);

nxt2011 nxt(motorL, motorR, touch, gyro, light, balance);

pCalculator pCalc;
course info;
turnCalculator turn(pCalc, nxt, info);

//==========================================================
// TOPPERS/ATK declarations

//==========================================================
// 1msec timer interrupt hook
void user_1ms_isr_type2(void) {
}

//==========================================================
// Main Task
TASK(Main) {
   nxt.activeLightSensor();
   while(!nxt.isPressedTouchSensor()) { }

   nxt.init();
   while(1) {
       nxt.run(50, turn.calc());
       systick_wait_ms(4);
   }
}

baranceCalculatorクラス

#include "turnCalculator.h"

turnCalculator::turnCalculator(pCalculator& mPcalc, nxt2011& mNxt, course& mInfo)
    : pcalc(mPcalc), nxt(mNxt), info(mInfo) {
}

F32 turnCalculator::calc() {
    return pcalc.calc(nxt.getLightSensor(), info.getEdge());
}

レビューして貰おう

  1. [吉田]これで要求分析からコーディングまでは通したんだけど、こんなんで良いのかな?
  2. [舟元]じゃあ、偉い人にレビューして貰おうよ。成果物のレビューは大事だからね。
  3. [吉田]なるほど、でも、ちょっと怖いな。集中力続くかな?

はじめてレビューを受ける

  1. [偉い人]思ったよりよく出来ているよ。エライ、エライ。でも、これだけだと今回対象としているシステムを全て表現しているとは言えないな。書いてくれたモデルについて詳細にコメントはしないけど、、、云々。。。
  2. [吉田]はっはい!(あわわわー。。。(. .)φメモメモ。。。)

ざっくりと、以下のようなコメントを頂きました。

  • システム全体(開始・実行・終了など)の振る舞いを表すモデルが無い。
  • どうやってシステムが起動・開始するのか。
  • どんなときに、どうやってシステムが終了するのか。異常時に安全に停止することも大切だね。
  • ライトレースはどのような(制御)方式で行われているのかを表すモデルが無い。
  • ソフトウエアの構成物(使用OSやライブラリなど)が分からない。
  • nxtOSEKや倒立振子ライブラリ、制御ライブラリ(ecrobot API)と、自分で作ったシステムの関係性。
  • 非機能な要件が漏れている
  • 使用できるリソース(ROM/RAM)についての記載が無い。
  • 時間的な制約についての記載が無い。
  • 倒立振子ライブラリは、4ms周期で呼び出す必要があるけど、設計上、満足されているか?
  1. [偉い人]組込みシステムは非機能要求が多いのだからな。その辺にも留意しろよ。今回はUMLを使ってモデリングしたみたいだけど、UMLでは表現しづらいかもしれない。他のモデリング言語や手法などについても簡単にまとめておいたからそっちも併せて確認しておくように。
項目 内容
USDM 要求仕様の表記法。要求を分割し階層構造で表現することができイメージしやすい、要求と仕様の関係を把握しやすい、などの特徴がある。テストケースの作成も容易
SysML UMLを拡張し、且つ、コンパクトにしたモデリング言語。UMLより汎用性を下げてシステムエンジニアに特化させている。要求図などが追加されている。非機能要求も表現でき、要素間のトレーサビリティを確保するための概念なども導入されている。
EAST-ADL2 自動車の電子システムの開発向けのDSL。機能安全などにも対応している。
simulinkモデル システム制御や信号処理などロジカルな処理を表現するのに適しているモデル。
形式手法 数式や論理式などによるシステムの仕様記述、検証手法のこと。あいまいさを排除できることから品質向上の手段として注目されている。上流工程のツールとしてVdmやSPINなどがある。
  1. [吉田]こ、怖い。血液逆流しそうだった。てか、あんまり褒められなかった。
  2. [舟元]僕も口の中が乾いたわー。でも、確かにシステムの一部しか把握していないことが分かったよ。
  3. [吉田]そうだね、「ライントレースする」って事しか考えてなかったね。そういえば、組込みシステムでは機能的な要求以外に、非機能な要求もあるって言ってたね。やってみないとピンと来ない事ってあるんだねー。UML以外にも色んなツールがあるみたいだよ。最適ななツールを使うこなすべしって事だよね。今回完全に抜け落ちていた非機能要求系も例えば、SysMLを使えば書けちゃうとか?しかし、実際にやってみて肝に落ちた感じするわ。
  4. [舟元]今回は「ライントレースする」事だけにしか目が行ってなかったけど、今度はシステム全体を見るようにしないとね。
  5. [吉田]どうかんでーす!

まとめ

  1. [吉田]今回は、前回までに作った「ライントレースする」という要求を実現するシステムのモデリングを行いました。モデリング。。。んー図を書くだけだし簡単かなと思っていましたが、なかなか難しいですね。まだまだモデルを書いているうちに「何について書いているのか」を見失って、迷走しちゃいます。 きっと私の迷走が、ロボ太に伝わっちゃうんかなー。今のうちに整理しておこう。まずは、分析と設計の違いを意識するのが大切でした。
フェーズ 目的
分析 作るものがどんなものかを整理して、 何を作らないといけないかを見つける。
設計 (分析の結果から)作らないといけないものを、 どうやってソフトウエアにすれば良いかを決める。
  1. [吉田]分析結果のモデルに日本語で書かれた部分をアルファベットにするだけで、終わりかと思っていたのに。。。大会に向けたシステムを作るときは、要注意だなぁ。機能と非機能というキーワードも出てきました。「機能」はイメージが湧きましたが、「非機能」って難しいですね。ROMやRAMの容量とか時間的な制約って言われたので、性能とかの話しなんでしょうか。きっと機能じゃないものが非機能なんですね。
  2. [偉い人](え、、、おいおい、、、)

【参照リンク】

<サイト最終アクセス:2011.08>

株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。文系出身で右も左もプログラミングも分からない中、ETロボコンへの参加を命じられ四苦八苦中。

株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。学生時代に二度ETロボコンに参戦。配属されてから役に立ちそうな技術・知識を盗むべく奮闘中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています