はじめてのライブラリの作成&登録
Meridian計画。
以前の記事でライブラリ化について書きましたが、ようやく着手することができました。
趣味ながら長年開発を続けていると、調べる前から「このあたりって調べても情報があまりないんじゃないか?ひょっとして沼では?」と感じる直感みたいなものが働くようになります。
ライブラリ化についても同じ空気を察知しており、ゆえに未着手のまま後回しになっていました。
まずライブラリの基本的な作成方法について下調べを行いました。
しかし、自分が検索した範囲ではライブラリ名の競合問題についてはあまり触れられておらず、そのまま真似ても世界に迷惑をかけそうな気配がありました。
世界がまわっているのだからきっと何か正しい方法があるはず!ということまでは予想できるのですが、その情報への辿り着き方がわからないわけです。誰に聞いたら正解なのかもわからず、そもそも何をどこから聞けばいいのかわからない、そういう状態です。
詳しそうな方々があつまるVRロボット集会で思い切ってヒアリングをさせていただきました。そして、問題を起きにくくする手堅い書式についてバッチリなアドバイスやヒントをいただくことができました。
検索だけでは気づきにくい重要なポイントやノウハウを教えていただくことができ、不安が払拭されました。holypongさん、人形つかいさん、まさゆきさん、ありがとうございました。
以下に今回得た知見のポイントを備忘録がてらまとめておきます。
プリプロセッサ命令
下記のようなコードをよく見かけていたのですが、ずっと謎でした。
#ifdef ほにゃらら
しゃららら
#endif
これはプリプロセッサという命令群だそうで、使い方や説明は下記のサイトによくまとまっています。
ライブラリを導入する際にモジュールの二重呼び出しを防ぐことができる大事な命令も含まれています。内容が理解できてスッキリしました。
また、コードの中でアルゴリズム本体の前に書く変数の宣言などで、分岐をしたい時にif文が使えず困っていたのですが、このプリプロセッサ命令があればその課題もクリアできるそうです。
組み込み系の開発ではコメントアウトのような使い方もできるようです。
コードのライブラリ化
自作コードをライブラリ化するための書式については、下記のサイト等を参考にさせていただきました。最低限必要なファイルの構成や書式などについて知ることができました。わかりやすくまとめられていてとても助かりました。
【重要】 ネームスペースとクラス
ここからが検索ではなかなか出てこないところです。
ライブラリを作る際、独自に作成した関数名などが他のライブラリのものと被らないようにケアする必要があります。
そのためには名前空間(namespace)というものを定義しておく必要があるのですが、ただ設定しただけではコードが長くなり可読性が悪くなります。それらの問題をクリアするためには、namespaceの中にclassを作り、その中で関数名などを設定するのが上策とのことです。
ポイントを下記にまとめておきます。
ポイント①
他のライブラリと被らぬよう、ライブラリのnamespaceを深く深く作る。
また、ライブラリで使う関数をあらかじめクラスに含んでおく。
例:
namespace arduino {
namespace robotics {
namespace espteensy {
namespace meridian { // namespaceを入れ子にして深くする
class Meridian{ // クラスを設定
public:
int myfunction(int val); // 関数を設定
};
}}}}
ポイント②
長いネームスペースをライブラリ内で短縮登録しておく。
例:
namespace MERIDIANFLOW = arduino::robotics::espteensy::meridian;
ポイント③
ユーザーがライブラリを利用する際には、ライブラリをインクルード後に、
クラスをインスタンス化して使う。
例:
#include <Meridian.h>
MERIDIANFLOW::Meridian mr; //ライブラリのクラスを mr という名前でインスタンス化
...(中略)...
void loop() {
...(中略)...
int x = mr.myfunction(12345)); //関数名を mr.xxxx という書式にでき、短く済む
}
その他、名前空間についての詳しい説明は下記が参考になります。
世の中に出回っているライブラリを覗きましたが、メジャーなものは意外とnamespaceやclassを使っていないことが多かったです。
一方、個人制作系のライブラリでとても参考になる書式がみつかったので、自作のライブラリではそちらを参考に作成させていただきました。
Arduino IDEから検索できるように登録する
Arduino IDEのライブラリ検索で見つかるようにしてみます。
アプリ上から検索できるとライブラリが本格的なものに見え、メジャー感も出ます。幸運にもMeridianという名前のライブラリはArduinoにはまだなかったので、早速登録してみました。
細かなところでタグ付けという作業が必要のようだったのですが、github desktopを使って行うことができました。
また、Arduino IDEに登録するために一通りの書式が必要でしたので、そちらもあわせて記入しました。
登録方法は下記のサイトがとても参考になりました。
ついに Arduino に登録された!
Arduino IDE をお持ちの方は、スケッチ→ライブラリをインクルード→ライブラリを管理… を選択してみてください。
ライブラリマネージャが開くので、検索ウィンドウに「meridian」と入力すると…
登録したライブラリが出ました。幸運なことに、Arduinoのライブラリ界で、Meridianという名称は世界にひとつです。(いまのところ)
github リポジトリ
githubのURLはこちらになります。
これから初めてArduino用のライブラリを作られるという方のご参考にでもなれば…
…でも中身はこれから!
先にライブラリの登録から試してしまいましたが、v0.0.1のMeridianライブラリの中身はごく基本的な関数が4つ入っているだけです。
地道な移植作業がはじまりますが、ライブラリへの移植が完了すればもっと使いやすく&メンテもしやすく&共同開発もしやすく&他のボードへの対応もラクになるはずです。
未知で不安のあったライブラリ登録ができるようになったので、次はずっと後回しになっていたモーションファイルの要件定義について、本格的に考えていこうと思います。
次の記事:
前の記事:
目次: