日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

服務編程流程:

  • 創建服務器
  • 創建客戶端
  • 添加編譯選項
  • 運行可執行程序

實現客戶端Clien

創建功能包

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

如何實現一個客戶端

  • 初始化ROS節點
  • 創建一個Client實例
  • 發布服務請求數據
  • 等待Server處理之后的應答結果

在剛創建的 learning_service 目錄中的src文件夾下創建一個 cpp文件

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

在 turtle_spawn.cpp 文件中寫入以下代碼。
下面代碼實現功能:請求/spawn服務,服務數據類型turtlesim::Spawn

#include <ros/ros.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節點ros::init(argc, argv, "turtle_spawn");// 創建節點句柄ros::NodeHandle node;// 發現/spawn服務后,創建一個服務客戶端,連接名為/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 初始化turtlesim::Spawn的請求數據turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";// 請求服務調用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);// 顯示服務調用結果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

設置環境變量,讓系統能夠找到該工作空間

source devel/setup.bash

啟動ROS Master

roscore

啟動小海龜仿真器

rosrun turtlesim turtlesim_node

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

rosrun learning_service turtle_spawn


用Python創建客戶端步驟:

cd ~/catkin_ws/src/learning_service

創建 scripts 文件夾

mkdir scripts cd scripts

創建 turtle_spawn.py Python文件

touch turtle_spawn.py

用Python創建客戶端代碼:
下面代碼實現功能: 請求/spawn服務,服務數據類型turtlesim::Spawn

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

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

rosrun learning_service turtle_spawn.py

實現服務端Server

如何實現一個服務器

  • 初始化ROS節點
  • 創建Server實例
  • 循環等待服務請求,進入回調函數
  • 在回調函數中完成服務功能的處理,并反饋應答數據。

在創建的 learning_service 目錄中的src文件夾下創建一個 turtle_command_server.cpp文件

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

在 turtle_command_server.cpp 文件中寫入以下代碼。
下面代碼實現功能:執行/turtle_command服務,服務數據類型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回調函數,輸入參數req,輸出參數res bool commandCallback(std_srvs::Trigger::Request &req,std_srvs::Trigger::Response &res) {pubCommand = !pubCommand;// 顯示請求數據ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");// 設置反饋數據res.success = true;res.message = "Change turtle command state!";return true; }int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "turtle_command_server");// 創建節點句柄ros::NodeHandle n;// 創建一個名為/turtle_command的server,注冊回調函數commandCallbackros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);// 創建一個Publisher,發布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度10turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 循環等待回調函數ROS_INFO("Ready to receive turtle command.");// 設置循環的頻率ros::Rate loop_rate(10);while(ros::ok()){// 查看一次回調函數隊列ros::spinOnce();// 如果標志為true,則發布速度指令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);}//按照循環頻率延時loop_rate.sleep();}return 0; }

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

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

設置環境變量,讓系統能夠找到該工作空間

source devel/setup.bash

啟動ROS Master

roscore

啟動小海龜仿真器

rosrun turtlesim turtlesim_node

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

rosrun learning_service turtle_command_server

以下指令相當于海龜的開關,發送一次,海龜就會啟動,再次發送時,就會讓海龜停止運動。

rosservice call /turtle_command "{}"



用Python創建服務端步驟:

cd ~/catkin_ws/src/learning_service

創建 scripts 文件夾

mkdir scripts cd scripts

創建 turtle_command_server.py Python文件

touch turtle_command_server.py

用Python創建客戶端代碼:
下面代碼實現功能: 執行/turtle_command服務,服務數據類型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)# 顯示請求數據rospy.loginfo("Publish turtle velocity command![%d]", pubCommand)# 反饋數據return TriggerResponse(1, "Change turtle command state!")def turtle_command_server():# ROS節點初始化rospy.init_node('turtle_command_server')# 創建一個名為/turtle_command的server,注冊回調函數commandCallbacks = rospy.Service('/turtle_command', Trigger, commandCallback)# 循環等待回調函數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代碼不需要重新編譯,可以直接執行。

rosrun learning_service turtle_command_server.py

以下指令相當于海龜的開關,發送一次,海龜就會啟動,再次發送時,就會讓海龜停止運動。

rosservice call /turtle_command "{}"

總結

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

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