こんにちは。だいCです。
ロボットのプログラミングしたいよーって人います?
今回からロボットのプログラミングを始めてみようと思います。
自分は「ロボットのプログラミングって何ですか?」って思うことがよくあります。
別にロボットのプログラミングに限った話ではありませんが、
本当に作りたいモノのほんの一部の作業をずっと続けていると、あれ?自分は何がしたかったんだっけ…?と見失うことがたまにあります。やりたいことの迷子になります。
プログラミングも迷子に陥りがちで、
プログラム自体を作りたいモノの一部とみなして「自分はいま〜を作っているゾ!」って思いながらプログラミングしないと作業に埋もれて本来の目的を見失いがちです。
「コードを書いて動かすだけの泥臭いクソつまらない作業をしている」と思った途端、モチベーションはダダ下がりです。自分の人生にとって無駄だと我慢して苦しみながらプログラミングしている人はかわいそうです。
無駄だという計算を走らされ続けて文句もいわず頑張ってくれている計算機もかわいそうです。
ということで、ここでは「ロボットを作るゾ!わーい!」と楽しい気持ちで始めましょう。
1. 対象読者
「〜してみよう」と誘っておいてなんですが、人に伝える文章という意味で、読者は以下の知識がある人を前提としています。
- Linux OSのプログラミング インタフェースの使用経験がある人
- git、GitHubを使ったことがある人
これらの知識について自分も素人なので恐縮ですが、もし書いてあることに間違いがあれば気軽にコメント頂けると嬉しいです。
2. milibってなんですか?
「運動知能研ライブラリ = Motor Intelligence lab. LIBrary」を縮めて「milib」と書いた名前のようです。
自分は「えむ あい りぶ」と読んでいます。
かつて日本には「運動知能研究室」という研究室があったそうです。
このライブラリはその研究室で開発されたものみたいです。
まだ詳しく知りませんが、ロボットのプログラミングにおいて便利かつ強力な計算ライブラリのようです。あまり大きな声では言えませんが、これを解読し使いこなすと、ひょっとすると世界を変えるかもしれない…と一部で噂されているかもしれないようです。
全然よく分からないので、とりあえず使ってみましょう!
3. 環境構築するPC環境
今から環境構築するPC環境をメモしておきます。
OS環境はUbuntu 18.04です。以下コマンドでの確認になります。
3.1. PC
Intel(R) NUC8i7BEH
$ sudo lshw
...
詳細: デスクトップコンピューター
製品: NUC8i7BEH (BOXNUC8i7BEH)
ベンダー: Intel(R) Client Systems
バージョン: J72992-305
シリアル: G6BE91500HCB
幅: 64 bits
...
lshwコマンドの -short オプションでCPU、メモリ、グラフィック等のクラスと詳細をざっくり確認できます。
3.2. CPU
processor Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
以下のように/proc/cpuinfoをのぞいても確認できるそうです。
$ cat /proc/cpuinfo
3.3. メモリ
memory 64KiB BIOS
memory 32GiB システムメモリー
memory 16GiB SODIMM DDR4 同期 2400 MHz (0.4 ns)
memory 16GiB SODIMM DDR4 同期 2400 MHz (0.4 ns)
memory 256KiB L1 キャッシュ
memory 1MiB L2 キャッシュ
以下のように /proc/memoinfo をのぞいても確認できるそうです。
$ cat /proc/meminfo
MemTotal: 32749116 kB
...
3.4. グラフィック
display CoffeeLake-U GT3e [Iris Plus Graphics 655]
lspciコマンドでPCIバス接続されたグラフィック確認することもできるそうです。
$ lspci
...
... VGA compatible controller: Intel Corporation CoffeeLake-U GT3e [Iris Plus Graphics 655] (rev 01)
...
3.5. ディスク
1TBのSSDがささっています。空き容量は700GBくらいあります。
3.6. OSとディストリビューション
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
3.7. カーネル
$ uname -r
5.4.0-72-generic
3.8. コンパイラ
GitHub上でチラリとmilibリポジトリ内のmake関連のコードを覗いてみるとデフォルトでは gcc をコンパイラとしているようです。clang などではないようです。
$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4. 環境構築のためのパッケージmilib starter
GitHubを見ると、milibを使える環境を自動で構築してくれる「milib-starter」というパッケージを、既に作ってくれているようです。
https://github.com/mi-lib/milib-starter
4.1. milib starter のクローン
まずこのリポジトリを自分のローカルにクローンしてみましょう。
自分はとりあえず 「milib」 というディレクトリを作っておきました。
この中にライブラリ群を入れていこうと思います。
$ mkdir milib # milibディレクトリを作成
$ cd milib # milibディレクトリに移動
$ pwd # パスを確認
/home/{自分の好きなディレクトリ}/milib
milib starter をクローンします。
$ git clone https://github.com/mi-lib/milib-starter.git
クローンできたら中身を確認します。
$ cd milib-starter # クローンしたmilib-starterへ移動
$ pwd # パスを確認
/home/{自分の好きなディレクトリ}/milib/milib-starter
$ ls # 中身を確認
README.md config deb scripts
milib starterのディレクトリ構成を見てみましょう。
$ tree
.
├── README.md
├── config
├── deb
│ ├── dzco-dev_1.4.5-debian1_amd64.deb
│ ├── liw-dev_1.2.7-debian1_amd64.deb
│ ├── neuz-dev_0.2.6-debian1_amd64.deb
│ ├── roki-dev_1.6.20-debian1_amd64.deb
│ ├── roki-fd-dev_1.4.4-debian1_amd64.deb
│ ├── roki-gl-dev_1.6.20-debian1_amd64.deb
│ ├── zeda-dev_1.6.16-debian1_amd64.deb
│ ├── zeo-dev_1.10.3-debian1_amd64.deb
│ ├── zm-dev_1.3.22-debian1_amd64.deb
│ └── zx11-dev_1.2.7-debian1_amd64.deb
└── scripts
├── milib-install
├── milib-rebuild
└── milib-uninstall
README.mdがありますね。
4.2. milib starter の README
まずはREADME.mdを読んでみます。
以下、自分の言葉で勝手に日本語に訳して書いてみています。
—
milib starter
Copyright (C) Tomomichi Sugihara (Zhidao) since 1998
[なんですか?これ]
このスターターキットにはインストーラ、アンインストーラ、milibを再ビルドするスクリプトが入っているよ。これらは Ubuntu で動くよ(もしくは Debian でもイケるかも。試したことないけど)。
milib はロボットのコントロールやシミュレーションを開発するライブラリを集めたものだよ。ライブラリには以下が含まれるよ:
ZEDA – 初歩的なデータとアルゴリズム
ZM – 手軽な数学ライブラリ
neuZ – ニューラルネットワークのライブラリ
DZco – ディジタル制御のライブラリ
Zeo – Z/幾何学・光学計算ライブラリ
RoKi – ロボット キネティクス ライブラリ(キネマティクスではなくキネマティクス)
ZX11 – Xウインドウシステムのインタフェースライブラリ用ラッバー
LIW – Linuxシステム依存の操作を支援するウィザード
RoKi-GL – ロボット キネティクス ライブラリ: OpenGLによる可視化
[インストール方法 / アンインストール方法]
インストール
もしライブラリのインストール先を特定の場所にする必要があるなら config 内の PREFIX を編集してね。
% milib-install [clone/deb]
コマンドラインでのオプションの意味は以下のようになっているよ。
clone: ライブラリのソースコードをGitHubのリポジトリから取ってくるよ
deb: ディレクトリdeb/以下のDebianパッケージからライブラリをインストールするよ。
もしオプションを省略したら、Git情報なしでソースコードをリポジトリからダウンロードするよ。
アンインストール
以下を実行してね:
% milib-uninstall [deb]
deb オプションはDebianパッケージからインストールしたときだけ有効だよ。
[つかいかた]
もし必要なら自分の環境変数 PATH と LD_LIBRARY_PATH を設定しておいてね。
Bourne shell ファミリー (bash, zsh, etc.) なら以下のように設定するよ。
% export PATH=$PATH:$PREFIX/bin
% export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PREFIX/lib
C shell ファミリー (csh, tcsh, etc.)なら以下のように設定するよ:
C shell ファミリー (csh, tcsh, etc.)なら以下のように設定するよ:
[お問い合わせ]
zhidao@ieee.org
—
ふむふむ。
インストールの選択肢としては、
「GitHubからクローン」か「debパッケージを展開」か「Git情報なしダウンロード」
があるみたいですね。
GitHubには最新版が上がっていそうなので、GitHubからソースコードをクローンして取ってくることにします。
とりあえず、「インストール」に書かれた手順を試してみて、自分が作成しておいた「milib」ディレクトリ内にライブラリ群をクローンしてみましょう。
4.3. milib starterによる自動クローンとインストール
まず「config」ファイルを適当なテキストエディタで開いて、中にある変数 PREFIX に対し自分が作成しておいた「milib/」のパスを書いておきましょう。以下編集後の「config」 ファイルの中身です。
PREFIX=/home/{自分の好きなディレクトリ}/milib
LIBS="zeda zm neuz dzco zeo roki liw zx11 roki-gl roki-fd"
そして、「 scripts/」 ディレクトリ内にあるシェルスクリプト「milib-install 」でクローンを実行してみます。
$ pwd # 現在scriptsディレクトリにいることを確認
/home/{自分の好きなディレクトリ}/milib/milib-starter/scripts
$ ./milib-install clone # 実行
するとクローンする前に、何やら色々aptパッケージをインストールし始めました。わ〜聞いてないよ〜!
(あとで「milib-install」の中をテキストエディタで覗いてみると、インストールしたのは以下でした)
git wget unzip rename make gcc fakeroot libxml2-dev xorg-dev libtiff-dev libjpeg-dev freeglut3-dev
そして、最後に以下のメッセージが出てきて終了しました。クローンはできていないようです。
--- (前略) ---
libxml2-dev:amd64 (2.9.4+dfsg1-6.1ubuntu1.4) を設定しています ...
./milib-install: 12: .: Can't open ./config
どうやら config ファイルが置いてある階層から実行しないとダメみたいですね。
scripts ディレクトリの一個上の階層へ戻って、再度スクリプト「milib-install」でクローンを実行してみます。
$ pwd # milib-starter/ にいることを確認
/home/{自分の好きなディレクトリ}/milib/milib-starter
$ ./scripts/milib-install clone # 実行
すると今度は以下のメッセージが出てきて終了しました。クローンはできていないようです。
--- (前略) ---
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 3 個。
installing libraries and tools under /home/{自分の好きなディレクトリ}/milib ...
making directory /home/{自分の好きなディレクトリ}/milib/bin ...
making directory /home/{自分の好きなディレクトリ}/milib/include ...
making directory /home/{自分の好きなディレクトリ}/milib/lib ...
Add /home/{自分の好きなディレクトリ}/milib/bin into your PATH by
export PATH=/home/{自分の好きなディレクトリ}/milib/bin:$PATH
for Bourne shell family (bash, zsh, ksh, etc.), or by
set path = ( /home/{自分の好きなディレクトリ}/milib/bin $path )
for C shell family (csh, tcsh etc.).
「milib/」 ディレクトリの下を見ると 「bin/」「include/」「lib/」という名前の空のディレクトリが作成されていました。ここがインストール先になるようです。
どうやら README.md の [つかいかた] に書かれていたとおり、これら「bin」「lib」のディレクトリパスを環境変数「PATH」と「LD_LIBRARY_PATH」に追記しておかないとインストールできないようですね。[つかいかた]ってこのスクリプト「milib-install」の使い方のことだったんですかね。てっきりインストール後のライブラリの使い方のことだけかと思っていました。
では以下のように「PATH」と「LD_LIBRARY_PATH」に追記しておきます。
$ pwd # milib-starter/ にいることを確認
/home/{自分の好きなディレクトリ}/milib/milib-starter
$ . ./config # configファイル内の設定を現在の端末に反映。
$ echo $PREFIX # 変数PREFIXが反映されていることを確認
/home/{自分の好きなディレクトリ}/milib
$ export PATH=$PATH:$PREFIX/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PREFIX/lib
$ echo $PATh # 確認
--(略)-- :/home/{自分の好きなディレクトリ}/milib/bin
$ echo $LD_LIBRARY_PATH # 確認
--(略)-- :/home/{自分の好きなディレクトリ}/milib/lib
さてここまで書いてみて再度スクリプト「milib-install」でクローンを実行してみます。
$ ./scripts/milib-install clone
すると今度はクローンし始めました。
と同時にコンパイルまで走り、実行ファイルやライブラリなどを自動でビルドし始めました。
installing libraries and tools under /home/{自分の好きなディレクトリ}/milib ...
/home/{自分の好きなディレクトリ}/milib/bin ... valid path.
/home/{自分の好きなディレクトリ}/milib/lib in LD_LIBRARY_PATH.
cloning zeda ...
Cloning into 'zeda'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/zeda' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning zm ...
Cloning into 'zm'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/zm' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning neuz ...
Cloning into 'neuz'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/neuz' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning dzco ...
Cloning into 'dzco'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/dzco' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning zeo ...
Cloning into 'zeo'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/zeo' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning roki ...
Cloning into 'roki'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/roki' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning liw ...
Cloning into 'liw'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/liw' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning zx11 ...
Cloning into 'zx11'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/zx11' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning roki-gl ...
Cloning into 'roki-gl'...
--(中略)--
make[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/roki-gl' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
cloning roki-fd ...
Cloning into 'roki-fd'...
--(中略)--
ake[1]: ディレクトリ '/home/{自分の好きなディレクトリ}/milib/milib-starter/roki-fd' から出ます
/home/{自分の好きなディレクトリ}/milib/milib-starter
completed.
標準出力を見てみると、
zedaライブラリだけ app/ ディレクトリがない というエラーが出ているのと、
各ライブラリ共通してclean する時に削除するファイルがない というエラーが出ているのと、
各ライブラリ共通してコンパイルするときに最初は config がない というエラーが出ているようです。
が、これらはインストールにおいて致命的なエラーではなさそうです。
各ライブラリ共通して
- ライブラリ
- ヘッダファイル
- ツール
- アプリケーション
がインストールされているようです。
また、インストールされたライブラリのバージョンと、依存する各ライブラリのバージョンも標準出力されています。自分の場合、インストールされたものは以下のようです。
インストールされた ライブラリ |
インストールされた バージョン |
依存ライブラリの最低限必要なバージョン | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
libzeta | libzm | libneuz | libdzco | libzeo | libroki | libliw | libzx11 | libroki-gl | libroki-fd | ||
libzeta | 1.6.18 | ― | ― | ― | ― | ― | ― | ― | ― | ― | ― |
libzm | 1.3.22 | 1.6.4 | ― | ― | ― | ― | ― | ― | ― | ― | ― |
libneuz | 0.2.6 | 1.6.4 | 1.3.13 | ― | ― | ― | ― | ― | ― | ― | ― |
libdzco | 1.4.6 | 1.6.4 | 1.3.13 | ― | ― | ― | ― | ― | ― | ― | ― |
libzeo | 1.10.3 | 1.6.4 | 1.3.13 | ― | ― | ― | ― | ― | ― | ― | ― |
libroki | 1.6.20 | 1.6.14 | 1.3.13 | ― | ― | 1.10.2 | ― | ― | ― | ― | ― |
libliw | 1.2.7 | ― | ― | ― | ― | ― | ― | ― | ― | ― | ― |
libzx11 | 1.2.7 | 1.6.4 | ― | ― | ― | ― | ― | ― | ― | ― | ― |
libroki-gl | 1.6.21 | 1.6.16 | 1.3.13 | ― | ― | 1.9.16 | 1.6.16 | 1.2.7 | 1.2.7 | ― | ― |
libroki-fd | 1.4.4 | 1.6.4 | 1.3.13 | ― | ― | 1.9.16 | 1.6.16 | ― | ― | ― | ― |
「milib」ディレクトリに戻ってみて、インストールされたものをざっと確認すると以下のような構成になっていました。
.milib/
├── bin/
│ ├── cad2ztk
│ ├── ...
│ └── zxwatch
├── include/
│ ├── dzco/
│ ├── liw/
│ ├── neuz/
│ ├── roki/
│ ├── roki-fd/
│ ├── roki-gl/
│ ├── zeda/
│ ├── zeo/
│ ├── zm/
│ └── zx11/
├── lib/
│ ├── libdzco.so
│ ├── libliw.so
│ ├── libneuz.so
│ ├── libroki-fd.so
│ ├── libroki-gl.so
│ ├── libroki.so
│ ├── libzeda.so
│ ├── libzeo.so
│ ├── libzm.so
│ └── libzx11.so
└── milib-starter/
├── deb/
├── dzco/
├── liw/
├── neuz/
├── roki/
├── roki-fd/
├── roki-gl/
├── scripts/
├── zeda/
├── zeo/
├── zm/
└── zx11/
ソースコード群は milib/ 内に配置するつもりでしたが、結果として milib-starter/ の中に配置されました。
ライブラリをまずは使ってみるだけなので、ディレクトリ構成としてはこちらの方が見やすく、結果オーライだったかもしれません。
サイズも見ておきます。
$ pwd
/home/{自分の好きなディレクトリ}/milib
$ du .
...
79552 . # kB(キロバイト)
ソースファイルとオブジェクトファイルも含んで80MBくらいのようです。
インストールされたライブラリ達「bin」「include」「lib」のみの合計サイズを見ておくと
$ du --total bin include lib
...
4492 合計
だいたい4.5MBくらいのようです。
ふぅ〜。
ということで環境構築としてソースコードを取ってきてビルドしてライブラリをインストールする所まで出来たようです。
お疲れ様でした。
次回はライブラリを使ってみましょう。
それではまた。
[…] こんにちは。だいCです。以前 運動知能研ライブラリ milib の環境構築をしてみました。今回からライブラリの中身を見ていきたいと思います。 […]