Edited at

ROS講座31 python基礎


環境

この記事は以下の環境で動いています。

項目

CPU
Core i5-8250U

Ubuntu
16.04

ROS
Kinetic

python
2.7.12

インストールについてはROS講座02 インストールを参照してください。

またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。


概要

ここまでROSノードをC++で作成していましたがpythonでも作成をすることができます。C++との違いを解説していきます。


ソースコード


talker

String型のROSメッセージをpublishするノードの記述です。


py_lecture/scripts/python_talker.py

#!/usr/bin/env python

import rospy
import rosparam
from std_msgs.msg import String

def talker():
rospy.init_node('talker')
word = rospy.get_param("~content", "default")
pub = rospy.Publisher('chatter', String, queue_size=10)

r = rospy.Rate(1) # 10hz
while not rospy.is_shutdown():
str = "send: %s" % word
rospy.loginfo(str)
pub.publish(str)
r.sleep()

if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException: pass



  • msgファイルのインクルード

    from std_msgs.msg import Stringと記述します。(パッケージ名).msgの中を読み込みます。

  • privateパラメーターの読み込みは

    word = rospy.get_param("~content", "default")と記述します。~(パラメーター)という名前でアクセスします。

  • publisherの宣言

    pub = rospy.Publisher('chatter', String, queue_size=10)と記述します。

  • loggerの実行

    rospy.loginfo(str)ROS_INFO()と同等のloggerを出力します。

  • C++と違いspinOnce()を実行する必要はありません。


listener


py_lecture/scripts/python_listener.py

#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def callback(data):
rospy.loginfo("recieved %s", data.data)
now = rospy.Time.now()
rospy.loginfo("now: %f", now.to_sec())

def listener():
rospy.init_node('listener')
rospy.Subscriber("chatter", String, callback)
rospy.spin()

if __name__ == '__main__':
listener()



  • subscriverの宣言

    rospy.Subscriber("chatter", String, callback)で宣言します。

  • ros time

    rospy.Time.now()でC++のros::Time::now()と同等の値を取得します。

  • spin

    rospy.spin()と記述します。


timerのサンプル


py_lecture/scripts/python_timer.py

#!/usr/bin/env python

import rospy

def timerCallback(event):
rospy.loginfo("timer callback")

def timer():
rospy.init_node('timer')
rospy.sleep(2.0)
rospy.loginfo("sleep 2s")

rospy.Timer(rospy.Duration(2), timerCallback)
rospy.spin()

if __name__ == '__main__':
try:
timer()
except rospy.ROSInterruptException: pass



  • sleep

    rospy.sleep(2.0)で2秒間のスリープをします。

  • tiemrの設定

    rospy.Timer(rospy.Duration(2), timerCallback)で2秒ごとにtimerCallbackが起動します。


実行権限の付与

pythonはスクリプト言語なのでこれ自体はビルドは必要ありません。ただpythonファイルを実行するためには実行権限を付ける必要があります。


実行権限の付与

roscd py_lecture/scripts/

chmod +x python_talker.py
chmod +x python_listener.py


実行


1つ目のターミナル

roscore



2つ目のターミナル

rosrun py_lecture python_talker.py _content:=data



3つ目のターミナル

rosrun py_lecture python_listener.py



pythonのパス

pythonのモジュール等を探索するパスは環境変数のPYTHONPATHに入っています。echo $PYTHONPATHとすると標準では/home/{user名}/catkin_ws/devel/lib/python2.7/dist-packages:/opt/ros/kinetic/lib/python2.7/dist-packagesとなっています。これらのパスにあるpythonモジュールをpythonのノード内で使用することができます。


コメント

python自体はmakeは必要ありませんがカスタムmsgの生成等でmakeが必要なことはあります。


参考

ROSwiki pythonノード


目次ページへのリンク

ROS講座の目次へのリンク