当前位置: 首页 > news >正文

亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫

背景知识

激光雷达的数据格式参见:

亚博microros小车-原生ubuntu支持系列:13 激光雷达避障-CSDN博客

本节体验雷达跟踪跟守卫

PID控制

从百度百科摘一段介绍

比例积分微分控制(proportional-integral-derivative control),简称PID控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,仍有90%左右的控制回路具有PID结构。

PID控制器各校正环节的作用如下:

比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,控制器立即产生控制作用以减小误差。当偏差e=0时,控制作用也为0。因此,比例控制是基于偏差进行调节的,即有差调节。

积分环节:能对误差进行记忆,主要用于消除静差,提高系统的无差度,积分作用的强弱取决于积分时间常数Ti,Ti越大,积分作用越弱,反之则越强。

微分环节:能反映偏差信号的变化趋势(变化速率),并能在偏差信号值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。

从时间的角度讲,比例作用是针对系统当前误差进行控制,积分作用则针对系统误差的历史,而微分作用则反映了系统误差的变化趋势,这三者的组合是“过去、现在、未来”的完美结合

 对应的代码实现,common.py

#!/usr/bin/env python
# coding:utf-8
#import rospy
import rclpy
from geometry_msgs.msg import Twist
from std_msgs.msg import Boolclass SinglePID:def __init__(self, P=0.1, I=0.0, D=0.1):self.Kp = Pself.Ki = Iself.Kd = Dprint("init_pid: ", P, I, D)self.pid_reset()def Set_pid(self, P, I, D):self.Kp = Pself.Ki = Iself.Kd = Dprint("set_pid: ", P, I, D)self.pid_reset()def pid_compute(self, target, current):self.error = target - current#计算误差self.intergral += self.error#计算积分self.derivative = self.error - self.prevError#计算微分result = self.Kp * self.error + self.Ki * self.intergral + self.Kd * self.derivative#PID输出self.prevError = self.errorreturn resultdef pid_reset(self):self.error = 0self.intergral = 0self.derivative = 0self.prevError = 0

雷达跟踪

小车连接上代理,运行程序,小车上的雷达扫描设定范围内的最近的一个物体,并且根据设定的跟踪距离,调试自身的速度,与该物体保持一定的距离。通过动态参数调节器可以调整雷达检测的范围和避障检测的距离等参数。

src/yahboomcar_laser/yahboomcar_laser/目录下新建文件laser_Tracker.py,代码如下:

