古月居 ROS入门21讲 第十五讲 服务数据的定义与使用
Person.srv
string name
uint8 age
uint8 sex
uint8 male=1
uint8 female=2
---
string result
- C++
person_server.cpp
#include<ros/ros.h>
#include "learning_service/Person.h"
bool personCallback(learning_service::Person::Request &req,learning_service::Person::Response &res)
{
ROS_INFO("Person: name:%s, age:%d, sex:%d",req.name.c_str(),req.age,req.sex);
res.result="OK";
return true;
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"person_server");
ros::NodeHandle n;
ros::ServiceServer person_service = n.advertiseService("/show_person",personCallback);
ROS_INFO("Ready to show person.");
ros::spin();
return 0;
}
person_client.cpp
#include<ros/ros.h>
#include "learning_service/Person.h"
int main(int argc,char**argv)
{
ros::init(argc,argv,"person_client");
ros::NodeHandle node;
ros::service::waitForService("/show_person");
ros::ServiceClient person_client=node.serviceClient<learning_service::Person>("/show_person");
learning_service::Person srv;
srv.request.name="Tom";
srv.request.age=20;
srv.request.sex=learning_service::Person::Request::male;
ROS_INFO("Call service to show person");
person_client.call(srv);
ROS_INFO("Show person result:%s",srv.response.result.c_str());
return 0;
}
package.xml中添加
<build_depend>message_generation<ild_depend>
<exec_depend>message_runtime</exec_depend>
CMakelists.txt中作如下内容的修改或添加:
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
turtlesim
message_generation
)
add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
这里直接取消注释并添加message_runtime
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_service
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
# DEPENDS system_lib
)
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)
add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)