マイクロマウスのソフト設計の話 その1

2020年6月7日

こんにちは。そらです。

今回はマイクロマウスのソフトウェア設計の話を書いていきたいと思います。Twitterでアンケートをとってみました。

マウス合宿の日に発表をしようかなと思っていた内容を3つアンケートをとってみたところ一番高かったからという理由です。

RaspberryPiMouseではラズパイOSが乗っているためC++で書きましたが、STM32マイコンを使用したマイクロマウスのロボットではC言語で書いています。

この後の話はモデル化やオブジェクト指向の話になります。実装時にはC言語なのでオブジェクト指向のクラス等を使用することはありませんが、モデル化等をしておくと後から見直したときにわかりやすくなる、システム全体を俯瞰することができる等メリットがあるためやっておくと後々役立つと思われます。

オブジェクト指向の話等で、間違い等ありましたら指摘をしていただけると嬉しいです。




ソフトウェア設計ってなんだろうか?

マイクロマスではシステム設計?

ソフトウェア設計っていうとなんだろうといろいろと考えてみましたが、マイクロマウスにおいての設計はシステム設計になるのかなと思いました。例えば、基本設計、システム設計、ソフトウェア設計、概念設計等は言葉は違いますが近いものなのかなと思っています。

この後は、マイクロマウスのオブジェクトを抽出して、モデル化をして実装をする前にソフトウェアの流れ等をまとめていきたいと考えています。その前に、オブジェクト指向やUMLについて簡単に雰囲気をつかんでいきたいと思います。

オブジェクト指向プログラミングについて(簡単に雰囲気をつかむ)

オブジェクト指向ってよく聞きますが実際何なんだろうといわれると、明確な答えはないと考えられます。オブジェクト指向について書かれた技術書やWebサイトはたくさんありますが、説明が毎回少しずつ違うので、一概には説明できないものであり、完全に理解することは不可能なものであると考えられます。そのため、見出しに()つきで書いた通り簡単に雰囲気をつかむことができればいいのではないのだろうかと思います。

今回は自動車を例にオブジェクトを考えてみます。

全ての車について共通に持っているものをまとめたものがオブジェクト(クラス)であるとします。例えば、車クラスにはアクセル、ハンドル、ブレーキ等の機能や速度や走行距離等の情報をもっているものとします。

具体的にプログラムの実装ベースで考えてみます。まずは、C言語で車A,車Bがあるとします。

struct Car {
  /* 例として速度と距離を変数におきました。 */
  float velocity;
  float distance;
};

void controlAccelCar(struct Car *car)
{
}

void updateDistanceCar(struct Car *car)
{
}

int main()
{
  struct Car carA; 
    struct Car carB;
    
    /* 関数を使ってみる */
    controlAccelCar(&carA);
    controlAccelCar(&carB);
}

実装をしようとするとこんな感じになるのかなと思います。それぞれの車についてアクセルを踏んだ時の処理や距離を更新するか、ここで紹介したように構造体を作成して引数に引いてまとめるかんじでしょうか?

これをc++でクラスにまとめてみます。

class Car{ 
public:
  void controlAccel();
 void updatedistance();
private:
  float velocity;
  float distance;
};

int main()
{
  Car carA;
  Car carB;
  /* 関数を使ってみる */
 carA.controlAccel();
  carB.controlAccel();
}

クラスにまとめることで、わかりやすくなったかなと思います。車A、車Bの処理っていうことが明確になっただけでなく、変数に関してはprivateとすることで外部から直接アクセスできないようになり安全性が上がりました。

オブジェクト指向プログラミングができる言語では、クラスにまとめることで変数のアクセスを外部から簡単にできないようにすることや、今回の実装では書きませんでしたがここで定義したクラスを基底として、それぞれの車種に応じて機能を追加していくということができたりします。

実装から見えてくることは、オブジェクトをそれぞれの関数や変数をひとつにまとめています。また、プログラムとして処理を書いていくときは、いろいろなクラスを定義してそれぞれの中でオブジェクトを使用して処理をしていくことになることが考えられます。

簡単に雰囲気をつかむうえでは、オブジェクトをそれぞれモデル化して、オブジェクトの関係を使用していく手法ということでまとめさせていただきます。

UMLを簡単に紹介

UMLは統一モデリング言語と呼ばれ、システム工学やソフトウェアのモデリング等に使用されています。組み込み用に、機能を一部追加、再利用をしているSysMLというものもあるようですが、今回はUMLを使用していきたいと思っています。

UMLでは、ユースケース図やクラス図、アクティビティ図等のダイアグラム(図)を用いて、プログラムの流れやクラス同士の関係性、プログラムの流れ等を表現することができます。詳しいことに関しては各自で調べていただければと思います。

おわりに

今回の記事では、今後の話に必要なものの紹介をさせていただきました。オブジェクト指向って何?と自問自答することになりました。マウス合宿の日に合わせてマイクロマウスのシステム設計についてかいていこうと思います。ソフトウェア設計や実装って難しいですね。