前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

《ROS入门》第9讲:(服务端Server的编程实现)

qiguaw 2024-11-19 09:09:17 资源文章 26 ℃ 0 评论

如何实现一个服务器

  • ? 初始化ROS节点;
  • ? 创建Server实例;
  • ? 循环等待服务请求,进入回调函数;
  • ? 在回调函数中完成服务功能的处理,并反馈应答数据。

备注:客户端/服务端也是ROS中的一种重要的通信方式,简化模型:

客户端:请求服务(request) <------> 服务端:接收到请求,然后返回一个应答信号(response响应)

如何配置CMakeLists.txt中的编译规则

  • ? 设置需要编译的代码和生成的可执行文件;
  • ? 设置链接库;

具体实现

第一步,在learning_service/src目录下创建doubixiaohanhan.cpp文件,并编写相应代码:

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<std_srvs/Trigger.h>

ros::Publisher doubixiaohanhan;
bool pubCommand = false;
// service回调函数,输入参数req,输出参数res
bool commandCallback(std_srvs::Trigger::Request  &req,
         			std_srvs::Trigger::Response &res)
{
	pubCommand = !pubCommand;

    // 显示请求数据
    ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");

	// 设置反馈数据
	res.success = true;
	res.message = "Change turtle command state!";

    return true;
}

int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "doubixiaohanhan");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个名为/turtle_command的server,注册回调函数commandCallback
    ros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    doubixiaohanhan  = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

    // 循环等待回调函数
    ROS_INFO("Ready to receive turtle command.");

	// 设置循环的频率
	ros::Rate loop_rate(10);

	while(ros::ok())
	{
		// 查看一次回调函数队列
    	ros::spinOnce();

		// 如果标志为true,则发布速度指令
		if(pubCommand)
		{
			geometry_msgs::Twist vel_msg;
			vel_msg.linear.x = 0.5;
			vel_msg.angular.z = 0.2;
			doubixiaohanhan.publish(vel_msg);
		}

		//按照循环频率延时
	    loop_rate.sleep();
	}

    return 0;
}

部分函数解释:

spinOnce()函数原型:

Process a single round of callbacks.

This method is useful if you have your own loop running and would like to process any callbacks that are available. This is equivalent to calling callAvailable() on the global CallbackQueue. It will not process any callbacks that have been assigned to custom queues.

第二步,在learning_service/目录下的CMakeLists.txt文件里添加相应代码:

add_executable(doubixiaohanhan      src/doubixiaohanhandoubixiaohanhan.cpp)
target_link_libraries(doubixiaohanhan    ${catkin_LIBRARIES})

第三步,编译

  • (1) cd ~/catkin_ws
  • (2) catkin_make

第四步,测试

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_command_server
$ rosservice call /turtle_command "{}"

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表