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 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)行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值