【ROS 通信】Services 服务通信
【ROS】Service 服务通信
- 前言
- 前置操作
- 创建一个 tutorial 功能包
- 定义服务接口
- 修改 CMakeLists.txt 文件
- 修改 find_package
- 修改 add_service_files
- 修改 generate_messages
- 修改 catkin_package
- find_package 和 catkin_package
- 修改 package.xml 文件
- 构建
- 服务通信的 Python 实现
- 服务端
- 创建服务端节点 add_server.py
- 编写服务端代码
- 添加可执行权限
- 添加 python 脚本安装规则
- 构建并测试
- 客户端
- 创建客户端节点 add_client.py
- 编写客户端代码
- 添加可执行权限
- 添加 python 脚本安装规则
- 构建并测试
前言
ROS 的服务通信采用同步的请求-响应模式。
节点角色:
- 服务端 (Server):提供服务并处理请求。
- 客户端 (Client):发送请求并等待服务端的响应。
工作流程:
- 客户端向服务端发送请求,并在等待服务端处理后接收响应。
适用场景:
- 服务通信适用于需要明确交互和结果的场景,如查询状态、获取配置或执行特定操作等。
本文通过一个简单的例子来讲解服务通信:
客户端向服务端发送两个整数请求,服务端计算这两个数的和并将结果返回给客户端。
前置操作
创建一个 tutorial 功能包
使用以下指令创建 tutorial
包,并包含常见的依赖项:
catkin_create_pkg tutorial roscpp rospy std_srvs std_msgs
定义服务接口
在 tutorial
功能包中创建一个 srv
目录,用于存放自定义的服务消息类型。
例如,创建一个 AddTwoInts.srv
文件,用于定义两个整数相加的服务消息。
在该文件中添加以下内容:
int64 a
int64 b
---
int64 sum
这个服务消息文件定义了两个输入参数:a
和 b
,以及一个输出参数:sum
,表示两个整数相加后的结果。
修改 CMakeLists.txt 文件
修改 find_package
在 find_package
中添加 message_generation
,以便 CMake 在构建时找到这个工具包。
修改后的内容如下:
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsstd_srvsmessage_generation
)
备注:
message_generation
是一个工具包,主要用于自动化处理自定义消息类型(如.msg
、.srv
、.action
文件)。
它可以在 CMake 构建时,根据这些消息文件自动生成对应的 C++ 头文件和 Python 模块。这样,你在编写 C++ 或 Python 代码时,就可以直接#include
或import
这些自动生成的消息文件。
因此,它就像一个代码生成器,自动生成各种编程语言所需的头文件和模块,使得在项目中使用自定义消息和服务更加方便。
修改 add_service_files
-
在
CMakeLists.txt
文件中添加add_service_files
,告知消息生成器需要转换的服务消息文件。
CMake 会根据这些文件自动生成对应的 C++ 头文件和 Python 模块。 -
在
add_service_files
中指定自定义的服务消息类型。
例如,使用AddTwoInts.srv
文件作为服务消息,CMake 会自动生成相关代码。
修改后的代码:
add_service_files(FILESAddTwoInts.srv
)
通过添加此配置,message_generation
将自动根据 AddTwoInts.srv
文件生成相应的 C++ 头文件和 Python 模块。
修改 generate_messages
-
在
CMakeLists.txt
文件中添加generate_messages
函数,调用消息生成器。
CMake 会自动编译.srv
和.msg
文件,并生成 C++ 头文件和 Python 模块。 -
在
generate_messages
中指定依赖项,告诉生成器哪些消息文件需要依赖。
例如,如果使用了std_msgs
中的bool
类型,就需要将std_msgs
添加为依赖项。
修改后的代码:
generate_messages(DEPENDENCIESstd_msgsstd_srvs
)
通常需要添加 std_msgs
和 std_srvs
作为依赖项。如有其他依赖,根据实际情况修改。
修改 catkin_package
在 ROS 中进行服务、话题和动作通信时,需要一个消息翻译器,它能够将节点之间交互的数据转换为 ROS 可识别的格式,即字节流。为了确保在运行时能够使用这个翻译器,我们需要在 catkin_package
中添加对其的依赖。
修改后的代码:
catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs std_srvs message_runtime
)
通过添加 message_runtime
依赖,我们确保在运行时能够正确处理消息翻译,保证节点之间的通信能够顺利进行。
find_package 和 catkin_package
这两行代码虽然看起来相似,但有所不同:
-
find_package
用于指定编译时需要的依赖项。它告诉 CMake 在构建过程中需要哪些外部库或工具包。 -
catkin_package
用于声明当前功能包在导出时所需的依赖项。当其他功能包依赖于当前功能包时,它会自动根据catkin_package
中的声明包含这些依赖项,确保依赖当前功能包的功能包能够正确地使用所需资源。
简而言之,find_package
是编译构建时的依赖声明,而 catkin_package
是用于导出时的依赖声明(声明其他功能包包含当前功能包的时候需要包含的依赖),它确保当其他功能包依赖于当前功能包时,能够自动获取所需的依赖项。
1. find_package
包含 message_generation
,但不直接包含 message_runtime
,是因为:
-
message_generation
在编译时处理消息文件并生成 C++ 头文件和 Python 模块,同时隐式包含了message_runtime
,负责消息翻译。 -
因此,当包含
message_generation
时,message_runtime
会自动得到支持,无需额外声明。
- 在
catkin_package
中不包含message_generation
,是因为:
-
其他功能包会自动依赖已生成的 C++ 头文件和 Python 模块,无需重新使用
message_generation
。 -
但它们仍需依赖
message_runtime
,因为需要在运行时处理消息翻译。因此,必须在catkin_package
中声明message_runtime
。
修改 package.xml 文件
在 package.xml
中,需要添加以下依赖项:
-
构建依赖:
message_generation
(用于构建期间生成消息相关代码)<build_depend>message_generation</build_depend>
-
运行依赖:
message_runtime
(用于运行期间处理消息通信)<exec_depend>message_runtime</exec_depend>
package.xml
相当于功能包的“说明书”,用于声明构建和运行时所需的依赖。它本身不参与构建过程,但构建系统会读取其中的依赖信息,确保功能包可以正常编译和运行。
构建
使用 catkin_make
构建整个工作空间,服务消息生成成功时将输出类似如下信息:
构建成功后,工作空间根目录下的 devel/include
和 devel/lib/pythonX/site-packages
目录中会生成由 message_generation
自动生成的 C++ 头文件和 Python 模块,效果如下图所示:
服务通信的 Python 实现
服务端
创建服务端节点 add_server.py
编写服务端代码
#! /usr/bin/env python2
# -*- coding: utf-8 -*-import rospy # 导入ROS Python库# 从 tutorial 功能包的 srv 服务通信的子模块中,导入AddTwoInts、AddTwoIntsResponse、AddTwoIntsRequest 这三个类
# 该 srv 子模块位于 lby_ws/devel/lib/python2.7/dist-packages/tutorial/srv/_AddTwoInts.py中,是catkin_make构建时,message_generation自动生成的 python 模块
from tutorial.srv import AddTwoInts, AddTwoIntsResponse, AddTwoIntsRequest# 从 tutorial 功能包的 srv 服务通信的子模块中,导入所有类
# from tutorial.srv import *# 服务请求的回调函数
def add_server_callback(req):sum = req.a + req.brospy.loginfo("收到请求: %d + %d = %d" % (req.a, req.b, sum))# 将结果传入类 AddTwoIntsResponse() 中,创造一个服务通信的响应的实例并返回# 返回服务消息的响应的实例,返还给客户端return AddTwoIntsResponse(sum)def add_server():# 初始化ROS节点rospy.init_node('add_server')# 创建服务端# 给 rospy.Service 这个类传入三个参数创建一个 服务端实例server# 参数1:服务端实例s的名称# 参数2:服务消息的类型(.srv文件)# 参数3:服务端接受到请求后调用的回调函数server = rospy.Service('add_server', AddTwoInts, add_server_callback)rospy.loginfo("准备好进行加法运算。")# 保持节点运行rospy.spin()if __name__ == "__main__":try:add_server()except rospy.ROSInterruptException:pass
添加可执行权限
chmod +x ~/lby_ws/src/tutorial/scripts/add_server.py
添加 python 脚本安装规则
在 CMakeLists.txt
中添加以下内容(确保放在 catkin_install_python(PROGRAMS 上):
catkin_install_python(PROGRAMSscripts/add_server.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
构建并测试
# 编译工作空间
cd ~/lby_ws
catkin_make# 启动服务端
rosrun tutorial add_server.py# 测试服务
# rosservice 是 ROS 提供的命令行工具,用于与 ROS 的服务通信进行交互
# call 是 rosservice 的子命令,用于 ”发送请求“ 给某个服务
# /add_two_ints 是服务端的名称
# "a: 10 b: 20" 是给服务端发送的请求的参数
rosservice call /add_server "a: 10 b: 20"
测试结果如下图:
客户端
创建客户端节点 add_client.py
编写客户端代码
#! /usr/bin/env python2
# -*- coding: utf-8 -*-import rospy# 从 tutorial 功能包的 srv 服务通信的子模块中,导入AddTwoInts、AddTwoIntsResponse、AddTwoIntsRequest 这三个类
# 该 srv 子模块位于 lby_ws/devel/lib/python2.7/dist-packages/tutorial/srv/_AddTwoInts.py中,是catkin_make构建时,message_generation自动生成的 python 模块
from tutorial.srv import AddTwoInts, AddTwoIntsResponse, AddTwoIntsRequest# 从 tutorial 功能包的 srv 服务通信的子模块中,导入所有类
# from tutorial.srv import *def add_client():# 初始化ROS节点rospy.init_node('add_client')# 等待服务可用# 参数:等待的服务端的名称(需要与服务端创建服务时使用的名称一致)# 防止服务端还没有创建好,客户端就开始调用服务,导致报错rospy.wait_for_service('add_server')try:# 创建客户端# 给 rospy.ServiceProxy 这个类传入二个参数创建一个 客户端实例client# 参数1:客户端实例client的名称# 参数2:服务消息的类型(.srv文件)client = rospy.ServiceProxy('add_server', AddTwoInts)# 给AddTwoIntsRequest()类 传入a和b的参数,创建请求消息数据的实例req = AddTwoIntsRequest(10, 20)# 发送请求并等待响应# 方式一:直接传递参数# 调用创建的客户端实例client,传入两个参数作为服务消息的请求的参数# 返回值是服务端返回的响应消息的实例 AddTwoIntsResponse# resp1 = client(10, 20)# rospy.loginfo("方式一 - 请求: 10 + 20 = %d" % resp1.sum)# 方式二:使用请求对象# 调用创建的客户端实例client,直接传入req(服务消息的AddTwoIntsRequest请求消息的实例)作为服务消息的请求的参数# 返回值是服务端的中断回调函数最后 return返回的响应消息的实例 AddTwoIntsResponse# 就是return AddTwoIntsResponse(sum)resp2 = client(req)rospy.loginfo("方式二 - 请求: %d + %d = %d" % (req.a, req.b, resp2.sum))except rospy.ServiceException as e:rospy.logerr("服务调用失败: %s" % e)if __name__ == "__main__":try:add_client()except rospy.ROSInterruptException:pass
添加可执行权限
chmod +x ~/lby_ws/src/tutorial/scripts/add_client.py
添加 python 脚本安装规则
在 CMakeLists.txt
中添加以下内容(确保放在 catkin_install_python(PROGRAMS 上):
catkin_install_python(PROGRAMSscripts/add_server.pyscripts/add_client.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
构建并测试
# 编译工作空间
cd ~/lby_ws
catkin_make# 启动服务端
rosrun tutorial add_server.py# 启动客户端
rosrun tutorial add_client.py
测试结果如下图:
相关文章:
【ROS 通信】Services 服务通信
【ROS】Service 服务通信 前言前置操作创建一个 tutorial 功能包定义服务接口修改 CMakeLists.txt 文件修改 find_package修改 add_service_files修改 generate_messages修改 catkin_packagefind_package 和 catkin_package 修改 package.xml 文件构建 服务通信的 Python 实现服…...
25.4.8学习总结
javaFX实现倒计时 核心概念 Timeline: Timeline 是JavaFX动画API的核心类,用于创建动画。它可以按照指定的时间间隔(Duration)触发事件(KeyFrame)。 可以将其视为一个定时器,每隔一段时间执行一些操作。 …...
Android audio(6)-audiopolicyservice介绍
AudioPolicyService 是策略的制定者,比如某种 Stream 类型不同设备的音量(index/DB)是多少、某种 Stream 类型的音频数据流对应什么设备等等。而 AudioFlinger 则是策略的执行者,例如具体如何与音频设备通信,维护现有系…...
【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)
文章目录 前言漏洞代码代码审计攻击步骤修复/开发建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)中,介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识,本文通过分析具体合约代码…...
muduo:运行起来
Muduo 概述 Muduo 是一个用 C 编写的高性能网络库,由陈硕开发,主要用于开发 Linux 环境下的高性能网络应用程序。以下从几个方面对其进行详细介绍: 特点 事件驱动与非阻塞 I/O:Muduo 基于 Reactor 模式实现,使用了 …...
算法篇(八)【递归】
一、了解递归 1. 什么是递归? 递归就是自己调用自己 递归的概念解释起来就短短的几句话,但是写起来总是无从下手 ,但是首先要相信,在学过了数据结构 -- 树 之后 , 其实就已经具备了一定的递归思想,接下来的…...
Linux 学习笔记(4):cd 与 pwd 命令的深度解析与实战应用(期末、期中复习必备)
前言 一、cd 命令:切换工作目录的利器 1.命令来源与基本语法 2.命令使用示例 3.相对路径与绝对路径的使用 二、pwd 命令:清晰定位当前工作目录 1.命令来源与基本语法 2.命令使用示例 三、结语 前言 在 Linux 系统的操作中,对工作目录的…...
眨眼睛查看密码工具类
“眨眼睛查看密码”工具类实现思路: 一、核心功能 实现点击眼睛图标切换密码明文/星号显示,提升表单输入体验。包含以下关键功能: • 初始状态:密码框显示为星号,闭眼图标可见。 • 点击闭眼图标:切换为明…...
【嵌入式系统设计师】知识点:第9章 嵌入式系统安全性基础知识
提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...
find指令中使用正则表达式
linux查找命令能结合正则表达式吗 find命令要使用正则表达式需要结合-regex参数 另,-type参数可以指定查找类型(f为文件,d为文件夹) rootlocalhost:~/regular_expression# ls -alh 总计 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…...
【RH124】第六章 管理本地用户和组
系列文章目录 第一章 红帽企业Linux入门 第二章 访问命令行 第三章 从命令行管理文件 第五章 创建、查看文本文件 第六章 管理本地用户和组 文章目录 系列文章目录前言一、用户和组1、用户2、组 二、获取超级用户访问权限1、root用户2、切换用户账户3、sudo配置 三、管理本地用…...
Linux学习笔记——中断
中断 硬中断和软中断的定义与区别硬中断(Hardware Interrupt)软中断(Software Interrupt) 硬中断与软中断的区别总结上半部和下半部机制详解为什么要分为上半部和下半部?上半部下半部 下半部的三种实现机制Linux中断响…...
Linux 进程间通信:信号机制
Linux 进程间通信:信号机制 在多进程操作系统中,进程之间的通信至关重要,尤其是在Linux系统中,信号(Signal)作为一种特殊的进程间通信方式,广泛用于进程之间的协调和控制。信号可以看作是操作系…...
计算机控制系统:arduino控制无源滤波器播放音乐
1 电脑播放简单音节 播放哆瑞咪发嗦啦西 在音频处理领域,声音合成是通过计算机算法模拟人类声音的一种技术。具体来说,模拟哆瑞咪发嗦啦西音节需要声卡先接收基本音符的信号,然后通过数字信号处理技术,将该信号转换为模拟声音输出…...
FTP协议和win server2022安装ftp
FTP协议简介 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上的计算机之间传输文件的标准网络协议。它被广泛应用于服务器与客户端之间的文件上传、下载以及管理操作。FTP支持多种文件类型和结构,并提供了相对简单的…...
UNet 改进(4):融合Ghost Module的轻量化分割网络
引言 在计算机视觉领域,U-Net因其优秀的性能在图像分割任务中广受欢迎。 随着模型复杂度的增加,计算资源和内存消耗也大幅上升。 本文将介绍一种改进的U-Net架构,通过引入Ghost Module来实现模型的轻量化,同时保持分割性能。 代码概述 这个实现构建了一个基于U-Net架构…...
香港VPS服务器如何优化CPU和内存使用率?
# 香港VPS服务器CPU与内存优化全攻略 在香港VPS服务器上优化CPU和内存使用率是提升性能、降低成本的关键。以下是经过验证的优化策略,涵盖从系统配置到应用层调优的全方位方案。 ## 一、系统级优化 ### 1. 内核参数调优 **调整swappiness值**(减少交…...
简单-快速-高效——模块化解析controlnet网络结构
资源 ControlNet论文:Adding Conditional Control to Text-to-Image Diffusion Models 官方项目:lllyasviel/ControlNet: Let us control diffusion models ControlNet 1.1项目地址:lllyasviel/ControlNet-v1-1-nightly diffusers框架的Co…...
C语言:字符串处理函数strstr分析
在 C 语言中,strstr 函数用于查找一个字符串中是否存在另一个字符串。它的主要功能是搜索指定的子字符串,并返回该子字符串在目标字符串中第一次出现的位置的指针。如果没有找到子字符串,则返回 NULL。 详细说明: 头文件…...
跨境企业应对美国加税:策略突围与破局之道
在全球经济一体化的浪潮中,跨境企业的业务发展与国际关系、贸易政策紧密相连。美国作为全球重要的经济体,其加税行为犹如一场突如其来的风暴,给众多跨境企业的运营带来了巨大冲击与挑战。面对这一严峻形势,跨境企业若想在波涛汹涌…...
Rust 是如何层层防错的
一、Rust 的多层防错机制 🧱 第一层:Rust语言自带的“编译时护盾” —— 错误连运行都跑不起来 错误类型Rust 怎么发现的?工具/机制举个例子✅ 语法缺陷写错了代码格式或语法Rust Analyzer(智能补全)少写了分号、括号…...
一种反激变换器的设计思路(01)
反激式转换器具有低成本且易于构建的优势,常被用作功率较低设备和电器的主要电源。其中固定开关频率(FF)和可变开关频率(QR)是两种基本的操作开关模式。本案例中,输入电压(Vin)为17V…...
Streamlit性能优化:缓存与状态管理实战
目录 📌 核心特性 📌 运行原理 (1)全脚本执行 (2)差异更新 📌 缓存机制 ❓为什么使用缓存? 使用st.cache_data的优化方案 缓存适用场景 使用st.session_state的优化方案 &…...
楼宇自控系统凭何成为建筑稳定、高效、安全运行的关键
在现代建筑领域,随着建筑规模的不断扩大和功能的日益复杂,建筑的稳定、高效、安全运行成为了至关重要的课题。楼宇自控系统犹如建筑的“智慧大脑”,凭借其卓越的功能和技术,在这三个关键方面发挥着不可替代的作用,成为…...
【学习自用】配置文件中的配置项
server.port服务器端口,常被用于指定应用程序运行时所监听的端口号spring.datasource.url用于配置数据源的数据库连接URLspring.datasource.username用于指定连接数据库的用户名spring.datasource.password用于配置数据源时设置数据库连接密码的属性mybatis.mapper-…...
《解码 C/C++ 关键字:科技编程的核心指令集》
序号语言关键字原型实现原理功能返回值类型使用示例注意事项应用场景1Cautoauto 数据类型 变量名;函数调用时在栈上分配内存,函数结束自动释放声明自动变量,变量生命周期限于函数执行期间无c<br>void func() {<br> auto int num 10;<br&…...
Linux 性能调优之CPU调优认知
写在前面 博文内容为《性能之巅 系统、企业与云可观测性(第2版)》CPU 章节课后习题答案整理内容涉及: CPU 术语,指标认知CPU 性能问题分析解决CPU 资源负载特征分析应用程序用户态CPU用量分析理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中…...
《P2660 zzc 种田》
题目背景 可能以后 zzc 就去种田了。 题目描述 田地是一个巨大的矩形,然而 zzc 每次只能种一个正方形,而每种一个正方形时 zzc 所花的体力值是正方形的周长,种过的田不可以再种,zzc 很懒还要节约体力去泡妹子,想花最少的体力值…...
Model Context Protocol(MCP)介绍
“Model Context Protocol(MCP)”是近年来在多模态大模型或可扩展智能系统中出现的一个概念,其主要目标是为大模型提供结构化的上下文管理和动态记忆机制。它解决的是在长时间对话、多轮交互、任务切换等复杂情境中,模型如何理解“…...
解决使用PendingIntent.getBroadcast时出现java.lang.IllegalArgumentException异常的问题
当app为targetSdk31及以上,并且在Android12及以上系统中调用PendingIntent.getBroadcast(context, 0, intent, 0)接口时会抛出异常: java.lang.IllegalArgumentException: com.haier.uhome.uplus.seasia: Targeting S (version 31 and above) requires …...
创建一个简单的HTML游戏站
创建一个简单的HTML游戏站涉及多个步骤,包括规划网站结构、设计用户界面、编写游戏逻辑以及测试和部署。下面是一个详细的步骤指南: 1. 规划网站结构 确定目标受众:了解你的目标用户群体。选择游戏类型:决定你要开发的游戏类型&…...
AIDD-人工智能药物设计-TCMP-12个公开的中药数据库
12个公开的中药数据库 数据库是中药网络药理学研究不可或缺的数据来源之一。目前已经建立了若干中药数据库,提供有关中药的各方面信息,包括疾病、方剂、草药或天然产物、生物活性成分和靶点。这些数据库成为中医药与现代生物医学之间的桥梁,…...
基于大模型的阵发性室上性心动过速风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、阵发性室上性心动过速概述 2.1 定义与分类 2.2 发病机制与流行病学 2.3 临床表现与诊断方法 三、大模型在阵发性室上性心动过速预测中的应用 3.1 大模型技术原理与特点 3.2 模型构…...
基于金字塔视觉变换的类引导网络高分辨率遥感图像高效语义分割
Class-Guidance Network Based on the Pyramid Vision Transformer for Efficient Semantic Segmentation of High-Resolution Remote Sensing Images 摘要 多分类语义分割中类之间的小差异和类内的大变化是全卷积神经网络的“编码器-解码器”结构没有完全解决的问题&#…...
高级:数据库面试题全攻略
一、引言 数据库是软件开发中不可或缺的组件,面试官通过相关问题,考察候选人对数据库核心概念的理解、实际应用能力以及在复杂场景下的问题解决能力。本文将深入解读数据库的索引、事务、锁机制等常见面试问题,结合实际开发场景,…...
如何避免Python爬虫重复抓取相同页面?
在网络爬虫开发过程中,重复抓取相同页面是一个常见但必须解决的问题。重复抓取不仅会浪费网络带宽和计算资源,降低爬虫效率,还可能导致目标网站服务器过载,甚至触发反爬机制。本文将深入探讨Python爬虫中避免重复抓取的多种技术方…...
LeetCode.02.04.分割链表
分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x …...
鸿蒙开发_ARKTS快速入门_语法说明_渲染控制---纯血鸿蒙HarmonyOS5.0工作笔记012
然后我们再来看渲染控制 首先看条件渲染,其实就是根据不同的状态,渲染不同的UI界面 比如下面这个暂停 开启播放的 可以看到就是通过if 这种条件语句 修改状态变量的值 然后我们再来看这个, 下面点击哪个,上面横线就让让他显示哪个 去看一下代码 可以看到,有两个状态变量opt…...
MOP数据库中的EXPLAIN用法
EXPLAIN 是 SQL 中的一个非常有用的工具,主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤,像表的读取顺序、使用的索引情况、数据的访问方式等,这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…...
软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式
本文内容参考: 软考 系统架构设计师系列知识点之设计模式(2)_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢! Abstract Fac…...
告别水下模糊!SU-YOLO:轻量化+尖峰神经网络,用“类脑计算”实现水下目标毫秒级识别
目录 一、摘要 二、引言 三、相关工作 SNN 物体检测 水下物体探测 水下图像去噪 归一化 四、方法 水下尖峰YOLO 尖峰干扰器 SU-Block SpikeSPP 编码器和检测头 分批归一化 五、Coovally AI模型训练与应用平台 六、实验结果 数据集和实施细节 数据集 实施细节…...
Three.js 系列专题 8:实战项目 - 构建一个小型 3D 游戏
内容概述 本专题将通过一个实战项目展示 Three.js 的综合应用。游戏包含迷宫生成、角色移动、相机控制和简单的物理碰撞检测(可选)。这将帮助你将之前学到的知识融会贯通。 学习目标 整合几何体、光照、动画和交互知识。实现基本的游戏逻辑和用户控制。可选:使用 Cannon.j…...
嵌入式笔试(一)
C语言和嵌入式软件 面试题(共10题 时间30分钟) 1. 请写出下面声明的含义。 int(*s[10])(int);定义了一个数组为s包含十个元素,每个元素都是函数指针,函数的参数为一个int类型,返回值也是int类型2. 选择题 设有一台计算机,它有一条加法指令,每次可计算三个数的和。如果要…...
spark 的流量统计案例
创建一个目录为data...
局域网访问 Redis 方法
局域网访问 Redis 方法 默认情况下,Redis 只允许本机 (127.0.0.1) 访问。如果你想让局域网中的其他设备访问 Redis,需要 修改 Redis 配置,并确保 防火墙放行端口。 方法 1:修改 Redis 配置 1. 修改 redis.conf(或 me…...
LeetCode题五:合并两个有序链表
基本思路其实就是:先建立一个空链表,然后将尾节点放在头结点上; 如果第一个链表节点值较小,那么先将list1插入新链表中,然后将尾节点后移;相同的,第二个也需要比较;移动新链表的指针…...
深入探索 `malloc`:内存分配失败的原因及正确使用规范
文章目录 一、malloc 内存分配失败的常见原因1. 内存不足2. 内存越界访问3. 内存碎片化4. 系统限制5. 错误的使用方式 二、如何正确使用 malloc1. 检查返回值2. 释放内存3. 避免内存越界4. 优化内存使用5. 调整系统参数6. 使用高效的内存分配器 三、总结 在 C 语言中࿰…...
处理Excel的python库openpyxl、xlrd、xlwt、panda区别
openpyxl、xlrd、xlwt、pandas 都能处理 Excel 表格,但用途和适合的场景不同。今天做个总结: 库名功能支持格式读写支持样式备注openpyxl全面的.xlsx处理库.xlsx(Excel2007)✅✅✅首选xlrd读取.xls文件的老牌工具.xls(…...
【C++11】特殊类的设计 单例模式 类型转换
目录 一、特殊类的设计: 1、设计一个不能够拷贝的类: 2、设计一个只能在堆上创建的类 3、设计一个只能在栈上创建的类 4、设计一个不能被继承的类: 二、单例模式: 设计一个只能创建一个对象的类: 饿汉模式&…...
基于vue框架的助农特色农产品销售系统i7957(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,商品分类,农产品信息,特价商品,爱心捐赠 开题报告内容 基于Vue框架的助农特色农产品销售系统开题报告 一、研究背景与意义 (一)研究背景 随着乡村振兴战略的深入实施,特色农产品作为农村经济的重要组成部…...