• 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键

  • 相关阅读:
    为什么需要多重继承?它的优缺点是什么?
    delete
    链表环状检测主要有三种方法
    常见和链表相关的算法
    二分查找算法
    找出两个字符串中最长的相同子字符串
    链表创建打印删除
    python项目
    hadoop博客 oschina
    用shell写个100以内的所有数字之和
  • 原文地址:https://www.cnblogs.com/gjianli/p/15642122.html
Copyright © 2020-2023  润新知