自动驾驶(六十八)---------ROS学习笔记(4)

2024-01-15 07:10

本文主要是介绍自动驾驶(六十八)---------ROS学习笔记(4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      前面我们实现了一个简单的ROS发送节点和接受信息的节点,在自动驾驶中最常遇到的场景是:两个或者几个节点相互通讯,不是单方面的发送信息,这里我们以实现两个整数求和为例,client端节点向server端节点发送a、b的请求,server端节点返回响应sum=a+b给client端节点. 

1. 功能包的创建 

      在catkin_ws/src/目录下新建功能包service_example,并在创建时显式的指明依赖roscpp和std_msgs,依赖std_msgs将作为基本数据类型用于定义我们的服务类型。

$ cd ~/catkin_ws/src/
$ catkin_create_pkg service_example roscpp std_msgs

2. 在功能包中创建自定义服务类型           
       a. 通信过程中服务的数据类型需要用户自己定义,与消息std_msgs不同。数据类型定义文件都是以*.srv为扩展名并且被放在功能包的srv/文件夹下。我们创建 AddTwoInts.srv如下:

int64 a
int64 b
---
int64 sum

       在CMakeLists.txt中找到   :  修改成 :

       b. 除了上面添加的依赖还需要,添加编译依赖message_generation,运行依赖message_runtime。
       在CMakeLists.txt中找到:    修改成 

        找到:     取消注释修改成:   

        generate_messages的作用是自动创建我们自定义的消息类型*.msg与服务类型*.srv相对应的*.h,由于我们定义的服务类型使用了std_msgs中的int64基本类型,所以必须向generate_messages指明该依赖.

        c. 打开功能包中的package.xml文件,填入下面三句依赖:

<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>

         d. 检查ROS是否识别新建的服务类型:我们通过<功能包名/服务类型名>找到该服务,打开命令行终端,输入命令:

$ source ~/catkin_ws/devel/setup.bash
$ rossrv show service_example/AddTwoInts

          看到下面的输出,就说明新建服务类型能被ROS识别,新建服务类型成功了。

3. 源代码编写          
         在service_example/src/目录下新建两个文件server_node.cpp和client_node.cpp:

         首先,介绍server节点server_node.cpp,代码内容如下:

#include "ros/ros.h"
#include "service_example/AddTwoInts.h"//编译时自动生成.h文件//这个函数实现两个int64整数求和的服务,两个int64值从request获取,返回求和结果装入response里。
bool add_execute(service_example::AddTwoInts::Request &req,
service_example::AddTwoInts::Response &res){res.sum = req.a + req.b;ROS_INFO("recieve request: a=%ld,b=%ld",(long int)req.a,(long int)req.b);ROS_INFO("send response: sum=%ld",(long int)res.sum);return true;
}int main(int argc,char **argv){ros::init(argc,argv,"server_node");ros::NodeHandle nh;//创建服务,并将服务加入到ROS网络中,并且这个服务在ROS网络中以名称add_two_ints唯一标识ros::ServiceServer service = nh.advertiseService("add_two_ints",add_execute);ROS_INFO("service is ready!!!");ros::spin();return 0;
}

         介绍client节点client_node.cpp:       

#include "ros/ros.h"
#include "service_example/AddTwoInts.h"
#include <iostream>int main(int argc,char **argv){ros::init(argc,argv,"client_node");ros::NodeHandle nh;ros::ServiceClient client =  nh.serviceClient<service_example::AddTwoInts>("add_two_ints");//创建client对象,用来向ROS网络中名称叫add_two_ints的service发起请求service_example::AddTwoInts srv;//定义了一个service_example::AddTwoInts服务类型的对象,该对象中的成员正是我们在*.srv文件中定义的a、b、sum,我们将待请求的数据填充到数据成员a、b,请求成功后返回结果会被自动填充到数据成员sum中。while(ros::ok())  {long int a_in,b_in;std::cout<<"please input a and b:";std::cin>>a_in>>b_in;srv.request.a = a_in;srv.request.b = b_in;if(client.call(srv)){//这一句便是通过client的方法call来向service发起请求,请求传入的参数srv在上面已经介绍过了。ROS_INFO("sum=%ld",(long int)srv.response.sum);}else{ROS_INFO("failed to call service add_two_ints");}}return 0;
}

4. 编译配置及编译
       在CMakeLists.txt文件的末尾行加入以下几句用于声明可执行文件就可以了:

add_executable(server_node src/server_node.cpp)
target_link_libraries(server_node ${catkin_LIBRARIES})
add_dependencies(server_node service_example_gencpp)add_executable(client_node src/client_node.cpp)
target_link_libraries(client_node ${catkin_LIBRARIES})
add_dependencies(client_node service_example_gencpp)

      add_executable用于声明可执行文件, target_link_libraries用于声明可执行文件创建时需要链接的库, add_dependencies用于声明可执行文件的依赖项,service_example_gencpp的作用是让编译系统自动根据我们的功能包和在功能包下创建的*.srv文件生成的对应的头文件和库文件, 接下来,就可以用下面的命令对功能包进行编译了:

$ cd ~/catkin_ws/
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="service_example"

5. 功能包的启动运行

        $ roscore            //启动ROS节点管理器
        $ cd ~/catkin_ws/         
        $ source devel/setup.bash        //or   $ source devel/setup.zsh
        $rosrun service_example server_node         //激活catkin_ws工作空间           
        看到有输出“servive is ready!!!”,就说明server节点已经正常启动并开始等待client节点向自己发起请求了.
        $ cd ~/catkin_ws/
        $ source devel/setup.bash        //or   $ source devel/setup.zsh
        $ rosrun service_example client_node      //激活catkin_ws工作空间
        看到有输出提示信息“please input a and b:”后,键盘键入两个整数,以空格分割,输入完毕后回车。

                                                 

这篇关于自动驾驶(六十八)---------ROS学习笔记(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/zhouyy858/article/details/104552809
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/608062

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景