1.使用自定义srv
1) 在功能包下新建文件夹srv,
在srv文件夹下新建Add.srv文件,
在Add.srv 文件写入:
int32 num1
int32 num2
-------
int32 sum
ps:其中-------是必须要有的
2)修改功能包下的package.xml 和 CMakeLists.txt文件
package.xml 修改如下:(两处)
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!--
exce_depend 以前对应的是 run_depend 现在非法
-->
CMakeLists.txt文件修改如下:(四处)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(
FILES
AddInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
然后,catkin_make(Ctrl + shift +B),编译
在目录下查看自定义srv的C++和python路径
c_cpp_properties.json修改如下:
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
settings.json修改如下:
{
"python.autoComplete.extraPaths": [
"/opt/ros/noetic/lib/python3/dist-packages",
]
}
知道了路径,就可以在C++和python的头文件包含这个路径
2. 服务方和客户方的文件编写
2.1 C++服务方编写
#include "ros/ros.h"
#include "service_com/Add.h"
bool doReq(service_com::Add::Request& req,service_com::Add::Response& resp)
{
int num1 =req.num1;
int num2 =req.num2;
ROS_INFO("接受到数据为%d %d",num1,num2);
resp.sum = num1+ num2;
return true;
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"server_c");
ros::NodeHandle nh;
ros::ServiceServer server = nh.advertiseService("Ad",doReq);
ROS_INFO("begin");
ros::spin();
return 0;
}
2.2 C++客户方编写
#include "ros/ros.h"
#include "service_com/Add.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
if(argc != 3)
{
ROS_INFO("输入两个整数");
return 1;
}
ros::init(argc,argv,"client_c");
ros::NodeHandle nh;
ros::ServiceClient client =nh.serviceClient<service_com::Add>("Ad");
ros::service::waitForService("Ad");
service_com::Add ai;
ai.request.num1 = atoi(argv[1]);
ai.request.num2 = atoi(argv[2]);
bool flag =client.call(ai);
if(flag)
{
ROS_INFO("sum = %d",ai.response.sum);
}
else{
ROS_INFO("error");
return 1;
}
return 0;
}
2.3 Python服务方编写
#! /usr/bin/env python
import rospy
from service_com.srv import Add,AddRequest,AddResponse
def doReq(req):
sum = req.num1 +req.num2
rospy.loginfo("接受数据为%d %d sum=%d",req.num1,req.num2,sum)
resp =AddResponse(sum)
return resp
if __name__ == "__main__":
rospy.init_node("server_p")
server = rospy.Service("Add",Add,doReq)
rospy.loginfo("begin____")
rospy.spin()
2.4 Python客户方编写
#! /usr/bin/env python
import rospy
import sys
from service_com.srv import Add,AddRequest,AddResponse
if __name__ == "__main__":
if len(sys.argv) != 3 :
rospy.logerr("error")
sys.exit(1)
rospy.init_node("client_p")
client = rospy.ServiceProxy("Add",Add)
rospy.wait_for_service("Add")
req =AddRequest()
req.num1 = int(sys.argv[1])
req.num2 = int(sys.argv[2])
resp=client.call(req)
rospy.loginfo("sum = %d",resp.sum)
3.执行
在CMakeLists.txt 添加执行依赖
C++ 136)149)行
Python 162)行