自动驾驶(六十八)---------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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/608062

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件