ROS#09Nodesを作ってみよう

まずなぜか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

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする