栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【ROS入门篇·四】ROS通讯架构-Service

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【ROS入门篇·四】ROS通讯架构-Service

快速链接:【ROS入门篇】ROS学习简介

一、ROS中Service通讯机制

Serivice: 通信是双向的,一种同步通信机制;

二、Client节点示例
  • C++实现(古月居案例)

#include 
#include 

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

    // 创建ROS节点句柄
    ros::NodeHandle n_;

    // 发现/spawn服务后,创建一个客户端,连接/spawn服务
    ros::service::waitForService("/spawn");
    ros::ServiceClient add_turtle = n_.serviceClient("spawn");

    // 初始化turtlesim::Spawn的请求数据
    turtlesim::Spawn srv;
    srv.request.x=2.0;
    srv.request.y=2.0;
    srv.request.name="turtle2";

    // 请求/spawn服务
    ROS_INFO("Call service to spawn turtle [x: %0.6f, y: %0.6f, name: %s]", srv.request.x, srv.request.y, srv.request.name);
    add_turtle.call(srv);

    // 显示服务调用结果
    ROS_INFO("Spawn turtle successfully [name: %s]", srv.request.name);

    return 0;
}
三、Server节点示例
  • C++实现(古月居案例)

#include 
#include 
#include 

ros::Publisher turtle_vel_pub_;
bool pubcommand = false;

// service回调函数
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, "server_demo_node");

    // 创建ROS节点句柄
    ros::NodeHandle n_;

    // 注册一个server, 执行/turtle_command服务,回调函数commandCallback
    ros::ServiceServer command_service = n_.advertiseService("/turtle_command", commandCallback);

    // 创建一个publisher, 发布话题/turtle1/comd_vel, 消息类型为geometry_msgs::Twist, 队列长度10
    turtle_vel_pub_ = n_.advertise("/turtle1/comd_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.linear.z=0.2;
            turtle_vel_pub_.publish(vel_msg);
        }
        
        // 按照循环频率执行
        loop_rate.sleep();
    }
    return 0;
}
  • ros:spin(): 循环等待回调函数,如果仅仅等待topic, 用这个;
  • ros::spinOnce(): 调用一此回调函数,如果有额外重复工作,就用这个.
四、自定义服务数据Srv
  • 生成.srv文件,放在srv文件夹内
     
string name
uint8 sex
uint8 age
     
uint8 unknow=0
uint8 male=1
uint8 female=2
---
string result

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号