アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

ROSの基本プログラムのTopic通信(非同期通信)を動かす

今回はROSの基本のPublisherとSubscriberを使ったROSの基本プログラムtopic通信(非同期通信)をうごかしたので、その備忘録。

仕組みとしてはこんな感じ

・Topicデータを書き込む場所(非同期通信のメイン)
・Servicepublisher側でsubscriberの結果を受け取る機能。publisherと一緒に呼び出す
・Publisherデータを書き込むノードとスクリプト
・Subscriberデータを読み込むノードとスクリプト

f:id:trafalbad:20220111154013p:plain


目次
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


f:id:trafalbad:20220113201427p:plain

簡単に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 [ファイル名]

で解決できる。
参考サイト改行コードを変換する