使用Clion进行ROS开发(二) service roscpp实战

Clion的部分详细操作可以看小弟的第一篇文章https://blog.csdn.net/EliGold/article/details/100122095

本文是以柴长坤老师的《机器人操作系统》6.4节进行编程。也参考了这篇文章https://blog.csdn.net/EliminatedAcmer/article/details/80628121

1.Greeting.srv的编写与对应的头文件生成

在service_try目录下创建srv文件夹,在该文件夹内创建Greeting.srv。

Greeting.srv内容如下

string name
int32 age
---
string feedback

保存后,更改CMakeLists.txt和package.xml文件

CMakeLists.txt修改内容

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)


add_service_files(
   FILES
  Greeting.srv
 )

generate_messages(
   DEPENDENCIES
   std_msgs
)

package.xml修改内容

  <build_depend>message_generation</build_depend>

  <exec_depend>message_runtime</exec_depend>

修改完毕后就catkin_make操作下,生成的头文件会出现在ros_ws/devel/include/service_try内。

这次主要会用到Greeting.h

2.server.cpp和client.cpp的创建与编译

老办法,创建了这两个cpp文件后,在CMakeLists.txt进行如下修改操作:

include_directories(
# include
  ${catkin_INCLUDE_DIRS}
  "~/code/ros_ws/devel/include"
)

add_executable(server src/server.cpp)
add_dependencies(server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(server
        ${catkin_LIBRARIES})

add_executable(client src/client.cpp)
add_dependencies(client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(client
        ${catkin_LIBRARIES})

然后就开始编写这两个cpp程序了

server.cpp

#include <ros/ros.h>
#include <service_try/Greeting.h>

bool handle_function(service_try::GreetingRequest &req, service_try::Greeting::Response &res)
{
    //显示请求信息
    ROS_INFO("Request from %s with age %d", req.name.c_str(),req.age);
    //处理请求,结果写入response
    res.feedback="Hi "+req.name+"! I am server!";
    //返回true,正确处理请求
    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc,argv,"greetings_server");//解析参数,命名节点
    ros::NodeHandle nh;                     //创建句柄,实例化node
    ros::ServiceServer service =nh.advertiseService("greetings", handle_function);//写明服务的处理函数
    ros::spin();
    return 0;
}

client.cpp

#include <ros/ros.h>
#include <service_try/Greeting.h>

int main(int argc, char **argv)
{
    ros::init(argc,argv,"greetings_clint");//初始化,节点命名为“greetings_client”
    ros::NodeHandle nh;
    ros::ServiceClient client=nh.serviceClient<service_try::Greeting>("greetings");
    //定义service客户端,service名字为“greetings”,service 的类型为Service_try
    //实例化srv,设置其request消息的内容,这里request包括两个变量,name和age,见Greeting.srv
    service_try::Greeting srv;
    srv.request.name="HAN";
    srv.request.age=20;

    if(client.call(srv))
    {
        //注意我们的response部分中的内容只包含一个变量response,另,注意将其转化为字符串
        ROS_INFO("Response from server: %s",srv.response.feedback.c_str());
    }
    else
    {
        ROS_ERROR("Fail to call service Service_try");
        return 1;
    }
    return 0;
}

分别编译后,在新建terminal输入roscore。然后就能进行service操作了。

client显示的信息

server显示的信息

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值