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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

ROS系统 实现客户端Client和服务端Server

發(fā)布時間:2025/5/22 windows 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS系统 实现客户端Client和服务端Server 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

服務(wù)編程流程:

  • 創(chuàng)建服務(wù)器
  • 創(chuàng)建客戶端
  • 添加編譯選項
  • 運行可執(zhí)行程序

實現(xiàn)客戶端Clien

創(chuàng)建功能包

cd ~/catkin_ws/src catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim

如何實現(xiàn)一個客戶端

  • 初始化ROS節(jié)點
  • 創(chuàng)建一個Client實例
  • 發(fā)布服務(wù)請求數(shù)據(jù)
  • 等待Server處理之后的應(yīng)答結(jié)果

在剛創(chuàng)建的 learning_service 目錄中的src文件夾下創(chuàng)建一個 cpp文件

cd ~/catkin_ws/src/learning_service/src touch turtle_spawn.cpp

在 turtle_spawn.cpp 文件中寫入以下代碼。
下面代碼實現(xiàn)功能:請求/spawn服務(wù),服務(wù)數(shù)據(jù)類型turtlesim::Spawn

#include <ros/ros.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節(jié)點ros::init(argc, argv, "turtle_spawn");// 創(chuàng)建節(jié)點句柄ros::NodeHandle node;// 發(fā)現(xiàn)/spawn服務(wù)后,創(chuàng)建一個服務(wù)客戶端,連接名為/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 初始化turtlesim::Spawn的請求數(shù)據(jù)turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";// 請求服務(wù)調(diào)用ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", srv.request.x, srv.request.y, srv.request.name.c_str());add_turtle.call(srv);// 顯示服務(wù)調(diào)用結(jié)果ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());return 0; };

在CMakeLists.txt中添加以下代碼:

add_executable(turtle_spawn src/turtle_spawn.cpp) target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

編譯項目

cd ~/catkin_ws catkin_make

設(shè)置環(huán)境變量,讓系統(tǒng)能夠找到該工作空間

source devel/setup.bash

啟動ROS Master

roscore

啟動小海龜仿真器

rosrun turtlesim turtlesim_node

啟動自定義的海龜控制節(jié)點,會在客戶端中生成一個新的小海龜。

rosrun learning_service turtle_spawn


用Python創(chuàng)建客戶端步驟:

cd ~/catkin_ws/src/learning_service

創(chuàng)建 scripts 文件夾

mkdir scripts cd scripts

創(chuàng)建 turtle_spawn.py Python文件

touch turtle_spawn.py

用Python創(chuàng)建客戶端代碼:
下面代碼實現(xiàn)功能: 請求/spawn服務(wù),服務(wù)數(shù)據(jù)類型turtlesim::Spawn

import sys import rospy from turtlesim.srv import Spawndef turtle_spawn():# ROS節(jié)點初始化rospy.init_node('turtle_spawn')# 發(fā)現(xiàn)/spawn服務(wù)后,創(chuàng)建一個服務(wù)客戶端,連接名為/spawn的servicerospy.wait_for_service('/spawn')try:add_turtle = rospy.ServiceProxy('/spawn', Spawn)# 請求服務(wù)調(diào)用,輸入請求數(shù)據(jù)response = add_turtle(2.0, 2.0, 0.0, "turtle2")return response.nameexcept rospy.ServiceException, e:print "Service call failed: %s"%eif __name__ == "__main__":#服務(wù)調(diào)用并顯示調(diào)用結(jié)果print "Spwan turtle successfully [name:%s]" %(turtle_spawn())

Python代碼不需要重新編譯,可以直接執(zhí)行。

rosrun learning_service turtle_spawn.py

實現(xiàn)服務(wù)端Server

如何實現(xiàn)一個服務(wù)器

  • 初始化ROS節(jié)點
  • 創(chuàng)建Server實例
  • 循環(huán)等待服務(wù)請求,進(jìn)入回調(diào)函數(shù)
  • 在回調(diào)函數(shù)中完成服務(wù)功能的處理,并反饋應(yīng)答數(shù)據(jù)。

在創(chuàng)建的 learning_service 目錄中的src文件夾下創(chuàng)建一個 turtle_command_server.cpp文件

cd ~/catkin_ws/src/learning_service/src touch turtle_command_server.cpp

在 turtle_command_server.cpp 文件中寫入以下代碼。
下面代碼實現(xiàn)功能:執(zhí)行/turtle_command服務(wù),服務(wù)數(shù)據(jù)類型std_srvs/Trigger

