ROSを利用する場合は、ROSのプログラムであるノードに対して、トピックと呼ばれるメッセージを送ることでカスタマイズできます。ですから、ROS自体をソースからコンパイルする必要はほとんどありません。
しかし、ROSの内部処理を理解したい場合や、ROSのバグ修正をしたい場合や、トピックで設定できる範囲を超えてROSの内部処理を変えたい場合などには、ROSをソースからビルドして、標準パッケージを置換する必要があります。
ROSをソースビルドする方法は、いくつかありますが、Ubuntuのパッケージのソースを取得してビルドする方法を使っています。Ubuntuは、Debianベースで開発されていますので、パッケージ管理の解説などは、下記のDebian管理者ハンドブックが参考になります。
Ubuntuでは、aptコマンドでパッケージのインストールができますが、ソースを取得することもできます。ただ、デフォルトでは使用できないため、「ソースコード」のリポジトリを有効にしておく必要があります。この操作は、Ubuntuをインストール後に、1回だけ実行すればOKです。
まず、sources.list の修正を行い、universe の deb-src のコメントを外して有効にします。
bionicは、Ubuntu18のコードネームですので、Ubuntuのバージョンが変わると、値も変わっていますが、先頭のコメントを外すだけでOKです。
$ sudo vi /etc/apt/sources.list
・変更前
deb http://jp.archive.ubuntu.com/ubuntu/ bionic universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic universe
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-updates universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic-updates universe
・変更後
deb http://jp.archive.ubuntu.com/ubuntu/ bionic universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic universe
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic-updates universe
次に、ros-latest.listの1行目をコピーして、先頭を「deb」から「deb-src」に変更します。
$ sudo vi /etc/apt/sources.list.d/ros-latest.list
deb http://packages.ros.org/ros/ubuntu bionic main
deb-src http://packages.ros.org/ros/ubuntu bionic main
パッケージのリポジトリ一覧を更新します。
$ sudo apt update
早速、ROSのナビゲーションを行っている move-base のソースを取得してみます。
まず、パッケージのビルド環境を整えます。
$ sudo apt build-dep ros-melodic-move-base
次に、apt source コマンドでソースを取得すると、自動で展開されます。ここでは、ナビゲーションを行うmove-baseのパッケージを取得します。melodicの部分は、ROSのコードネームですので、kineticなどROSのバージョン毎に異なります。
$ mkdir ~/src_build
$ cd ~/src_build
$ apt source ros-melodic-move-base
これで、「ros-melodic-move-base-バージョン番号」のフォルダにソースが展開されています。
ROSの内部処理を理解したい場合などは、これでソースを見ることができます。
ソースを修正したい場合は、ソースの修正を行います。
ソースの修正が終わったら、そのままビルドしても構いませんが、apt upgrade コマンドを実行すると元のソースに戻ってしまいます。そこで、ソース修正後にパッケージ名を変更し、元のパッケージを上書き可能にするように設定します。パッケージ名を変えておけば、apt upgrade コマンドで、元のソースに戻ってしまうことはありません。
パッケージ名を変更する場合、debianパッケージのcontrol ファイルを修正します。ここでは、ros-melodic-move-base を ros-melodic-move-base-new に書き換えています。
$ cd ~/src_build/ros-melodic-move-base-1.16.2
$ vi debian/control
・変更前
Package: ros-melodic-move-base
・変更後
Package: ros-melodic-move-base-new
Replaces: ros-melodic-move-base
Conflicts: ros-melodic-move-base
Provides: ros-melodic-move-base
dpkg-buildpackage コマンドで、ソースをビルドします。
$ dpkg-buildpackage -r -uc -b
dpkg-buildpackage コマンドの引数には、下記の意味があります。
引数 | 意味 |
---|---|
-r | 仮想ルートディレクトリで作業する |
-uv | 署名しない |
-b | バイナリパッケージのみ |
ls コマンドで、ビルド結果を確認します。
$ cd ~/src_build
$ ls -lrt
下記の拡張子のファイルが作成されています。インストールには、.deb ファイルだけが必要となります。
拡張子 | 内容 |
---|---|
.deb | バイナリパッケージファイル |
.ddeb | デバッグシンボルファイル |
.buildinfo | 情報ファイル(チェックサム・依存情報など) |
.changes | 情報ファイル(チェックサムなど) |
更新パッケージを標準パッケージと置き換えたい場合は、apt install コマンドで、新しく作成した更新パッケージをインストールします。インストールすると、元のパッケージは削除されます。メッセージも表示されますので、確認してから実行しましょう。
上記の move-base-new をインストールして、move-baseを置き換えてみます。
$ sudo apt install ./ros-melodic-move-base-new_1.16.2-0bionic_amd64.deb
----------
以下のパッケージは「削除」されます:
ros-melodic-move-base
以下のパッケージが新たにインストールされます:
ros-melodic-move-base-new
インストールが終わったら、apt list コマンドで確認します。move-base が削除され、move-base-new がインストールされ、置き換えられたことが確認できます。
$ apt list --installed | grep move-base
ros-melodic-move-base-msgs/bionic,now 1.13.0-0bionic.20190319.071621 amd64 [インストール済み、自動]
ros-melodic-move-base-new/now 1.16.2-0bionic amd64 [インストール済み、ローカル]
ちなみに、更新可能なパッケージを調べても、move-baseは表示されませんので、move-baseがバージョンアップしても、上書きされることはありません。
$ apt list --upgradable
一覧表示... 完了
パッケージをアンインストールする場合には、apt remove というコマンドが用意されていますが、既存パッケージを上書きした更新パッケージをアンインストールして、標準パッケージに戻す場合には、apt remove コマンドを使ってはいけません。もし、apt remove コマンドを使ってしまうと、そのパッケージを使っているパッケージも一緒にアンインストールされてしまいます。
ですから、ソースを書き換えた更新パッケージをアンインストールしたい場合は、元のパッケージを再インストールしてください。上記の move-base-new をアンインストールする場合は、move-base をインストールします。
$ sudo apt install ros-melodic-move-base
----------
以下のパッケージは「削除」されます:
ros-melodic-move-base-new
以下のパッケージが新たにインストールされます:
ros-melodic-move-base
インストールが終わったら、apt list コマンドで確認します。move-base-new が削除され、move-base がインストールされ、元の状態に戻ったことが確認できます。
$ apt list --installed | grep move-base
ros-melodic-move-base/bionic,now 1.16.2-0bionic.20190320.174030 amd64 [インストール済み]
ros-melodic-move-base-msgs/bionic,now 1.13.0-0bionic.20190319.071621 amd64 [インストール済み、自動]