まずなぜかroscdコマンドで私が作ったパッケージが見つからない。うん。
https://answers.ros.org/question/254813/cant-use-roscd-to-find-package/
source /path/to/catkin_ws/devel/setup.bash |
で治りました。
今度はDataをPublishするNodeとReceiveするNodeを作成します。これは一番基本なデータやり取りです。
まずいままで作ったパッケージに移動します。
$ roscd ch2 abc@abc-virtual-machine:~/myProject/catkin_ws/src/ch2$ |
そしてtalker.pyとlistener.pyを作りましょう。ROSのドキュメントにもサンプルコード書いていますが一応貼りておきます。
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29
http://wiki.ros.org/ROS/Tutorials/ExaminingPublisherSubscriber
まずFolderを作り、talker.pyを実行できるように属性を変更します。
$ mkdir scripts $ cd scripts $ vim talker.py $ chmod +x talker.py |
Program
#!/usr/bin/env python # license removed for brevity import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher(‘chatter’, String, queue_size=10) rospy.init_node(‘talker’, anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str = “hello world %s” % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == ‘__main__’: try: talker() except rospy.ROSInterruptException: pass |
次はVimでCMakeLists.txtを開きます。
以下の列を最初にComment Outされてるので、修正してください。
ちなみに、VIMで文字列を検索するには?を入力し文字列入れて>Esc>nで次の結果に飛ぶみたいに。
catkin_install_python(PROGRAMS scripts/talker.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) |
NodeのPublishing定義します。Topic名はchatterで、メッセージタイプはString(実は std_msgs.msg.String)です。
pub = rospy.Publisher(“chatter”, String, queue_size=10) |
こちらはNodeの名前を定義するコードです。Node名が定義するまでROS Masterと通信することができません。ここで、Nodeの名前はtalkerといいます。注意するのは”/”などは入れてる禁止です。
rospy.init_node(NAME, …) |
これは1秒10回実行するイメージですね。
rate = rospy.Rate(10) # 10hz |
もしプログラムはShutdownされなければ(Ctrl+Cなど)でメッセージを作ります。 rospy.loginfo(hello_str)はそのメッセージをScreenにPrintするようにし、最後はPublishする。
while not rospy.is_shutdown(): hello_str = “hello world %s” % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() |
次はlistener.pyですね。
$ cd scripts
$ vim listener.py
$ chmod +x listener.py
プログラム
#!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + “I heard %s”, data.data) def listener(): # In ROS, nodes are uniquely named. If two nodes with the same # name are launched, the previous one is kicked off. The # anonymous=True flag means that rospy will choose a unique # name for our ‘listener’ node so that multiple listeners can # run simultaneously. rospy.init_node(‘listener’, anonymous=True) rospy.Subscriber(“chatter”, String, callback) # spin() simply keeps python from exiting until this node is stopped rospy.spin() if __name__ == ‘__main__’: listener() |
もちろん、CMakeLists.txtの編集も忘れずに。
catkin_install_python(PROGRAMS scripts/talker.py scripts/listener.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) |
‘listener’というNodeを作ります。
rospy.init_node(‘listener’, anonymous=True) |
chatterというTopicをSubscribeします。
rospy.Subscriber(“chatter”, String, callback) |
最後はNodeをBuildします。
~/myProject/catkin_ws$ catkin_make ch2 Base path: /home/abc/myProject/catkin_ws Source space: /home/abc/myProject/catkin_ws/src Build space: /home/abc/myProject/catkin_ws/build Devel space: /home/abc/myProject/catkin_ws/devel Install space: /home/abc/myProject/catkin_ws/install #### #### Running command: “make cmake_check_build_system” in “/home/abc/myProject/catkin_ws/build” #### — Using CATKIN_DEVEL_PREFIX: /home/abc/myProject/catkin_ws/devel — Using CMAKE_PREFIX_PATH: /home/abc/myProject/catkin_ws/devel;/opt/ros/melodic — This workspace overlays: /home/abc/myProject/catkin_ws/devel;/opt/ros/melodic — Found PythonInterp: /usr/bin/python2 (found suitable version “2.7.17”, minimum required is “2”) — Using PYTHON_EXECUTABLE: /usr/bin/python2 — Using Debian Python package layout — Using empy: /usr/bin/empy — Using CATKIN_ENABLE_TESTING: ON — Call enable_testing() — Using CATKIN_TEST_RESULTS_DIR: /home/abc/myProject/catkin_ws/build/test_results — Found gtest sources under ‘/usr/src/googletest’: gtests will be built — Found gmock sources under ‘/usr/src/googletest’: gmock will be built — Found PythonInterp: /usr/bin/python2 (found version “2.7.17”) — Using Python nosetests: /usr/bin/nosetests-2.7 — catkin 0.7.29 — BUILD_SHARED_LIBS is on — BUILD_SHARED_LIBS is on — ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ — ~~ traversing 2 packages in topological order: — ~~ – ch2 — ~~ – ch2_tutorials — ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ — +++ processing catkin package: ‘ch2’ — ==> add_subdirectory(ch2) — +++ processing catkin package: ‘ch2_tutorials’ — ==> add_subdirectory(ch2_tutorials) — Configuring done — Generating done — Build files have been written to: /home/abc/myProject/catkin_ws/build #### #### Running command: “make ch2 -j2 -l2” in “/home/abc/myProject/catkin_ws/build” #### |
Runしてみる
$ cd ~/catkin_ws $ source ./devel/setup.bash $ rosrun ch2 talker.py $ rosrun ch2 listener.py |