【ROS】 ubuntu16.04下vs code实现ros下服务编程的实现
一、工作空间的创建
二、client端程序编写及运行效果
三、server端程序编写及运行效果
一、工作空间的创建
本章节主要内容是以编写海龟的客户端(client)请求程序和服务端(server)程序为主,使用的IDE是vs code,关于ubuntu系统下vs code的安装可以参考我的另一篇博客,链接如下
https://www.guyuehome.com/34213

新建文件夹catkin_turtle_server,并在文件夹下新建src文件夹,这里可以不进行工作空间的初始化,并用vs code打开catkin_turtle_server文件,按住Ctrl+Tab+~键,在vs code打开终端,在/fjy/catkin_turtle路径下进行编译,并添加环境变量

cd ~/fjy/catkin_turtle_server //转到catkin_turtle路径下
catkin_make //编译
source devel/setup.bash //设置环境变量

在这里插入图片描述

按住Fn+F1,在搜索栏中输入C/C++编辑配置,点击C/C++编辑配置,会在左边目录产生一个.vscode文件夹,单击该文件夹下的c_cpp_properties.json文件,并添加路径,按Ctrl+s保存,路径如下

“/opt/ros/kinetic/include” //使头文件包含合理

在这里插入图片描述

在这里插入图片描述

二、client端程序编写及运行效果
在/catkin_turtle_server/src路径下创建功能包turtle_server,博主这边通过终端命令行进行创建

catkin_create_pkg turtle_server roscpp std_msgs geometry_msgs turtlesim

然后在/catkin_turtle_server/src/turtle_server/src路径下创建turtle_spawn.cpp文件

touch turtle_spwan.cpp
并单击打开该c++文件进行程序的编写,程序如下

//包含ros相关的API头文件
#include <ros/ros.h>
//包含turtlesim这个库里的Spawn消息这个头文件
#include <turtlesim/Spawn.h>
int main(int argc, char** argv)
{
    // 创建一个节点,初始化ROS节点
	ros::init(argc, argv, "turtle_spawn");
    // 创建节点句柄,用于管理节点的资源
	ros::NodeHandle node;
    // 发现/spawn服务后,创建一个服务客户端add_turtle,消息类型是turtlesim::Spawn,连接名为/spawn的service
	ros::service::waitForService("/spawn");//阻塞型函数,等待服务
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
    // 初始化turtlesim::Spawn的请求数据
	turtlesim::Spawn srv;
	srv.request.x = 2.0;
	srv.request.y = 2.0;
	srv.request.name = "turtle2";
    // 请求服务调用
	ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", 
			 srv.request.x, srv.request.y, srv.request.name.c_str());
	add_turtle.call(srv); //阻塞型函数,等待有服务
	// 显示服务调用结果
	ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());
	return 0;
};

然后编辑功能包turtle_server下的CMakeLsits.txt文件和package.xml文件,package.xml文件一般在创建功能包时默认设置好了,不需要修改,只需要在CMakeLists.txt文件下添加以下两行代码即可

add_executable(turtle_spwan src/turtle_spwan.cpp) //生成可执行文件
target_link_libraries(tuetle_spwan ${catkin_LIBRARIES}) //连接库

完成这些后,回到/catkin_turtle_server路径下,进行编译

在这里插入图片描述

编译完成后就可以运行节点试验一下,打开一个终端启动roscore,再重新打开一个终端,运行命令rosrun turtlesim turtlesim_node,来打开海龟仿真器,然后在vs vode终端下输入命令rosrun turtle_server turtle_spwan,即可查看运行效果

在这里插入图片描述

三、server端程序编写及运行效果
在/catkin_turtle_server/src/turtle_server/src路径下创建turtle_command.cpp文件

touch turtle_comamnd.cpp

并单击打开该c++文件进行程序的编写,程序如下

//包含ros相关的API头文件
#include <ros/ros.h>
//包含geometry_msgs这个库里的Twist消息这个头文件
#include <geometry_msgs/Twist.h>
//包含std_srvs这个库里的Trigger消息这个头文件
#include <std_srvs/Trigger.h>
//定义一个全局发布者
ros::Publisher turtle_vel_pub;
//定义一个布尔值
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, "turtle_command_server");
    // 创建节点句柄,用于管理节点的信息
    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
	turtle_vel_pub = 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;
			turtle_vel_pub.publish(vel_msg);
		}
		//按照循环频率延时
	    loop_rate.sleep();
	}
    return 0;
}

然后编辑功能包turtle_server下的CMakeLsits.txt文件额package.xml文件,package.xml文件一般在创建功能包时默认设置好了,不需要修改,只需要在CMakeLists.txt文件下添加以下两行代码即可

add_executable(turtle_command src/turtle_command.cpp) //生成可执行文件
target_link_libraries(turtle_command ${catkin_LIBRARIES}) //连接库

完成这些后,回到/fjy//catkin_turtle_server路径下,进行编译

在这里插入图片描述

编译完成后就可以运行节点试验一下,打开一个终端启动roscore,再打开一个终端运行rosrun turtlesim turtlesim_node,来打开海龟仿真器,然后我们新建一个终端,在/fjy/catkin_turtle_server路径下,先设置环境变量,再运行rosrun turtle_server turtle_command,最后,在vs code终端下,输入命令rosservice call /turtle_command “{}”,即可查看运行效果

source devel/setup.bash //新建一个终端,如果需要运行节点的话,一定要设置环境变量

在这里插入图片描述

更改turtle_command代码中的turtle1,将其更改为turtle2,可以使得client端创建的第二个小海龟运动,效果如下

在这里插入图片描述

这样,我们就完成了vs code下对ros服务器client和server的编程了