今回はROSの基本のPublisherとSubscriberを使ったROSの基本プログラムtopic通信(非同期通信)をうごかしたので、その備忘録。
仕組みとしてはこんな感じ
・Topic :データを書き込む場所(非同期通信のメイン)
・Service :publisher側でsubscriberの結果を受け取る機能。publisherと一緒に呼び出す
・Publisher:データを書き込むノードとスクリプト
・Subscriber:データを読み込むノードとスクリプト
・Service :publisher側でsubscriberの結果を受け取る機能。publisherと一緒に呼び出す
・Publisher:データを書き込むノードとスクリプト
・Subscriber:データを読み込むノードとスクリプト
目次
1.ROSの「turtlesim」を試す
2. ROSの基本プラグラムでtopic通信の実行
3. roslaunchで一斉に(ターミナル1つで)プログラムの実行
4. rostopicでroslaunchのログの確認
追記:エラー対策
1.ROSの「turtlesim」を試す
まずROSでの基本「turtlesim」を試してみる# 1つ目のターミナルで $ roscore # 2つ目のターミナルでnodeの起動 $ rosrun turtlesim turtlesim_node # 3つ目のターミナルで制御するnodeを動かす $ rosrun turtlesim turtle_teleop_key #### カメが表示されてカーソルを押せば動く # 4つ目のターミナルで動作中の対応関係を表示 $ rqt_graph
簡単にROSを試してみた。
2. ROSの基本プラグラムでtopic通信の実行
Publisher(talker.py)の作成
cd src/ros_start # roscd ros_start # python scripts用フォルダを作る mkdir scripts && cd scripts # Publisher(talker.py)の作成 vi talker.py
talker.py
#!/usr/bin/env python3 import rospy from std_msgs.msg import String # create node named "talker" rospy.init_node("talker") # create Publisher and "chatter" is Topic name pub = rospy.Publisher("chatter", String, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): hello_str = String() hello_str.data = "hello world %s" % rospy.get_time() pub.publish(hello_str) rate.sleep()
Subscriber(listener.py)の作成
roscd ros_start # Subscriber(listener.py)の作成 vi listener.py
listener.py
#!/usr/bin/env python3 import rospy from std_msgs.msg import String def callback(message): rospy.loginfo("I heard %s", message.data) # create node named "listener" rospy.init_node("listener") # create Subscriber and "chatter" is Topic name sub = rospy.Subscriber("chatter", String, callback) rospy.spin()
ターミナルを3個使ってプログラムの実行
chmod 755 talker.py listener.py #1こ目のteminalで roscore # 2こめで roscd ros_start (pwd==~/catkin_ws/src/ros_start) rosrun ros_start talker.py #3こめで rosrun ros_start listener.py >>> #### [INFO] [1641830803.522044]: I heard hello world 1641830803.5217884 #### [INFO] [1641830803.622811]: I heard hello world 1641830803.6220603 #### [INFO] [1641830803.722807]: I heard hello world 1641830803.7220128 #### ~~~~~
動いてることが確認できた。
3. roslaunchで一斉に(ターミナル1つで)プログラムの実行
terminalを1つで・roscore
・Publisher(talker.py)
・Subscriber(listener.py)
を一斉に実行する。
# 一斉に実行するためのスクリプトの作成 roscd ros_start mkdir launch vi launch/chat.launch
chat.launch
<launch> <node pkg="ros_start" name="talker" type="talker.py"/> <node pkg="ros_start" name="listener" type="listener.py"/> </launch>
roscd ros_start roslaunch ros_start chat.launch >>> #### ROS_MASTER_URI=http://localhost:11311 #### process[talker-1]: started with pid [656] #### process[listener-2]: started with pid [657]
logは出力されないけど、エラーが出ないので、ちゃんと動いてる。
logは「lostopic」で確認できる。
4. rostopicでroslaunchのログの確認
もう1つterminalを立ち上げる。
# 出力リストを表示 rostopic list >>> #### /chatter #### /rosout #### /rosout_agg
# logを表示 rostopic echo /chatter #### --- #### data: "hello world 1641831594.0200205" #### --- #### data: "hello world 1641831594.1205244" #### --- #### data: "hello world 1641831594.2202258" #### --- #### data: "hello world 1641831594.3208992" #### 〜〜
ちゃんと動いてることが確認できた。
ROSでのTopic通信(非同期通信)でした。
追記:エラー対策
rosrunの実行時に/usr/bin/env: ‘python3\r’: No such file or directory
のエラーが出る場合は改行コードを『Lu』に統一してやる必要があるので
sudo apt install nkf nkf -Lu --overwrite [ファイル名]
で解決できる。
参考サイト:改行コードを変換する