potblog

技術メモとかガジェットレビューとか

ROSの開発環境構築からpub/sub通信まで

0. ubuntuの起動とROSの環境構築

開発環境であるubuntu16.04を用意して起動する。
参考:https://kledgeb.blogspot.jp/2016/04/ubuntu-1604-1-ubuntu-1604ubuntuubuntu.html

次にROS KineticのUbuntu16.04 へのインストールを行う。
端末を立ち上げて以下のコマンドを入力する。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu \
$(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 \
--recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full python-rosinstall
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

参考:http://wiki.ros.org/ja

1. ROSのワークスペースを作る

端末を立ち上げて以下のコマンドを入力する。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

ここで一度makeしておく。
ROSではcatkin_makeというコマンドを使ってワークスペースのプロジェクトをビルドする。
また、初回でこのコマンドを行えばワークスペースに必要なファイルやディレクトリが生成される。

catkin_make

catkin_makeしたら以下のようなファイル階層になっていると思われる。

ros_ws
|--build
|--devel
|--src
  • build: ビルドに関する設定やmakeのlogのファイルが入っている。
  • devel: 実行ファイルやmakeによって生成されたものが入っている。
  • src: ユーザがソースコードを保存する場所。

これでROSのワークスペースが作成できた

2. ROSパッケージを作る

ROSでは任意の機能をつめたソフトウェアの集合をパッケージと呼ぶ。
パッケージの雛型はcatkin_create_pkgで作成する。

cd ~/catkin_ws/src
catkin_create_pkg new_pkg rospy

この場合、パッケージの名前はnew_pkg、また依存関係を持たせるパッケージはrospyということになる。 ワークスペースでもう一度catkin_makeする。

cd ~/catkin_ws
catkin_make

3. ROSのコーディング

publisherのプログラムを作成する

gedit ~/catkin_ws/src/new_pkg/src/topic_pub.py

以下のコードをtopic_pub.pyに貼り付ける

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# スクリプトの内容をpythonに受け渡す
# コメントに日本語が入ってても実行できるように

# pythonのros関係のモジュールのインポート
import rospy
# トピックに送るメッセージの定義のインポート
from std_msgs.msg import Int32

# topic_publisherという名前でノードを初期化
rospy.init_node('topic_publisher')
# Publisher関数でノードを公開
pub = rospy.Publisher('counter', Int32)

# 配信する周期を2Hzに設定
rate = rospy.Rate(2)

# count変数を0で初期化
count = 0
# ノードがシャットダウンする準備ができるまでループ
while not rospy.is_shutdown():
    #  topic_publisherノードに変数countを公開
    pub.publish(count)
    # countを1増加
    count += 1
    # 2Hzで実行されるようにスリープ
    rate.sleep()

subscriberのプログラムを作成する

gedit ~/catkin_ws/src/new_pkg/src/topic_sub.py

以下のコードをtopic_sub.pyに貼り付ける

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# スクリプトの内容をpythonに受け渡す
# コメントに日本語が入ってても実行できるように

# pythonのros関係のモジュールのインポート
import rospy
# トピックに送るメッセージの定義のインポート
from std_msgs.msg import Int32

# メッセージを受け取るたびに呼び出されるコールバック関数
def callback(msg):
    # 受け取ったメッセージを表示
    print msg.data

# topic_subscriberという名前でノードを初期化
rospy.init_node('topic_subscriber')
# Subscriber関数でコールバックするメッセージを設定
sub = rospy.Subscriber('counter', Int32, callback)
# ノードのシャットダウンが準備されるまでループ
rospy.spin()

プログラムのビルド

cd ~/catkin_ws
catkin_make

5. ROSで作ったノードを実行してみる

現在開いている端末のほかにもう2つの端末を開き、以下のコマンドを上からそれぞれ入力する。

1つ目の端末

ROSではroscoreというコマンドを始めに起動することでさまざまなソフトウェアをスタートすることができる。

cd ~/catkin_ws
source devel/setup.bash
roscore

2つ目の端末

ROSでは各ノードの実行はrosrunというコマンドによって実行される。 ”topic_pub”を起動する。

cd ~/catkin_ws
chmod u+x ~/catkin_ws/src/new_pkg/src/topic_pub.py
source devel/setup.bash
rosrun new_pkg topic_pub.py

3つ目の端末

”topic_sub”を起動する。

cd ~/catkin_ws
chmod u+x ~/catkin_ws/src/new_pkg/src/topic_sub.py
source devel/setup.bash
rosrun new_pkg topic_sub.py

起動に成功したら以下のような結果が得られる。

1つ目の端末

... logging to /home/t/.ros/log/5678ff1e-fde0-11e7-9fef-a434d...
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://t-pc:33737/
ros_comm version 1.12.12

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.12

NODES

auto-starting new master
process[master]: started with pid [14333]
ROS_MASTER_URI=http://t-pc:11311/

2つ目の端末

t@t-pc:~/catkin_ws$ rosrun new_pkg topic_pub.py 
/home/t/catkin_ws/src/new_pkg/src/topic_pub.py:13: SyntaxWarning: The ...
  pub = rospy.Publisher('counter', Int32)

3つ目の端末

t@t-pc:~/catkin_ws$ rosrun new_pkg topic_sub.py 
11
12
13
14

ノードの確認

ROSシステムの状態を調べる方法の一つにrqt_graphがある。
topic_pubと topic_subを起動した状態で

rqt_graph

topic_publisherがcounterメッセージを配信し、そのメッセージをtopic_subscriberが購読していることが分かる。

終了のさせ方

端末内でctrl+C