#ros lib
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan
import os
import sys
#commom lib
import math
import numpy as np
import time
from time import sleep
from yahboomcar_laser.common import *
print ("improt done")
RAD2DEG = 180 / math.piclass laserTracker(Node):def __init__(self,name):super().__init__(name)#create a subself.sub_laser = self.create_subscription(LaserScan,"/scan",self.registerScan,1)self.sub_JoyState = self.create_subscription(Bool,'/JoyState', self.JoyStateCallback,1)#create a pubself.pub_vel = self.create_publisher(Twist,'/cmd_vel',1)#declareparam 声明参数self.declare_parameter("priorityAngle",10.0)#优先检测雷达角度self.priorityAngle = self.get_parameter('priorityAngle').get_parameter_value().double_valueself.declare_parameter("LaserAngle",15.0)self.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_valueself.declare_parameter("ResponseDist",0.55)self.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_valueself.declare_parameter("Switch",False)self.Switch = self.get_parameter('Switch').get_parameter_value().bool_valueself.Right_warning = 0self.Left_warning = 0self.front_warning = 0self.Joy_active = Falseself.ros_ctrl = SinglePID()self.Moving = Falseself.lin_pid = SinglePID(2.0, 0.0, 2.0)self.ang_pid = SinglePID(3.0, 0.0, 5.0)self.timer = self.create_timer(0.01,self.on_timer)def on_timer(self):self.Switch = self.get_parameter('Switch').get_parameter_value().bool_valueself.priorityAngle = self.get_parameter('priorityAngle').get_parameter_value().double_valueself.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_valueself.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_valuedef JoyStateCallback(self, msg):if not isinstance(msg, Bool): returnself.Joy_active = msg.datadef exit_pro(self):cmd1 = "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist "cmd2 = '''"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"'''cmd = cmd1 +cmd2os.system(cmd)#雷达回调def registerScan(self, scan_data):if not isinstance(scan_data, LaserScan): returnranges = np.array(scan_data.ranges)offset = 0.5frontDistList = []frontDistIDList = []minDistList = []minDistIDList = []for i in range(len(ranges)):angle = (scan_data.angle_min + scan_data.angle_increment * i) * RAD2DEGif angle > 180: angle = angle - 360if abs(angle) < self.priorityAngle:if 0 < ranges[i] < (self.ResponseDist + offset):frontDistIDList.append(angle)frontDistList.append(ranges[i])elif abs(angle) < self.LaserAngle and ranges[i] > 0:minDistList.append(ranges[i])minDistIDList.append(angle)if len(frontDistIDList) != 0: #找到最近的一个物体minDistID            minDist = min(frontDistList)minDistID = frontDistIDList[frontDistList.index(minDist)]else:minDist = min(minDistList)minDistID = minDistIDList[minDistList.index(minDist)]if self.Joy_active or self.Switch == True: #手柄或者开关打开,则停止移动if self.Moving == True:self.pub_vel.publish(Twist())self.Moving = not self.Movingreturnself.Moving = Truevelocity = Twist()print("minDist: ",minDist)#根据需要跟踪的物体,计算角速度和线速度,然后发布速度数据if abs(minDist - self.ResponseDist) < 0.1: minDist = self.ResponseDistvelocity.linear.x = -self.lin_pid.pid_compute(self.ResponseDist, minDist)ang_pid_compute = self.ang_pid.pid_compute(minDistID/48, 0)if minDistID > 0: velocity.angular.z = ang_pid_computeelse: velocity.angular.z = ang_pid_computevelocity.angular.z = ang_pid_computeif abs(ang_pid_compute) < 0.1: velocity.angular.z = 0.0self.pub_vel.publish(velocity)def main():rclpy.init()laser_tracker = laserTracker("laser_Tracker")print ("start it")try:rclpy.spin(laser_tracker)except KeyboardInterrupt:passfinally:laser_tracker.exit_pro()laser_tracker.destroy_node()rclpy.shutdown()

构建后运行

bohu@bohu-TM1701:~/yahboomcar/yahboomcar_ws$ ros2 run yahboomcar_laser laser_Tracker 
improt done
init_pid:  0.1 0.0 0.1
init_pid:  2.0 0.0 2.0
init_pid:  3.0 0.0 5.0
start it
minDist:  2.104
minDist:  2.1
minDist:  2.092
minDist:  2.092
minDist:  2.033
minDist:  1.955
minDist:  1.857
minDist:  1.76
minDist:  1.662
minDist:  1.662
minDist:  1.567
minDist:  1.461
minDist:  1.369
minDist:  1.273
minDist:  1.273
minDist:  1.078
minDist:  1.078
minDist:  0.975
minDist:  0.881
minDist:  0.881
minDist:  0.802
minDist:  0.718
minDist:  0.654
minDist:  0.615
minDist:  0.601
minDist:  0.601
minDist:  0.603

程序启动后,会寻找雷达扫描范围内最近的物体,并且与它保持设定的距离。缓慢移动被跟踪的物体,小车会跟踪物体移动。可以通过动态参数调节器去设置一些参数,终端输入,

ros2 run rqt_reconfigure rqt_reconfigure

以上参数说明:

  • priorityAngle:雷达优先检测的角度

  • LaserAngle:雷达检测角度

  • ResponseDist:跟踪的距离

  • Switch:玩法开关

要是小车没反应。关机重启下,跟踪移动要缓慢些,快了丢失了。

雷达守卫

小车连接上代理,运行程序,小车上的雷达扫描设定范围内的最近的一个物体,并且会通过自转跟踪该物体,如果该物体靠近雷达小于设定的距离,则小车上的蜂鸣器会响以示警告。通过动态参数调节器可以调整雷达检测的范围和避障检测的距离等参数。

在目录下src/yahboomcar_laser/yahboomcar_laser/新建文件laser_Warning.py,代码如下:

#ros lib
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan
from std_msgs.msg import Bool,UInt16
#commom lib
import os
import sys
import math
import numpy as np
import time
from time import sleep
from yahboomcar_laser.common import *
print ("improt done")
RAD2DEG = 180 / math.piclass laserWarning(Node):def __init__(self,name):super().__init__(name)#create a subself.sub_laser = self.create_subscription(LaserScan,"/scan",self.registerScan,1)self.sub_JoyState = self.create_subscription(Bool,'/JoyState', self.JoyStateCallback,1)self.sub_JoyState = self.create_subscription(Bool,'/JoyState', self.JoyStateCallback,1)#create a pubself.pub_vel = self.create_publisher(Twist,'/cmd_vel',1)#控制小车self.pub_Buzzer = self.create_publisher(UInt16,'/beep',1)#蜂鸣器#declareparamself.declare_parameter("LaserAngle",10.0)self.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_valueself.declare_parameter("ResponseDist",0.3)self.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_valueself.declare_parameter("Switch",False)self.Switch = self.get_parameter('Switch').get_parameter_value().bool_valueself.Right_warning = 0self.Left_warning = 0self.front_warning = 0self.Joy_active = Falseself.ros_ctrl = SinglePID()self.ang_pid = SinglePID(3.0, 0.0, 5.0)self.Buzzer_state = Falseself.Moving = Falseself.timer = self.create_timer(0.01,self.on_timer)def on_timer(self):self.Switch = self.get_parameter('Switch').get_parameter_value().bool_valueself.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_valueself.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_valuedef JoyStateCallback(self, msg):if not isinstance(msg, Bool): returnself.Joy_active = msg.datadef exit_pro(self):cmd1 = "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist "cmd2 = '''"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"'''cmd = cmd1 +cmd2os.system(cmd)cmd3 = "ros2 topic pub --once /beep std_msgs/msg/UInt16 "cmd4 = '''"data: 0"'''cmd = cmd1 +cmd2os.system(cmd)#雷达回调函数def registerScan(self, scan_data):if not isinstance(scan_data, LaserScan): returnif self.Joy_active  or self.Switch == True:if self.Moving == True:print("stop")self.pub_vel.publish(Twist())self.Moving = not self.Movingreturnself.Moving = Trueranges = np.array(scan_data.ranges)minDistList = []minDistIDList = []for i in range(len(ranges)):angle = (scan_data.angle_min + scan_data.angle_increment * i) * RAD2DEGif angle > 180: angle = angle - 360#查找雷达检索范围内最近的物体if  abs(angle) < self.LaserAngle and ranges[i] > 0:minDistList.append(ranges[i])minDistIDList.append(angle)if len(minDistList) != 0:minDist = min(minDistList)minDistID = minDistIDList[minDistList.index(minDist)]velocity = Twist()#根据与跟踪物体的位置偏差,计算角速度,使得小车车头对准该物体angle_pid_compute = self.ang_pid.pid_compute(minDistID/48, 0)if abs(angle_pid_compute) < 0.1:velocity.angular.z = 0.0else:velocity.angular.z = angle_pid_computeself.pub_vel.publish(velocity)print("minDist: ",minDist)print("minDistID: ",minDistID)#判断最小物体的雷达检测的距离是否小于设定的范围,随后做出判断是否需要让蜂鸣器响if minDist <= self.ResponseDist:print("---------------")b = UInt16()b.data = 1self.pub_Buzzer.publish(b)else:print("no obstacles@")b = UInt16()b.data = 0self.pub_Buzzer.publish(UInt16())def main():rclpy.init()laser_warn = laserWarning("laser_Warnning")print ("start it")try:rclpy.spin(laser_warn)except KeyboardInterrupt:passfinally:laser_warn.exit_pro()laser_warn.destroy_node()rclpy.shutdown()

 构建后运行:

ros2 run yahboomcar_laser laser_Warning        #雷达警卫

日志如下:

no obstacles@
minDist:  0.352
minDistID:  9.999993519233985
no obstacles@
minDist:  0.317
minDistID:  9.999993519233985
no obstacles@
minDist:  0.289
minDistID:  9.999993519233985
---------------
minDist:  0.289
minDistID:  9.999993519233985
---------------
minDist:  0.281
minDistID:  9.999993519233985
---------------
minDist:  0.279
minDistID:  9.999993519233985
---------------
minDist:  0.278
minDistID:  7.999993534726719
---------------

程序启动后,会寻找雷达扫描范围内最近的物体,缓慢移动该物体,小车会通过自转去跟踪该物体。快了也会丢失,太小了识别不佳,我找了个鞋盒子测试。

如上所示,没有超过设定范围则打印【no obstacles@】,出现了障碍物则会打印【---------------】并且蜂鸣器会响。可以通过动态参数调节器去设置一些参数,终端输入,

ros2 run rqt_reconfigure rqt_reconfigure