#include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <std_srvs/Trigger.h>ros::Publisher turtle_vel_pub; bool pubCommand = false;// service回調(diào)函數(shù),輸入?yún)?shù)req,輸出參數(shù)res bool commandCallback(std_srvs::Trigger::Request &req,std_srvs::Trigger::Response &res) {pubCommand = !pubCommand;// 顯示請求數(shù)據(jù)ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");// 設(shè)置反饋數(shù)據(jù)res.success = true;res.message = "Change turtle command state!";return true; }int main(int argc, char **argv) {// ROS節(jié)點初始化ros::init(argc, argv, "turtle_command_server");// 創(chuàng)建節(jié)點句柄ros::NodeHandle n;// 創(chuàng)建一個名為/turtle_command的server,注冊回調(diào)函數(shù)commandCallbackros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);// 創(chuàng)建一個Publisher,發(fā)布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度10turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 循環(huán)等待回調(diào)函數(shù)ROS_INFO("Ready to receive turtle command.");// 設(shè)置循環(huán)的頻率ros::Rate loop_rate(10);while(ros::ok()){// 查看一次回調(diào)函數(shù)隊列ros::spinOnce();// 如果標(biāo)志為true,則發(fā)布速度指令if(pubCommand){geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;turtle_vel_pub.publish(vel_msg);}//按照循環(huán)頻率延時loop_rate.sleep();}return 0; }

注:
可以通過以下指令 顯示服務(wù)類型的所有信息

rossrv show 頭文件名

例如:

rossrv show std_srvs/Trigger

在CMakeLists.txt中添加以下代碼:

add_executable(turtle_command_server src/turtle_command_server.cpp) target_link_libraries(turtle_command_server ${catkin_LIBRARIES})


編譯項目

cd ~/catkin_ws catkin_make

設(shè)置環(huán)境變量,讓系統(tǒng)能夠找到該工作空間

source devel/setup.bash

啟動ROS Master

roscore

啟動小海龜仿真器

rosrun turtlesim turtlesim_node

啟動自定義的海龜控制節(jié)點,會在客戶端中生成一個新的小海龜。

rosrun learning_service turtle_command_server

以下指令相當(dāng)于海龜?shù)拈_關(guān),發(fā)送一次,海龜就會啟動,再次發(fā)送時,就會讓海龜停止運動。

rosservice call /turtle_command "{}"



用Python創(chuàng)建服務(wù)端步驟:

cd ~/catkin_ws/src/learning_service

創(chuàng)建 scripts 文件夾

mkdir scripts cd scripts

創(chuàng)建 turtle_command_server.py Python文件

touch turtle_command_server.py

用Python創(chuàng)建客戶端代碼:
下面代碼實現(xiàn)功能: 執(zhí)行/turtle_command服務(wù),服務(wù)數(shù)據(jù)類型std_srvs/Trigger

import rospy import thread,time from geometry_msgs.msg import Twist from std_srvs.srv import Trigger, TriggerResponsepubCommand = False; turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)def command_thread(): while True:if pubCommand:vel_msg = Twist()vel_msg.linear.x = 0.5vel_msg.angular.z = 0.2turtle_vel_pub.publish(vel_msg)time.sleep(0.1)def commandCallback(req):global pubCommandpubCommand = bool(1-pubCommand)# 顯示請求數(shù)據(jù)rospy.loginfo("Publish turtle velocity command![%d]", pubCommand)# 反饋數(shù)據(jù)return TriggerResponse(1, "Change turtle command state!")def turtle_command_server():# ROS節(jié)點初始化rospy.init_node('turtle_command_server')# 創(chuàng)建一個名為/turtle_command的server,注冊回調(diào)函數(shù)commandCallbacks = rospy.Service('/turtle_command', Trigger, commandCallback)# 循環(huán)等待回調(diào)函數(shù)print "Ready to receive turtle command."thread.start_new_thread(command_thread, ())rospy.spin()if __name__ == "__main__":turtle_command_server()

啟動ROS Master

roscore

啟動小海龜仿真器

rosrun turtlesim turtlesim_node

Python代碼不需要重新編譯,可以直接執(zhí)行。

rosrun learning_service turtle_command_server.py

以下指令相當(dāng)于海龜?shù)拈_關(guān),發(fā)送一次,海龜就會啟動,再次發(fā)送時,就會讓海龜停止運動。

rosservice call /turtle_command "{}"

總結(jié)

以上是生活随笔為你收集整理的ROS系统 实现客户端Client和服务端Server的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。