ros(7)service server编程实现

创建代码

turtle_command_server.cpp

/**
 * 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#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;
}

修改cmake

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

编译

catkin_make

运行

roscore

rosrun turtlesim turtlesmi_node

rosrun service_example turtle_command_server

rosservice call /turtle_command tab键

 

posted @ 2021-12-04 15:19  健丽  阅读(101)  评论(0编辑  收藏  举报