參考視頻:【奧特學園】ROS機器人入門課程《ROS理論與實踐》零基礎教程_嗶哩嗶哩_bilibili
參考文檔:http://www.autolabor.com.cn/book/ROSTutorials/
話題通信實現模型是比較復雜的,該模型如下圖所示,該模型中涉及到三個角色:
- ROS Master (管理者)
- Talker (發布者)
- Listener (訂閱者)
ROS Master 負責保管 Talker 和 Listener 注冊的信息,並匹配話題相同的 Talker 與 Listener,幫助 Talker 與 Listener 建立連接,連接建立后,Talker 可以發布消息,且發布的消息會被 Listener 訂閱。
需求:
編寫發布訂閱實現,要求發布方以10HZ(每秒10次)的頻率發布文本消息,訂閱方訂閱消息並將消息內容打印輸出。
分析:
在模型實現中,ROS master 不需要實現,而連接的建立也已經被封裝了,需要關注的關鍵點有三個:
- 發布方
- 接收方
- 數據(此處為普通文本)
流程:
- 編寫發布方實現;
- 編寫訂閱方實現;
- 編輯配置文件;
- 編譯並執行。
1.發布方發布消息
#! /usr/bin/env python from os import putenv import rospy from std_msgs.msg import String #發布的消息的類型 ''' 使用 python 實現消息發布: 1.導包 2.初始化 ros 節點; 3.創建發布者對象 4.編寫發布邏輯並發布數據 ''' if __name__ == "__main__": # 2.初始化 ros 節點; rospy.init_node("sanDai") #傳入節點名稱 # 3.創建發布者對象 pub = rospy.Publisher("Car",String,queue_size=10) # 4.編寫發布邏輯並發布數據 #創建數據 msg = String() #使用循環發布數據 while not rospy.is_shutdown(): msg.data = "Hello,I'm sanDai" #發布數據 pub.publish(msg)
增加可執行權限
配置和編譯
執行
- ctrl+shift+B
- roscore
- cd 文件夾
- 編譯source ./devel/setup.bash
- 運行rosrun 包 映射名
- rostopic echo 話題
打印出發布的消息並編號
#! /usr/bin/env python from os import putenv import rospy from std_msgs.msg import String #發布的消息的類型 ''' 使用 python 實現消息發布: 1.導包 2.初始化 ros 節點; 3.創建發布者對象 4.編寫發布邏輯並發布數據 ''' if __name__ == "__main__": # 2.初始化 ros 節點; rospy.init_node("sanDai") #傳入節點名稱 # 3.創建發布者對象 pub = rospy.Publisher("Car",String,queue_size=10) # 4.編寫發布邏輯並發布數據 #創建數據 msg = String() #指定發布頻率 rate = rospy.Rate(1) #設置計數器 count = 0 #使用循環發布數據 while not rospy.is_shutdown(): count += 1 msg.data = "Hello,I'm sanDai " + str(count) #發布數據 pub.publish(msg) rospy.loginfo("f發布的數據:%s",msg.data) rate.sleep()
重新編譯再運行rosrun
2.訂閱者訂閱消息
#! /usr/bin/env python from os import putenv import rospy from std_msgs.msg import String #發布的消息的類型 ''' 使用 python 實現消息發布: 1.導包 2.初始化 ros 節點; 3.創建發布者對象 4.編寫發布邏輯並發布數據 ''' if __name__ == "__main__": # 2.初始化 ros 節點; rospy.init_node("sanDai") #傳入節點名稱 # 3.創建發布者對象 pub = rospy.Publisher("Car",String,queue_size=10) # 4.編寫發布邏輯並發布數據 #創建數據 msg = String() #指定發布頻率 rate = rospy.Rate(1) #設置計數器 count = 0 #休眠以防發布后還未完成注冊數據訂閱不到 rospy.sleep(3) #使用循環發布數據 while not rospy.is_shutdown(): count += 1 msg.data = "Hello,I'm sanDai " + str(count) #發布數據 pub.publish(msg) rospy.loginfo("發布的數據:%s",msg.data) rate.sleep()
配置編譯
執行
- 啟動 roscore;
- 啟動發布節點;
- 啟動訂閱節點。
3.計算圖
命令行:rqt_graph