生活随笔
收集整理的這篇文章主要介紹了
                                
二、话题通信原理,代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            
文章目錄
- 1、通信原理
- 0、talker注冊
- 1、listener注冊
- 2、ROS Master實現信息匹配
- 3、Listener向Talker發送連接請求
- 4、Talker確認請求
- 5、建立連接
- 6、Talker向Listener發送信息
 
- 2、代碼實現
1、通信原理
 
 整個通信過程分為六步,0-4步采用RPC協議,5-6步采用TCP協議。此外,第一步和第二步不分先后,但由于talker注冊需要花費時間,可能導致訂閱者無法接收到前幾條消息,可通過設置延遲進行解決。
 
0、talker注冊
 
talker通過RPC協議向master注冊節點信息:
 
 
1、listener注冊
 
listener通過RPC協議向master注冊自身信息:
 
 
2、ROS Master實現信息匹配
 
ROS Master根據注冊表進行信息匹配,并通過RPC協議向listener發送talker的RPC地址
 
3、Listener向Talker發送連接請求
 
listener根據master提供的RPC地址,向talker發送連接請求:
 
 
4、Talker確認請求
 
talker接收到連接請求連接后,通過RPC協議向listener確認連接:
 
 
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++源碼實現
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>int main(int argc, char *argv[]){setlocale(LC_ALL,"");ros::init(argc,argv,"talker");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);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;
}
 
#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,"");ros::init(argc,argv,"listener");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);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文件夾代碼實現
import rospy
from std_msgs.msg import String if __name__ == "__main__":rospy.init_node("talker_p")pub = rospy.Publisher("chatter_p",String,queue_size=10)msg = String()msg_font = "hello python"count = 0rate = 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
  import rospyfrom std_msgs.msg import Stringdef doMsg(msg):rospy.loginfo("我聽見:%s",msg.data)if __name__ == "__main__":rospy.init_node("listener_p")sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)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
 
                            總結
                            
                                以上是生活随笔為你收集整理的二、话题通信原理,代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。