ROS 三 編寫簡單的訊息發布器和訂閱器

2021-08-20 01:36:15 字數 4919 閱讀 7109

」節點「是ros術語,它連線到ros網路的可執行檔案。在這裡,我們將建立發布器(「talker」)節點不斷廣播訊息。

進入之前建立的beginner_tutorials包

$ roscd beginner_tutorials
**

首先建立scripts目錄存放python**

$ mkdir scripts

$ cd scripts

$ wget 

/ros_tutorials/kinetic‐devel/rospy_tutorials/001_talker_

listener/talker.py

$ chmod +x talker.py

$ rosed beginner_tutorials talker.py
內容如下:

#!/usr/bin/env python

#每個python的ros節點會在頂部描述,,第一行確保你的指令碼是使用python執行的指令碼

# license removed for brevity

import rospy

from std_msgs.msg import string

#需要匯入rospy客戶端庫,匯入std_msgs.msg重用std_msgs/string訊息型別

deftalker

():pub = rospy.publisher('chatter', string, queue_size=10)

rospy.init_node('talker', anonymous=true)

#定義talker 介面,pub = rospy.publisher("chatter", string, #queue_size=10)表示節點發布chatter 話題,使用string 字元型別,實際上就是類#std_msgs.msg.string。queue_size 表示佇列的大小(適合hydro以後版本),如果#佇列訊息處理不夠快,就會丟棄舊的訊息。

rate = rospy.rate(10) # 10hz

#建立rate 物件,與sleep()函式結合使用,控制話題訊息的發布頻率。

while

not rospy.is_shutdown():

hello_str = "hello world %s" % rospy.get_time()

rospy.loginfo(hello_str)

pub.publish(hello_str)

rate.sleep()

#rospy.is_shutdown()返回false 就會退出(例如按下ctrl-c)

#程式執行pub.publish(string(str)),在chatter 話題發布string 訊息

#r.sleep()通過睡眠來,保持訊息傳送頻率

#rospy.loginfo(str)函式在螢幕輸出除錯資訊,同時寫入到節點日誌檔案和rosout 節#點

#if __name__ == '__main__':

try:

talker()

except rospy.rosinterruptexception:

pass

#標準的python main 檢查,這個會捕獲rospy.rosinterruptexception 異常,當按#下ctrl-c 或節點關閉的話,即使在rospy.sleep()和rospy.rate.sleep()函式裡都#會丟擲異常。

**
$ roscd beginner_tutorials/scripts/

$ wget

/ros_tutorials/kinetic‐devel/rospy_tutorials/001_talker_

listener/listener.py

檔案內容如下:

#!/usr/bin/env python

import rospy

from std_msgs.msg import string

defcallback

(data):

rospy.loginfo(rospy.get_caller_id() + "i heard %s", data.data)

deflistener

():# in ros, nodes are uniquely named. if two nodes with the same

# node 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()

不要忘記增加可執行許可權:

$ chmod +x listener.py
我們使用cmake 作為構建系統,即使是python 節點也需要使用。

這確保針對訊息和服務能自動生成python **

進入catkin 工作空間,執行catkin_make:

$ cd ~/catkin_ws

$ catkin_make

啟動發布器

啟動訂閱器

確保roscore 可用,並執行:

$ roscore
catkin specific 如果使用catkin,確保你在呼叫catkin_make 後,在執行你自己的程式前,已經source

了catkin 工作空間下的setup.sh 檔案:

# in your catkin workspace

$ cd ~/catkin_ws

$ source ./devel/setup.bash

$ rosrun beginner_tutorials talker (c++)

$ rosrun beginner_tutorials talker.py (python)

你將看到如下的輸出資訊:

[info]

[walltime: 1314931831.774057]

hello

world 1314931831.77

[info]

[walltime: 1314931832.775497]

hello

world 1314931832.77

[info]

[walltime: 1314931833.778937]

hello

world 1314931833.78

[info]

[walltime: 1314931834.782059]

hello

world 1314931834.78

[info]

[walltime: 1314931835.784853]

hello

world 1314931835.78

[info]

[walltime: 1314931836.788106]

hello

world 1314931836.79

發布器節點已經啟動執行。現在需要乙個訂閱器節點來接受發布的訊息。

我們編寫了乙個名為」listener」的訂閱器節點。現在執行它:

$ rosrun beginner_tutorials listener (c++)

$ rosrun beginner_tutorials listener.py (python)

你將會看到如下的輸出資訊:

[info] [walltime: 1314931970.262246] /listener_17657_1314931968795i heard hello world

1314931970.26

[info] [walltime: 1314931971.266348] /listener_17657_1314931968795i heard hello world

1314931971.26

[info] [walltime: 1314931972.270429] /listener_17657_1314931968795i heard hello world

1314931972.27

[info] [walltime: 1314931973.274382] /listener_17657_1314931968795i heard hello world

1314931973.27

[info] [walltime: 1314931974.277694] /listener_17657_1314931968795i heard hello world

1314931974.28

[info] [walltime: 1314931975.283708] /listener_17657_1314931968795i heard hello world

1314931975.28

ROS教程(十二) 測試訊息發布器和訂閱器

description 本教程將測試上一教程所寫的訊息發布器和訂閱器。tutorial level beginner next tutorial 寫乙個簡單的服務端和客戶端 python c 目錄 啟動發布器 啟動訂閱器 確保roscore可用,並執行 roscore catkin specific...

ROS中自定義訊息的發布和訂閱

因為需要傳輸目標跟蹤的結果,因此需要進行自定義訊息的發布和訂閱。首先,如果我們需要傳輸自定義訊息的話,需要建立一系列的準備檔案。我是直接修改的經典教程中的beginner tutorials中的talker.cpp和listen.cpp檔案,因此,均是在beginner tutorials這個pac...

ROS訊息發布器與接收器(C )注意事項

1 直接在package目錄下的src中建立 talker.cpp和listener.cpp。在qt或者gedit中編輯都可以,不建議新手上來就使用vim編輯程式或者複製貼上!2 在beginner tutorials資料夾下的cmakelists.txt的末尾中新增以下 include direc...