ROS服务端和客户端编写

ROS服务端编写

#include "ros/ros.h"
#include "demo_serv_client/AddInts.h"

bool srv_func(demo_serv_client::AddInts::Request &request,
              demo_serv_client::AddInts::Response &response) {
    int num1 = request.num1;
    int num2 = request.num2;
    int sum = num1 + num2;
    response.sum = sum;
    ROS_INFO("收到的请求数据: num1 = %d,num2 = %d",num1,num2);
    ROS_INFO("求和结果: sum = %d",sum);

    return true;
}

int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "");
    ROS_INFO("服务器端已启动");
    ros::init(argc, argv, "srv_demo");
    ros::NodeHandle nh;
    ros::ServiceServer srv = nh.advertiseService("AddInts", srv_func);
    ros::spin();
}

ROS客户端编写

#include "ros/ros.h"
#include "demo_serv_client/AddInts.h"

int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "");
    ROS_INFO("客户端节点已经启动");
    ros::init(argc, argv,"demo_client");
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<demo_serv_client::AddInts>("AddInts");
    demo_serv_client::AddInts ai;
    ai.request.num1 = 100;
    ai.request.num2 = 200;
    // 两个数值已经被写死
    bool flag = client.call(ai);
    if (flag) {
        ROS_INFO("响应成功!");
        ROS_INFO("响应结果 = %d",ai.response.sum);
    }
    else {
        ROS_INFO("处理失败");
    }

    ros::spin();
}

数据未写死

#include "ros/ros.h"
#include "demo_serv_client/AddInts.h"

int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "");
    ROS_INFO("客户端节点已经启动");
    ros::init(argc, argv, "demo_client");
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<demo_serv_client::AddInts>("AddInts");
    demo_serv_client::AddInts ai;
    std::cout<<"请输入num1和num2,用空格隔开"<<std::endl;
    std::cin >> ai.request.num1 >> ai.request.num2;
    bool flag = client.call(ai);
    if (flag) {
        ROS_INFO("响应成功!");
        ROS_INFO("响应结果 = %d", ai.response.sum);
    } else {
        ROS_INFO("处理失败");
    }

    ros::spin();
}
#include "ros/ros.h"
#include "demo_serv_client/AddInts.h"

int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "");
    if (argc != 3) {
        ROS_INFO("提交的参数错误");
        return 1;
    }
    ROS_INFO("客户端节点已经启动");
    ros::init(argc, argv, "demo_client");
    ros::NodeHandle nh;
    ros::ServiceClient client = nh.serviceClient<demo_serv_client::AddInts>("AddInts");
    demo_serv_client::AddInts ai;
    //std::cout << "请输入num1和num2,用空格隔开" << std::endl;
    //std::cin >> ai.request.num1 >> ai.request.num2;
    ai.request.num1 = atoi(argv[1]);
    ai.request.num2 = atoi(argv[2]);
    //等待服务器挂起方式1
    client.waitForExistence();
	//等待服务器挂起方式2
	ros::service::waitForService("服务的话题")
    bool flag = client.call(ai);
    if (flag) {
        ROS_INFO("响应成功!");
        ROS_INFO("响应结果 = %d", ai.response.sum);
    } else {
        ROS_INFO("处理失败");
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用ROS实现服务器客户端通信程序的实验总结: 1. 实验目的 通过本次实验,学生应该掌握ROS的基本概念和使用方法,了解ROS中的节点、话题、服务等概念,能够使用ROS编写简单的服务器客户端通信程序。 2. 实验环境 本实验使用的ROS版本为ROS Kinetic,操作系统为Ubuntu 16.04。 3. 实验步骤 (1)创建ROS工作空间 在终端中执行以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd .. catkin_make source devel/setup.bash ``` (2)创建ROS包和节点 在终端中执行以下命令: ``` cd ~/catkin_ws/src catkin_create_pkg my_ros_pkg rospy cd my_ros_pkg mkdir scripts cd scripts touch my_ros_node.py chmod +x my_ros_node.py ``` 在my_ros_node.py文件中编写节点代码,代码如下: ``` #!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo("Received message: %s", data.data) def my_ros_node(): rospy.init_node('my_ros_node', anonymous=True) rospy.Subscriber("my_topic", String, callback) rospy.spin() if __name__ == '__main__': try: my_ros_node() except rospy.ROSInterruptException: pass ``` (3)创建ROS服务 在my_ros_pkg包中创建srv文件夹,并在其中创建一个名为MyService.srv的服务文件,文件内容如下: ``` string request --- string response ``` (4)编写服务端代码 在scripts文件夹中编写my_ros_server.py文件,文件内容如下: ``` #!/usr/bin/env python import rospy from my_ros_pkg.srv import MyService def handle_request(req): rospy.loginfo("Received request: %s", req.request) response = "Hello, " + req.request return response def my_ros_server(): rospy.init_node('my_ros_server', anonymous=True) rospy.Service('my_service', MyService, handle_request) rospy.loginfo("Ready to handle requests.") rospy.spin() if __name__ == '__main__': my_ros_server() ``` (5)编写客户端代码 在scripts文件夹中编写my_ros_client.py文件,文件内容如下: ``` #!/usr/bin/env python import rospy from my_ros_pkg.srv import MyService def my_ros_client(): rospy.wait_for_service('my_service') try: my_service = rospy.ServiceProxy('my_service', MyService) request = raw_input("Enter your name: ") response = my_service(request) rospy.loginfo("Received response: %s", response.response) except rospy.ServiceException as e: rospy.logerr("Service call failed: %s", e) if __name__ == '__main__': rospy.init_node('my_ros_client', anonymous=True) my_ros_client() ``` (6)运行程序 在终端中执行以下命令: ``` cd ~/catkin_ws catkin_make source devel/setup.bash roscore ``` 在新的终端中执行以下命令: ``` cd ~/catkin_ws source devel/setup.bash rosrun my_ros_pkg my_ros_node.py ``` 在新的终端中执行以下命令: ``` cd ~/catkin_ws source devel/setup.bash rosrun my_ros_pkg my_ros_server.py ``` 在新的终端中执行以下命令: ``` cd ~/catkin_ws source devel/setup.bash rosrun my_ros_pkg my_ros_client.py ``` 在客户端终端中输入您的名字,服务端会返回“Hello, 您的名字”。 4. 实验心得 本次实验通过使用ROS编写简单的服务器客户端通信程序,让我更深入了解了ROS的基本概念和使用方法,掌握了ROS中的节点、话题、服务等概念,并且学会了如何使用ROS编写服务器客户端通信程序。同时,在实验过程中,我也学会了如何使用ROS的一些常用命令和工具,如catkin_make、roscd、rosrun等,这些命令和工具对于ROS开发非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LZZ and MYY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值