rosgoのドキュメントが特に見当たらないので使い方をまとめる。catkinで結構やれるっぽい。catkinビルドシステムに慣れていないのでとてもめんどくさい。
golangとロボット制御とか分散ノード作るのって凄い親和性高いと思うのでrosにつなげるのは良い。ros使わずにgobotでやりたいけど。
2016/02/19に構成が結構変わったので一部修正
環境設定
ubuntu 14.04 LTS環境を前提とする。macでもvagrantなんかでやってください。goは1.5.3で動作確認。goのインストールはgvm何かを使ってやってください。
goのインストール
一応書く
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
$ gvm install go1.4
$ gvm use go1.4
$ gvm install go1.5.3
$ gvm use go1.5.3
どうせcatkinでGOPATH書き換えるので、pkgsetとかは使わなくて良い。
rosのインストール
ros周りインストール
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install ros-indigo-desktop-full
$ sudo apt-get install python-rosinstall
ros初期化
$ sudo rosdep init
$ rosdep update
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
rosgoの環境構築
catkin workspaceの作成
rosgo周りのパッケージや、自作のrosgoパッケージを保存する場所を初期化する. ここでは~/rosgo_ws
とする
$ cd ~/rosgo_ws
$ mkdir src
$ cd src
$ catkin_init_workspace
パッケージのダウンロード
$ cd ~/rosgo_ws/src
$ git clone git@github.com:akio/rosgo.git # rosgoのメタパッケージ
$ git clone git@github.com:akio/gengo.git # msgからstructを生成するライブラリ
$ git clone git@github.com:akio/rosgo_messages.git # buildツール
$ git clone git@github.com:akio/rosgo_tests.git # rosgoのサンプル
ビルドしてみる
$ cd ~/rosgo_ws/
$ catkin_make
catkin_makeで、goのソースなどが~/rosgo_ws/devel/lib/go/src
以下に配置される。rosgo_testの中に定義されているmessageのstructも、gengoを元に、~/rosgo_ws/devel/lib/go/src/rosgo_tests
に生成されている。
また、実行ファイルが、~/rosgo_ws/devel/lib/go/pkg/
以下に作成されている。
rosgo_testの実行
作成したワークスペースに関する環境変数の読み込みを行い、rosrunでnodeを起動する
$ source ~/rosgo_ws/devel/setup.bash
- roscore実行
$ roscore
- node実行
rosrun rosgo_tests test_listener
nodeが起動する。あとは、このrosgo_testsの構成を真似て、rosのnodeをgolangで書いていけば良さそう。
独自のライブラリの配置等
~/rosgo_ws/devel/lib/go/
をGOPATHにする必要が有るので、go get
先をこちらにするようにgo pathを書き換える処理を入れる。多分こんな感じでgo getすれば良い。多分。要検証
GOPATH=~/rosgo_ws/devel/lib/go/ go get hoge
適当なパッケージを作って(この場合はrosgo_cmakeとする)、その中にこんな感じのcmake scriptを入れておくとCmakeListの中で依存パッケージを記述しておけばcatkinのdevel以下にパッケージを落とせる。
function(rosgo_get package)
set(old_gopath "$ENV{GOPATH}")
set(ENV{GOPATH} "${CATKIN_DEVEL_PREFIX}/lib/go/")
execute_process(
COMMAND go get "${package}"
)
set(ENV{GOPATH} "${old_gopath}")
endfunction()
使うときはCMakeLists.txtの中でこんな感じに記載するとGOPATHを気にしなくて良くなる
rosgo_get("golang.org/x/net/context")
rosgoでパッケージを作る
後で追記