7. 服务通信 ---- 使用自定义srv,服务方和客户方cpp,python文件编写
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 COMPONENTSroscpprospystd_msgsmessage_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(FILESAddInts.srv
)
generate_messages(DEPENDENCIESstd_msgs
)
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listenerCATKIN_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.num2rospy.loginfo("接受数据为%d %d sum=%d",req.num1,req.num2,sum)resp =AddResponse(sum)return respif __name__ == "__main__":rospy.init_node("server_p")server = rospy.Service("Add",Add,doReq)rospy.loginfo("begin____")rospy.spin()
2.4 Python客户方编写
#! /usr/bin/env pythonimport rospy
import sys
from service_com.srv import Add,AddRequest,AddResponseif __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)行