服務編程流程:
實現客戶端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
::init(argc
, argv
, "turtle_spawn");ros
::NodeHandle node
;ros
::service
::waitForService("/spawn");ros
::ServiceClient add_turtle
= node
.serviceClient
<turtlesim
::Spawn
>("/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 Spawn
def turtle_spawn():rospy
.init_node
('turtle_spawn')rospy
.wait_for_service
('/spawn')try:add_turtle
= rospy
.ServiceProxy
('/spawn', Spawn
)response
= add_turtle
(2.0, 2.0, 0.0, "turtle2")return response
.name
except rospy
.ServiceException
, e
:print "Service call failed: %s"%e
if __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;
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
::init(argc
, argv
, "turtle_command_server");ros
::NodeHandle n
;ros
::ServiceServer command_service
= n
.advertiseService("/turtle_command", commandCallback
);turtle_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();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():rospy
.init_node
('turtle_command_server')s
= 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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。