以上参数说明:

  • LaserAngle:雷达检测角度

  • ResponseDist:跟踪的距离

  • Switch:玩法开关

最后看一下节点通信图

以上。

相关文章:

亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫

背景知识 激光雷达的数据格式参见&#xff1a; 亚博microros小车-原生ubuntu支持系列&#xff1a;13 激光雷达避障-CSDN博客 本节体验雷达跟踪跟守卫 PID控制 从百度百科摘一段介绍 比例积分微分控制&#xff08;proportional-integral-derivative control&#xff09;&am…...

c++迷宫问题(migong)

今天的题目叫“迷宫问题(migong&#xff09;”&#xff0c;是“DFS深度优先搜索 递归”一类的。 题目描述 设有一个N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放0和1&#xff0c;0表示可通&#xff0c;1表示不能&#xff0c;入…...

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…...

Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

大会官网&#xff1a;www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包&#xff0c;提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件&#xff0c;包括其作用、使用方法以及示例代码&#xff0c;帮助你快速掌握 Swing 的核心知识。 一…...

深圳大学-智能网络与计算-实验三:网络容量优化分析实验

实验目的与要求 了解什么是凸优化问题&#xff1b;学会使用 Matlab CVX 工具箱解决最优功率分配问题&#xff0c;使得信道容量最大化&#xff1b;了解注水算法&#xff1b; 方法&#xff0c;步骤 深入理解最优功率分配问题。使用 CVX 找出最优的功率分配。使用凸优化数学分析…...

嵌入式基础 -- PCIe 控制器中断管理之MSI与MSI-X简介

PCIe 控制器中断管理技术文档 1. 背景 在现代计算机系统中&#xff0c;中断是设备与 CPU 通信的重要机制&#xff0c;PCIe 控制器提供了从传统线中断到基于消息的中断&#xff08;MSI/MSI-X&#xff09;的演进&#xff0c;以提升中断处理效率和可扩展性。x86 和 ARM 架构虽然…...

Android-okhttp详解

目录 一&#xff0c;介绍 二&#xff0c;简单使用 三&#xff0c;流程分析 四&#xff0c;分发器 五&#xff0c;拦截器 5.1 重试及重定向拦截器 5.1.1 重试 5.1.2 重定向 5.2 桥接拦截器 5.3 缓存拦截器 5.4 连接拦截器 5.5 请求服务器拦截器 一&#xff0c;介绍 OkHttp是当下…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

数字图像处理:实验七

uu们&#xff01;这是我们目前数字图像系列的最后一张&#xff0c;之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中&#xff0c;所以还请大家给咸鱼哥点时间&#xff0c;同时也提前预祝大家2025年新春快乐&#xff01;&#xff08;咸鱼哥真诚的祝愿每一个人&#xf…...

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…...

QWindow类使用介绍与代码演示

深入浅出C++ Qt开发技术专栏 https://blog.csdn.net/yao_hou/category_9276099.html?spm=1001.2014.3001.5482 文章目录 QWindow主要功能和特性常用的函数示例代码适用场景QWindow父类QSurface`QSurface` 类概述主要功能和特性常用的函数相关的子类示例代码`QSurface` 的实际应…...

OpenCV图像显示imshow()函数——详解

OpenCV图像显示imshow()函数——详解 本文目录&#xff1a; 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法&#xff08;1&#xff09; 解决办法&#xff08;2&#xff09; 总结 三、imshow()图像显…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…...

【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证

引言 前面已经对BQ3568HM开发板进行了初步测试&#xff0c;后面我要实现MQTT的工作&#xff0c;但是遇到一个问题&#xff0c;就是开发板无法通过校园网的认证操作。未认证的话会&#xff0c;学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...

安装Ubuntu22.04

1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大...

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中&#xff0c;Charles 不仅可以实现简单的网络抓包操作&#xff0c;还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节&#xff0c;为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…...

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是对象复制的两种方式&#xff0c;它们在处理对象内部引用类型成员时有不同的行为。下面我将详细解释这两种拷贝的区别&#xff0c;并提供具体的 Java 示例代码。 浅拷贝&#xff08;Shal…...

解决双系统引导问题:Ubuntu 启动时不显示 Windows 选项的处理方法

方法 1&#xff1a;检查 GRUB 引导菜单是否隐藏 启动进入 Ubuntu 系统。打开终端&#xff0c;输入以下命令编辑 GRUB 配置文件&#xff1a;sudo nano /etc/default/grub检查以下配置项&#xff1a; GRUB_TIMEOUT0&#xff1a;如果是 0&#xff0c;将其改为一个较大的值&#x…...

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…...

行政办公管理系统的需求设计和实现

前言&#xff1a; 总裁办/综合部&#xff0c;作为综合行政管理部门服务于整个公司&#xff0c;工作职责包含从最基础的行政综合到协调督办、对外政务、品牌建设等等&#xff0c;工作量繁多而且琐碎。如何通过信息化来实现标准化和常态化的管理手段&#xff0c;确保总裁办的各项…...

996引擎 - NPC-动态创建NPC

996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC入口函数 function main(player)-- 获取玩家的用户名…...

HTML<hgroup>标签

例子&#xff1a; 使用hgroup元素标记标题和段落是相关的&#xff1a; <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法&#xff1a; 标签<hgroup>用于包围标题和一个或多个<p&g…...

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...

机试题——最小矩阵宽度

题目描述 给定一个矩阵&#xff0c;包含 N * M 个整数&#xff0c;和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N&#xff0c;M&#xff0c;表示矩阵大小。 接下…...

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …...

【力扣:新动计划,编程入门 —— 题解 ③】

—— 25.1.26 231. 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;…...

「全网最细 + 实战源码案例」设计模式——工厂方法模式

核心思想 简单工厂模式是一种创建者模式&#xff0c;它通过一个工厂类负责创建不同类型的对象&#xff0c;根据传入的参数决定实例化的具体类&#xff0c;也被称为“静态工厂方法”模式&#xff0c;因为工厂方法通常是静态的。 结构 1. 工厂类&#xff1a; 提供一个静态方法…...

SpringBoot使用MockMVC通过http请求controller控制器调用测试

说明 在Spring Boot中编写测试控制器调用是一个常见的需求,通常使用Spring的测试框架来完成。Spring Boot提供了多种方式来测试控制器,包括使用MockMvc进行模拟HTTP请求和响应的测试。 基本示例 1. 创建Spring Boot项目 首先,确保你已经创建了一个Spring Boot项目。如果…...

电子应用设计方案105:智能家庭AI拖把系统设计

智能家庭 AI 拖把系统设计 一、引言 智能家庭 AI 拖把系统旨在为用户提供更高效、便捷和智能化的地面清洁解决方案&#xff0c;减轻家务劳动负担。 二、系统概述 1. 系统目标 - 自动清洁地面&#xff0c;包括吸尘、拖地和擦干功能。 - 智能识别地面材质和污渍程度&#xff0c…...

Android13源码下载和编译过程详解

前言 作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解 一 源码下载 1.1 配置要求 官方推荐配置请参考&#xff1a;AOSP使用入门文档&#xff0c;重点有如下几项&#xff1a; 1.1.1 硬件配置要求 至少需要…...

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…...

SD-WAN站点和客户端的区别

很多用户在使用比扬云SD-WAN的时候不清楚站点和员工客户端的区别&#xff0c;尤其是很多从ZeroTier迁移过来的用户&#xff0c;这篇文章我们会详细介绍比扬云SD-WAN的站点和客户端使用场景。 ZeroTier只有客户端&#xff0c;没有站点&#xff0c;但是有路由配置&#xff0c;允…...

Arduino大师练成手册 -- 控制 MH-SD 卡模块

要在 Arduino 上控制 MH-SD 卡模块&#xff0c;你可以按照以下步骤进行&#xff1a; 硬件连接 VCC&#xff1a;连接到 Arduino 的 3.3V 或 5V 引脚&#xff08;根据模块的要求&#xff09;。 GND&#xff1a;连接到 Arduino 的 GND 引脚。 CS&#xff1a;连接到 Arduino 的…...

【MQ】RabbitMq的可靠性保证

消息队列中的可靠性主要是分为三部分&#xff1a; 消息不丢失&#xff1a;确保消息从生产者发送到消费者消息不丢失消息不重复&#xff1a;确保消息不被重复消费消息顺序性&#xff1a;确保消费的顺序性 解决方案主要有以下几部分&#xff1a; 消息不丢失 生产者确认机制持久…...

自签证书的dockerfile中from命令无法拉取镜像而docker的pull命令能拉取镜像

问题现象&#xff1a; docker pull images拉取镜像正常 dockerfile中的from命令拉取镜像就会报出证书错误。报错信息如下&#xff1a; [bjxtbwj-kvm-test-jenkins-6-243 ceshi_dockerfile]$ docker build . [] Building 0.4s (3/3) FINISHED …...

LAPD协议

实现LAPD&#xff08;Link Access Procedure on the D-channel&#xff09;协议的具体步骤和代码示例会比较复杂&#xff0c;通常涉及到底层网络编程和对ISDN协议的深入理解。以下是一个更详细的实现指导&#xff0c;主要集中在C/C环境中。 环境准备 确保你有一个支持ISDN的开发…...

jupyter版本所引起的扩展插件问题

文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一&#xff1a;通过配置文件永久设置&#xff08;推荐&#xff09;步骤 1&#xff1a;创建或修改 pip 配置文件步骤 2&#xff1a;验证配置是否生效 方法二&#xff1a;通过命令行直接配置效果验…...

连接 OpenAI 模型:基础操作

在这一部分中&#xff0c;我们将介绍如何连接 OpenAI 模型&#xff0c;设置 API 密钥&#xff0c;并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具&#xff0c;使得开发者能够更轻松地与 GPT 系列模型进行交互。 …...

Vue.js组件开发-实现对视频预览

在 Vue 中实现视频文件预览 实现步骤 创建 Vue 组件&#xff1a;构建一个 Vue 组件用于处理视频文件的选择和预览。文件选择&#xff1a;添加一个文件输入框&#xff0c;允许用户选择视频文件。读取文件&#xff1a;监听文件选择事件&#xff0c;使用 FileReader API 读取所选…...

基于 Arduino Uno 和 RFID-RC522 的 RFID 卡号读取技术详解

引言 射频识别&#xff08;RFID&#xff09;技术因其非接触式、高效性和低成本的特点&#xff0c;广泛应用于门禁系统、物流管理和智能设备等领域。本文将通过 Arduino Uno 和 MFRC522 RFID 模块&#xff0c;手把手教你实现 RFID 卡号的读取&#xff0c;并提供完整的代码解析和…...

AI Agent的测试与监控:保障稳定性的实战经验

在前面的文章中&#xff0c;我们讨论了 AI Agent 的各个核心模块。今天&#xff0c;我想聊聊如何保障 AI Agent 的稳定性。说实话&#xff0c;这个话题我一直很关注&#xff0c;因为在生产环境中&#xff0c;稳定性往往比功能更重要。 从一次线上事故说起 还记得去年一个深夜…...

Servlet项目依赖管理

一、Servlet 相关技术选型 思路: 先选择 Servlet 容器&#xff0c;再找支持当前 JDK 版本的 Servlet 容器版本。 已知Servlet容器有两种市场占用率较高&#xff0c;Tomcat&Jetty。接下来分别按照上述思路进行选择容器版本。 Tomcat 官网: https://tomcat.apache.org/ 版本…...

戴尔电脑设置u盘启动_戴尔电脑设置u盘启动多种方法

最近有很多网友问&#xff0c;戴尔台式机怎么设置u盘启动&#xff0c;特别是近两年的戴尔台式机比较复杂&#xff0c;有些网友不知道怎么设置&#xff0c;其实设置u盘启动有两种方法&#xff0c;下面小编教大家戴尔电脑设置u盘启动方法。 戴尔电脑设置u盘启动方法一、戴尔进入b…...

大数据治理实战指南:数据质量、合规与治理架构

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 随着企业数字化转型的加速&#xff0c;大数据已成为驱动业务决策的核心资产。然而&#xff0c;数据治理的缺失或不完善&…...

2025年01月26日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;4871今日star数&#xff1a;207项目维护者&#xff1a;Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简…...

03-画P封装(制作2D+添加3D)

画P封装的方法2D制作3D添加 使用P封装自己画0603格式的电阻的P封装1. 看规格书,找参数2. 创建一个新的P封装3. 灯泡两侧放焊盘4.设置焊盘大小和形状5.根据坐标定义中间间隔: L/2原则6. 画最外层丝印(丝印层直接围住即可)7.在平面的P封装上,添加3D立体封装库 立创商城下载P封装向…...

WPF5-x名称空间

1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字&#xff08;取XAML的首字母&#xff09;&#xff0c;里面的成员&#xff08;如x:Class、…...

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...

SSM开发(二) MyBatis两种SQL配置方式及其对比

目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句:注解(如 @Select…...