ROSのソースビルドと標準パッケージの置換方法

概要

 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 [インストール済み、自動]

Copyright (C) ASH Joe Masumura