2022-06-07 ROS通信机制 服务通信 自定义srv 并发布 C++ 篇

1、首先自定义 srv 文件

与自定义 msg 文件类似,在工作目录下创建 srv 目录
在目录下创建 xxx.srv 文件
例: 创建 addints.srv 文件

编写代码

其中首先编写客户端发送的数据类型
以 --- 作分割符,区分客户端和服务端处理的数据类型
编写服务端处理发送的数据

#客户端发送的数据
int32 num1
int32 num2
---
#服务端发送的数据
int32 sum

修改package.xml文件

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

修改CMakeLists.txt文件

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

# Generate services in the 'srv' folder
add_service_files(
  FILES
  addints.srv
)

# Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

ctrl+shift+B编译,在工作空间下 devel 文件夹中可发现生成的中间文件 addints.h 头文件等.

复制该地址,打开 c_cpp_properties.json 文件进行添加 Path:

"/xxx/工作空间/devel/include/**"#根据自己的目录自行填写

服务端C++文件编写

#include "ros/ros.h"
#include "server_client/addints.h"
bool doADD(server_client::addintsRequest& req,server_client::addintsResponse& resp)
{
    int num1 = req.num1;
    int num2 = req.num2;
    ROS_INFO("接收到的数据为%d,%d",num1,num2);

    if(num1<0||num2<0)                                      //判断输入数据是否合法
    {
        ROS_ERROR("请输入两个整数");
        return false;

    }
    else{
        int sum = num1+num2;
        resp.sum = sum;
        ROS_INFO("处理的结果为:%d",sum);
        return true;
    }
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc ,argv,"server");
    ros::NodeHandle nh;
    ros::ServiceServer server = nh.advertiseService("addints",doADD);
    ROS_INFO("启动成功");
    ros::spin();                                                      //因为需要处理多次,所以此处需要spin返回
    return 0;
}

客户端C++文件编写

#include "ros/ros.h"
#include "server_client/addints.h"
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    if(argc != 3)
    {
        ROS_ERROR("请输入三个整数");
        return 1;
    }
    ros::init(argc,argv,"client");
    
    ros::NodeHandle nh;

    ros::ServiceClient client = nh.serviceClient<server_client::addints>("addints");

    ros::service::waitForService("addints");               //通过此函数可以保证服务端启动后再发送数据

    server_client::addints ai;                                      //组织信息传送到服务端
    ai.request.num1 = atoi(argv[1]);
    ai.request.num2 = atoi(argv[2]);

    bool flag = client.call(ai);                                     //判断数据是否已经发送成功

    if(flag)
    {
        ROS_INFO("数据处理成功,结果为:%d",ai.response.sum);
    }
    else{
        ROS_ERROR("数据处理失败");
        return 1;
    }

    return 0;
}

编辑CMakeLists.txt文件

add_executable(server_c src/server.cpp)
add_executable(client_c src/client.cpp)

## Add cmake target dependencies of the executable
## same as for the library above
add_dependencies(server_c ${PROJECT_NAME}_gencpp)
add_dependencies(client_c ${PROJECT_NAME}_gencpp)


# Specify libraries to link a library or executable target against
target_link_libraries(server_c
  ${catkin_LIBRARIES}
)
target_link_libraries(client_c
  ${catkin_LIBRARIES}
)

Ctrl+Shift+B编译通过后在工作空间打开终端

roscore启动ros核心

rosrun 功能包 服务端映射名

rosrun 功能包 客户端映射名 num1 num2

Screenshot from 2022-06-07 18-35-59.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容