日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二、话题通信原理,代码实现

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二、话题通信原理,代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1、通信原理
    • 0、talker注冊
    • 1、listener注冊
    • 2、ROS Master實現信息匹配
    • 3、Listener向Talker發送連接請求
    • 4、Talker確認請求
    • 5、建立連接
    • 6、Talker向Listener發送信息
  • 2、代碼實現
    • 1、C++版
    • 2、Python版

1、通信原理


整個通信過程分為六步,0-4步采用RPC協議,5-6步采用TCP協議。此外,第一步和第二步不分先后,但由于talker注冊需要花費時間,可能導致訂閱者無法接收到前幾條消息,可通過設置延遲進行解決。

0、talker注冊

talker通過RPC協議向master注冊節點信息:

  • 話題名:bar
  • RPC地址:1234

1、listener注冊

listener通過RPC協議向master注冊自身信息:

  • 需要訂閱的話題名:bar

2、ROS Master實現信息匹配

ROS Master根據注冊表進行信息匹配,并通過RPC協議向listener發送talker的RPC地址

3、Listener向Talker發送連接請求

listener根據master提供的RPC地址,向talker發送連接請求:

  • 訂閱的話題名稱
  • 消息類型
  • 通信協議(TCP/UDP)

4、Talker確認請求

talker接收到連接請求連接后,通過RPC協議向listener確認連接:

  • TCP地址

5、建立連接

listener根據第四不的TCP地址建立連接,此時,如果ROS Master關閉,二者仍然可以建立連接

6、Talker向Listener發送信息

2、代碼實現

1、C++版

  • 創建工作空間并編譯 mkdir -p workspace/src //創建工作空間cd workspace //進入工作空間catkin_make //編譯,生成devel和build文件夾
  • 創建ROS包并添加依賴cd src catkin_creat_pkg 功能包名 roscpp rospy std_msgs
  • C++源碼實現//1.包含頭文件 #include "ros/ros.h" #include "std_msgs/String.h"//用于定義傳遞信息類型 #include <sstream>int main(int argc, char *argv[]){setlocale(LC_ALL,"");//防止亂碼//2.節點初始化//前兩個參數用來傳遞信息,后面哪個為節點名稱,在rqt_graph標識唯一ros::init(argc,argv,"talker");//3.創建節點句柄ros::NodeHandle nh;//4.創建發布對象//第一個參數為發布的話題,第二個參數為最大保存的消息數,超出時,最早進入的消息會被刪除ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//5.組織被發布的數據std_msgs::String msg;//創建要發布的數據std::string msg_front = "hello 您好!";int count = 0;ros::Rate r(1);//設置數據發布速率while(ros::ok()){std::stringstream ss;ss << msg_front << count;msg.data = ss.str();pub.publish(msg);//發布消息ROS_INFO("發送的消息:%s",msg.data.c_str());r.sleep();count++;ros::spinOnce();}return 0; } //1.包含頭文件 #include "ros/ros.h" #include "std_msgs/String.h"void doMsg(const std_msgs::String::ConstPtr&msg_p){ROS_INFO("我聽見:%s",msg_p->data.c_str()); }int main(int argc, char *argv[]){setlocale(LC_ALL,"");//2.初始化節點ros::init(argc,argv,"listener");//3.創建ROS句柄ros::NodeHandle nh;//4.實例化訂閱對象,包括話題名稱,消息長度,回調函數ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);//5.處理訂閱的消息//6.設置循環調用回調函數ros::spin();return 0; }
  • 配置文件并編譯add_executable(Hello_pub src/Hello_pub.cpp ) add_executable(Hello_sub src/Hello_sub.cpp )target_link_libraries(Hello_pub ${catkin_LIBRARIES} ) target_link_libraries(Hello_sub ${catkin_LIBRARIES} )
  • 編譯并運行cd 工作空間 catkin_make roscore cd 工作空間 source ./devel/setup.bash rosrun 包名 節點名
  • 2、Python版

  • 創建sripts文件夾
  • 代碼實現#! /usr/bin/env python#1.導包 import rospy from std_msgs.msg import String #定義數據類型的包if __name__ == "__main__":#2.初始化ROS節點rospy.init_node("talker_p")#節點名稱唯一,否則會報錯#3.實例化發布者對象pub = rospy.Publisher("chatter_p",String,queue_size=10)#4.組織發布數據msg = String()msg_font = "hello python"count = 0#設置循環頻率rate = rospy.Rate(10)while not rospy.is_shutdown():msg.data = msg_font + str(count)pub.publish(msg)rate.sleep()rospy.loginfo("data:%s",msg.data)count += 1 #! /usr/bin/env python#1.導包import rospyfrom std_msgs.msg import Stringdef doMsg(msg):rospy.loginfo("我聽見:%s",msg.data)if __name__ == "__main__":#2.初始化ROS節點rospy.init_node("listener_p")#3.實例化訂閱者sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)#4.處理訂閱的消息#5.設置循環調用回調函數rospy.spin()
  • 配置Cmakelists.txt文件catkin_install_python(PROGRAMS scripts/talker_p.py scripts/listener_p.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
  • 運行代碼cd 工作空間 catkin_make roscore source devel/setup.bash rosrun 包名 .py
  • 總結

    以上是生活随笔為你收集整理的二、话题通信原理,代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。