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

patchwork++地面分割学习笔记

参考资料:古月居 - ROS机器人知识分享社区

https://zhuanlan.zhihu.com/p/644297447

patchwork++算法一共包含四部分内容:提出了以下四个部分:RNR、RVPF、A-GLE 和 TGR

1)基于 3D LiDAR 反射模型的反射噪声消除 (RNR),以有效消除虚拟噪声点

2)引入了区域垂直平面拟合 (RVPF) 来正确分割地面,即使地面被不同层抬高

3)利用适应地面似然估计 (A-GLE) 根据先前的地面分割结果自适应地计算适当的参数

4)时间地面恢复 (TGR) 通过使用临时地面属性来缓解部分欠分割问题

0.CMZ同心圆模型构造

以极坐标形式,将每个点按照半径和极坐标角度,按照[环区域][环带号][扇区号]进行分类,即先定位环区域,再定位在当前区域的哪个环带,再定位在当前环带的哪个扇区。通过将整个区域划分为同心圆模型,对每一个扇区bin区域(【区域】【环带】【扇区】)进行遍历和地面非地面分析,来拟合整个路面

代码:

//将点云根据半径角度放入同心圆模型(构造同心圆模型存储对应索引点云)
template<typename PointT> inline
void PatchWorkpp<PointT>::pc2czm(const pcl::PointCloud<PointT> &src, std::vector<Zone> &czm, pcl::PointCloud<PointT> &cloud_nonground) {for (int i=0; i<src.size(); i++) {//如果被标记为噪声则跳过if ((!noise_idxs_.empty()) &&(i == noise_idxs_.front())) {//过滤掉噪点区域不转换好CZMnoise_idxs_.pop();continue;}PointT pt = src.points[i];//当前点double r = xy2radius(pt.x, pt.y);//当前点半径// 只识别XY一定范围内的地面,类似于栅格化 min_range_ 0.2米  max_range_ 40米if ((r <= max_range_) && (r > min_range_)) {double theta = xy2theta(pt.x, pt.y);//计算点在极坐标下的角度,确定对应的区域(X/Y角度)//根据半径确定所述的同心圆区域int zone_idx = 0;if ( r < min_ranges_[1] ) zone_idx = 0;else if ( r < min_ranges_[2] ) zone_idx = 1;else if ( r < min_ranges_[3] ) zone_idx = 2;else zone_idx = 3;//ring_idx 环数确定(半径)//每个区域环的编号=(半径-当前区域(环)的起始边界)/每个环带的宽度;num_rings_each_zone_保证使其不超过环的总数[2,4,4,4]int ring_idx = min(static_cast<int>(((r - min_ranges_[zone_idx]) / ring_sizes_[zone_idx])), num_rings_each_zone_[zone_idx] - 1);//sector_idx扇形区域确定(角度)//计算所在环区域的,扇形区域的编号int sector_idx = min(static_cast<int>((theta / sector_sizes_[zone_idx])), num_sectors_each_zone_[zone_idx] - 1);//将点放入同心圆模型(环区域号,环带号,扇形区域号)czm[zone_idx][ring_idx][sector_idx].points.emplace_back(pt);}else {// 当点云距离大于阈值时,直接默认为是非地面点cloud_nonground.push_back(pt);}}if (verbose_) cout << "[ CZM ] Divides pointcloud into the concentric zone model" << endl;
}

1.噪声点去除

由于雷达的穿透效应,会在地面之下产生一个高度很低的噪声点,R-GPF算法会选取最低点作为初始点,选到这些噪声点时就会出现欠分割了(真实地面没找到,也就是FN错误拒绝)

由于入射角较小(与竖直面夹角)会导致雷达光线被穿透,而被穿透后的点的坐标较小,其反射率也会相应较小,以入射角角度,高度,反射率来判断该点是否为噪声点,如果为噪声点则认为其为非地面点,防止后续在RVPF进行竖直面分割和平面拟合时选到该点。

代码:

//移除反射噪声点,并将点合并到cloud_nonground非地面点云
template<typename PointT> inline
void PatchWorkpp<PointT>::reflected_noise_removal(pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_nonground)
{for (int i=0; i<cloud_in.size(); i++){double r = sqrt( cloud_in[i].x*cloud_in[i].x + cloud_in[i].y*cloud_in[i].y );//水平距离double z = cloud_in[i].z;//高度(机身系)double ver_angle_in_deg = atan2(z, r)*180/M_PI;//计算夹角角度//如果入射角度小于阈值,高度小于阈值,反射率小于阈值(作为噪声和非地面点)if ( ver_angle_in_deg < RNR_ver_angle_thr_ && z < -sensor_height_-0.8 && cloud_in[i].intensity < RNR_intensity_thr_){cloud_nonground.push_back(cloud_in[i]);noise_pc_.push_back(cloud_in[i]);noise_idxs_.push(i);}}if (verbose_)ROS_INFO("[ RNR ] Num of noises :%d", noise_pc_.points.size());
}

2.区域垂直平面拟合

对于某一个BIN(扇区),如果未能剔除垂直区域,以Z坐标较小的种子点进行平面拟合时,会出现平面异常清空。如楼梯面。使用R-VPF来剔除垂直方向上的点云,并通过剔除后的点云拟合平面,以点到该平面的距离来分类地面和非地面点。

2.1种子点选取

对按高度升序后的点云进行处理,选取高度低于某一阈值的点云作为种子点云,这些点云用于后续的平面拟合。

代码:

//从输入原始点云p_sorted中提取初始地面种子点(小于某高度平均值),并存储到init_seeds
template<typename PointT> inline
void PatchWorkpp<PointT>::extract_initial_seeds(const int zone_idx, const pcl::PointCloud<PointT> &p_sorted,pcl::PointCloud<PointT> &init_seeds, double th_seed) {init_seeds.points.clear();// LPR是低点代表的平均值double sum = 0;int cnt = 0;int init_idx = 0;//如果在0区域有点,会对起始索引init_idx进行处理,否则以最低点init_idx取if (zone_idx == 0) {//0环区域(最内圈)for (int i = 0; i < p_sorted.points.size(); i++) {//遍历输入点云(经过高度由小到大排序后)if (p_sorted.points[i].z < adaptive_seed_selection_margin_ * sensor_height_) {//高度小于阈值-1.2*1.5++init_idx;//计算起始点索引(最低点)} else {break;}}}// Calculate the mean height value.//以init_idx为起始索引,选取num_lpr_个,高度高于adaptive_seed_selection_margin_ * sensor_height_的点计算平均高度for (int i = init_idx; i < p_sorted.points.size() && cnt < num_lpr_; i++) {sum += p_sorted.points[i].z;cnt++;}double lpr_height = cnt != 0 ? sum / cnt : 0;// 计算平均高度lpr_height// 迭代点云,将高度小于lpr_height + th_seed点作为种子点for (int i = 0; i < p_sorted.points.size(); i++) {if (p_sorted.points[i].z < lpr_height + th_seed) {init_seeds.points.push_back(p_sorted.points[i]);}}
}

2.2以种子点的协方差和均值,拟合平面

对输入的种子点云,计算协方差和平均值,对协方差进行奇异值分解,得到对应的特征值。特征值越小,其对应方向向量的方差越小,离散度越小。以最小奇异值方向作为平面法线方向(平面法线方向离散度最小)。以均值坐标(质心)作为平面点。拟合平面

代码:

//以输入点云的协方差和均值,拟合平面
template<typename PointT> inline
void PatchWorkpp<PointT>::estimate_plane(const pcl::PointCloud<PointT> &ground) {pcl::computeMeanAndCovarianceMatrix(ground, cov_, pc_mean_);//计算协方差矩阵cov_和点云均值pc_mean_(所有坐标)// 对协方差矩阵奇异值分解cov=USU^TEigen::JacobiSVD<Eigen::MatrixXf> svd(cov_, Eigen::DecompositionOptions::ComputeFullU);//点云协方差的奇异值,表示点云在不同方向的离散程度singular_values_ = svd.singularValues();// 使用最小奇异向量作为法线(最小奇异值方向的特征向量)//最小特征值表明该方向离散程度最小,该方向近似平面normal_ = (svd.matrixU().col(2));//法向量方向修正(始终向上)if (normal_(2) < 0) { for(int i=0; i<3; i++) normal_(i) *= -1; }//以点云均值为平面上的点,// mean ground seeds valueEigen::Vector3f seeds_mean = pc_mean_.head<3>();// according to normal.T*[x,y,z] = -d//ax+by+cz=-d;[a,b,c]为法向量,[x,y,z]为平面上的点d_ = -(normal_.transpose() * seeds_mean)(0, 0);
}

2.3垂直平面剔除

如果拟合的平面过于垂直(单位法线Z方向的分量小于阈值,即法向量过于平坦,平面过于垂直)。则认为该拟合平面不符合要求,在拟合时可能存在其他竖直平面的干扰,需要将竖直平面去除。认为与当前拟合平面距离小于某一阈值的点,认为其为竖直平面点,需要去除

代码:

if (enable_RVPF_)//如果使能enable_RVPF_{for (int i = 0; i < num_iter_; i++){/*******1.1在高度小于一定区域选取种子点******* *///从输入点云p_sorted中提取初始地面种子点(小于某高度平均值),并存储到init_seeds//zone_idx:区号,src_wo_verticals:输入排序后的点云,ground_pc_:种子点,th_seeds_v_:平均值以上的筛选高度extract_initial_seeds(zone_idx, src_wo_verticals, ground_pc_, th_seeds_v_);/********1.2.以输入的种子点云的协方差和均值拟合平面***/estimate_plane(ground_pc_);/********1.3.如果拟合的平面过于垂直,剔除点云中垂直平面点,如墙面等** *///区域0,法向量Z分离小于阈值(过于垂直),uprightness_thr_=0.707,则法向量小于45度,平面垂直大于45度if (zone_idx == 0 && normal_(2) < uprightness_thr_){pcl::PointCloud<PointT> src_tmp;src_tmp = src_wo_verticals;src_wo_verticals.clear();Eigen::MatrixXf points(src_tmp.points.size(), 3);int j = 0;//转换为矩阵模式,每一行代表一个点for (auto &p:src_tmp.points) {points.row(j++) << p.x, p.y, p.z;}// 计算点到平面距离p*n+d=dis==>p*n=dis-d=resultEigen::VectorXf result = points * normal_;//遍历点云进行分类,如果点与平面距离小于阈值,则认为其为垂直平面点,否则为其他点//d_是estimate_plane拟合平面的平面偏移量参数for (int r = 0; r < result.rows(); r++) {//result+d_=dis=p*n+d<th_dist_v_,点到平面距离在阈值[-th_dist_v_,th_dist_v_]if (result[r] < th_dist_v_ - d_ && result[r] > -th_dist_v_ - d_) {non_ground_dst.points.push_back(src_tmp[r]);vertical_pc_.points.push_back(src_tmp[r]);} else {src_wo_verticals.points.push_back(src_tmp[r]);}}}else break;}}

2.4对经过R-VPF竖直面剔除后的点云,进行平面拟合

对剔除垂直点后的点云,寻找z值小于阈值的种子点,以种子点方差最小方向为法向量方向,以平均点坐标为平面坐标,构建拟合平面。

2.5以点云与拟合平面的距离来区分地面和非地面点

代码:

    for (int i = 0; i < num_iter_; i++) {ground_pc_.clear();// ground plane model//计算点到平面的距离,平面方程:ax+by+cz=-d//点到平面距离为dis=|ax1+by1+cz1+d|/sqrt(a*a+b*b+c*c)=points * normal_+d_//result=dis-d_Eigen::VectorXf result = points * normal_;// threshold filter//按照点到平面距离,进行点云分类,与拟合平面小于th_dist_距离的认为是地面点for (int r = 0; r < result.rows(); r++) {if (i < num_iter_ - 1) {if (result[r] < th_dist_ - d_ ) {ground_pc_.points.push_back(src_wo_verticals[r]);}} else { // Final stageif (result[r] < th_dist_ - d_ ) {dst.points.push_back(src_wo_verticals[r]);} else {non_ground_dst.points.push_back(src_wo_verticals[r]);}}}if (i < num_iter_ -1) estimate_plane(ground_pc_);//使用当前地面点,重新拟合平面else estimate_plane(dst);//使用dst最后一次的地面点,拟合平面}

3.A-GLE自适应地面估计

以法向量夹角,高程差,平坦度等指标,对RVPF平面拟合后的地面点进行进一步的地面估计,RVPF的估计的非地面点,则直接作为非地面点处理。对上述每个BIN中的点重新评估后,合并成为地面点和非地面点

1)以2中拟合的平面法向量,来判断拟合平面与水平面(雷达系)的夹角,来判断是否为地面

2)以高程差,判断其是否为地面

3)以平坦度判断是否为地面

4)以质心向量与平面法向量(朝上)是否同方向判断是否为地面,若同方向,则雷达应该在拟合平面下面,则该平面不会为地面。

代码:

//.计算每个扇区Bin的地面特征
const double ground_uprightness = normal_(2);//垂直度:地面法向量与垂直方向夹角(地面法向量的z分量,法向量与z轴夹角余弦,地面倾角越小,越接近1)
const double ground_elevation   = pc_mean_(2, 0);//高程差:地面高度(当前区域种子点云平均高度Z)
const double ground_flatness    = singular_values_.minCoeff();//平坦度(λ3),最小的特征值(平面法向量)//线性特性(点云沿某一方向的延申)
//最大奇异值与次大奇异值的比值,比值越大,说明越接近一条直线
const double line_variable      = singular_values_(1) != 0 ? singular_values_(0)/singular_values_(1) : std::numeric_limits<double>::max();// pc_mean_(i,0),点云平均值在第i个轴的值,normal_(i)法向量在第i个轴的分量(i=0是x轴)double heading = 0.0;//法向量与传感器方向(<0法向量与传感器方向一致->地面,>0法向量与传感器方向不一致->非地面)
//点云质心向量与平面法向量的点积运算(x,y,z)*(a,b,c),表示是否同向,其中normal_(2)>0,朝上
for(int i=0; i<3; i++) heading += pc_mean_(i,0)*normal_(i);//法线与雷达射线方向是否同向(点坐标为原点到当前点的射线)
/***************4.使用A-GLE进行自适应地面估计******* *///地面法向量与垂直方向夹角大于阈值,表明拟合平面与水平面夹角较小,符合平面特性bool is_upright         = ground_uprightness > uprightness_thr_;//法线方向是否符合地面特性//种子平均高度小于区域的海拔高度(concentric_idx:区域序号)bool is_not_elevated    = ground_elevation < elevation_thr_[concentric_idx];//高度是否符合地面特性
//平面平坦度小于阈值bool is_flat            = ground_flatness < flatness_thr_[concentric_idx];//平坦度是否符合地面特性//当前区域序号是否没有超限bool is_near_zone       = concentric_idx < num_rings_of_interest_;//如果平面的法向量与种子质心向量的朝向同向,则false,为非地面点
bool is_heading_outside = heading < 0.0;//地面法线方向是否朝向传感器
//4.1该BIN地面点、非地面点、候选点判断 
//如果拟合平面与水平面夹角较小&&种子平均高度小于区域的海拔高度&&当前区域序号是否没有超限
//将当前bin种子的Z高度,存入update_elevation_[序号]数组中
//将当前bin种子的平坦度,存入update_flatness_[序号]数组中
//将当前bin种子的平坦度,存入ringwise_flatness数组中
if (is_upright && is_not_elevated && is_near_zone){update_elevation_[concentric_idx].push_back(ground_elevation);update_flatness_[concentric_idx].push_back(ground_flatness);ringwise_flatness.push_back(ground_flatness);}// 如果拟合平面与水平面夹角较大,说明该bin非水平,非地面点
if (!is_upright)
{cloud_nonground += regionwise_ground_;}
//如果zone区域超限,该bin非地面点
else if (!is_near_zone){cloud_ground += regionwise_ground_;}//如果平面法向量与传感器同向,非地面点(即雷达在平面下面,非地面点)
else if (!is_heading_outside)
{cloud_nonground += regionwise_ground_;
}
//如果种子平均高度小于区域的海拔高度,或者拟合平面平坦度小于阈值,则该BIN为地面点
else if (is_not_elevated || is_flat){cloud_ground += regionwise_ground_;}
else//不确定的候选点
{//构造候选点,共后续的TGE时间回退机制修正//候选点属性:区域编号,环编号,平坦度,线性特征,质心坐标,拟合的平面点RevertCandidate<PointT> candidate(concentric_idx, sector_idx, ground_flatness, line_variable, pc_mean_, regionwise_ground_);candidates.push_back(candidate);}
// Every regionwise_nonground is considered nonground.//每个bin中,进行垂直平面拟合时,认为垂直的点regionwise_nonground_都是非地面点
cloud_nonground += regionwise_nonground_;

4.TGR时间回退处理

对不满足3中分类的不确定候选点云进行修正

4.1将不满足A-GLE条件划分的点作为候选点,加入数组中

4.2通过平坦度和线性特性,来判断候选点中的平面拟合点是否为地面

代码:

/***********5.时间回退处理TGR**********/
double t_bef_revert = ros::Time::now().toSec();//每个环带的遍历
if (!candidates.empty())//候选点不为空
{if (enable_TGR_)//使能TGR时间回退功能{//输入当前环带ring的地面点,非地面点,平坦度,候选点,当前区域编号temporal_ground_revert(cloud_ground, cloud_nonground, ringwise_flatness, candidates, concentric_idx);}else{for (size_t i=0; i<candidates.size(); i++){cloud_nonground += candidates[i].regionwise_ground;}}candidates.clear();//将当前环带的候选点数组清空ringwise_flatness.clear();//将当前环带的平坦度数组清空
}double t_aft_revert = ros::Time::now().toSec();t_revert += t_aft_revert - t_bef_revert;concentric_idx++;//区域序号

相关文章:

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…...

OSPF浅析

一、预习&#xff1a; 1、介绍&#xff1a; 是一种基于接口的典型的链路状态路由协议&#xff0c;协议号89&#xff0c;把大型网络分隔为多个较小、可管理的单元&#xff1a;Area&#xff0c;管理距离110&#xff1b;OSPF基于IP&#xff0c;使用了LSAck包来保证包数据的可靠性&…...

批量写入数据到数据库,卡顿怎么解决

在批量写入数据到数据库时,遇到卡顿或性能瓶颈是比较常见的问题。以下是一些可能的解决方案和优化策略,帮助你提高批量写入的性能: ### 1. **批量大小优化** - **调整批量大小**:尝试调整批量写入的数据量,找到一个平衡点。过大或过小的批量大小都可能影响性能。通常,批…...

Residency 与 Internship 的区别及用法解析

Residency 与 Internship 的区别及用法解析 在英文中&#xff0c;“residency” 和 “internship” 都与职业培训相关&#xff0c;但它们的使用场景和具体含义存在显著差异。本文将详细解析这两个词的区别&#xff0c;以及它们在不同语境下的应用。 Residency 的定义及使用场景…...

【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…...

基于生成式对抗网络(GAN)的前沿研究与应用

引言 人工智能&#xff08;AI&#xff09;领域在过去几年中经历了快速的发展&#xff0c;尤其是深度学习的兴起带来了许多变革。其中&#xff0c;生成式对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;因其强大的生成能力成为了研究热点。自2014年Ian G…...

stm32 移植RTL8201F(正点原子例程为例)

最近在工作中需要使用RTL8201F&#xff0c;在网上找了很多帖子&#xff0c;没有找到合适的&#xff0c;自己翻资料移植了一个。 模板工程使用的是正点原子的f407探索版的例程&#xff0c;原子使用的是LAN8720,需要把他的驱动修改成为我们自己用的RTL8201F。 1.将PHY_TYPE改成我…...

QT-TCP-server

为了实现高性能的TCP通讯&#xff0c;以下是一个基于Qt的示例&#xff0c;展示如何利用多个线程、非阻塞I/O、数据分块和自定义协议进行优化。该示例以TCP服务器和客户端的形式展示&#xff0c;能够承受高负载并实现快速数据传输。 高性能TCP Server示例 #include <QTcpSe…...

第 24 章 网络请求与远程资源

第 24 章 网络请求与远程资源 24.1 XMLHttpRequest 对象 所有现代浏览器都通过 XMLHttpRequest 构造函数原生支持 XHR 对象&#xff1a; let xhr new XMLHttpRequest()24.1.1 使用 XHR 使用 XHR 对象首先要调用 open()方法&#xff0c;这个方法接收 3 个参数&#xff1a;请…...

k8s dashboard离线部署步骤

确定k8s版本&#xff0c;以1.23为例。 部署metrics-server服务&#xff0c;最好用v0.5.2。 用v0.6.0&#xff0c;可能会报以下错误&#xff1a; nodekubemaster:~/Desktop/metric$ kubectl top nodes Error from server (ServiceUnavailable): the server is currently unabl…...

热备份路由HSRP及配置案例

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 一&#xff0c;HSRP的相关概念二&#xff0c;…...

【文本分类】bert二分类

import os import torch from torch.utils.data import DataLoader, Dataset from transformers import BertTokenizer, BertForSequenceClassification, AdamW from sklearn.metrics import accuracy_score, classification_report from tqdm import tqdm# 自定义数据集 class…...

计算机网络 (30)多协议标签交换MPLS

前言 多协议标签交换&#xff08;Multi-Protocol Label Switching&#xff0c;MPLS&#xff09;是一种在开放的通信网上利用标签引导数据高速、高效传输的新技术。 一、基本概念 MPLS是一种第三代网络架构技术&#xff0c;旨在提供高速、可靠的IP骨干网络交换。它通过将IP地址映…...

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…...

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

[开源]自动化定位建图系统

系统状态机&#xff1a; 效果展示&#xff1a; 1、 机器人建图定位系统-基础重定位&#xff0c;定位功能演示 2、 机器人建图定位系统-增量地图构建&#xff0c;手动回环检测演示 3、… 开源链接&#xff1a; https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...

OSPF使能配置

OSPF路由协议是用于网际协议&#xff08;ip&#xff09;网络的链路状态的路由协议。该协议使用链路状态路由算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;在单一自治系统&#xff08;AS&#xff09;内部工作。适用于IPV4的OSPFv2协议定义于RFC 2328&#xff0c;R…...

ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换

总结&#xff1a; 设置匿名访问&#xff0c;只需要设置xpack.security.authc.anonymous.username和xpack.security.authc.anonymous.roles参数就行&#xff0c;设置好后&#xff0c;可以匿名访问也可以非匿名访问&#xff0c;但是非匿名访问的情况下必须保证用户名和密码正确 取…...

web移动端UI框架

文章目录 Vant简介主要特点和功能适用场景和用户评价 Mint UI简介主要特点和功能 cube-ui简介特性 iView Weapp简介 uni-app简介 Vant 使用vue3版本官网&#xff1a;https://vant-ui.github.io/vant/#/zh-CN/ 适用vue2版本官网&#xff1a;https://vant-ui.github.io/vant/v2/…...

数据库高安全—角色权限:权限管理权限检查

目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限&#xff1a;角色创建角色管理&#xff0c;从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍&#xff0c;本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...

spring boot controller放到那一层

在 Spring Boot 应用程序中&#xff0c;Controller 层通常被放置在应用程序的 表示层&#xff08;Presentation Layer&#xff09; 或 用户界面层&#xff08;UI Layer&#xff09; 中。Controller 层的主要职责是处理用户的 HTTP 请求&#xff0c;并将请求转发给服务层进行业务…...

报错 - cannot import name ‘ExportOptions‘ from ‘torch.onnx._internal.exporter‘

调用库时出现错误&#xff1a; ImportError: cannot import name ‘ExportOptions’ from ‘torch.onnx._internal.exporter’ 尝试更新 onnx&#xff0c; onnxscript&#xff0c;diffusers 均没有解决问题 将 torch 升级&#xff08;从 2.1.0 到 2.5.1&#xff09;后解决了 具…...

恒压恒流原边反馈控制芯片 CRE6289F

CRE6289F 系列产品是一款内置高压 MOS 功率开关管的高性能多模式原边控制的开关电源芯片。较少的外围元器件、较低的系统成本设计出高性能的交直流转换开关电源。CRE6289F 系列产品提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、软启动、芯片过温保…...

ffmpeg视频抽帧和合成

FFMPEG 抽取视频场景转换帧 ffmpeg -i input.mp4 -vf "selectgt(scene,0.4),showinfo" -vsync vfr output_%04d.jpg ffmpeg -i input.mp4 -vf "selectgt(scene,0.4),scale1280:720" -vsync vfr output_%03d.jpg # -vsync 已经弃用&#xff0c;最新版本不…...

七、Hadoop环境搭建之安装JDK

文章目录 一、卸载自带JDK二、传输jdk到服务器中三、解压四、配置JDK环境变量 一、卸载自带JDK 注意&#xff1a;安装JDK前&#xff0c;一定确保提前删除了虚拟机自带的JDK。 以下操作&#xff0c;请切换至root权限进行操作 输入&#xff1a;rpm -qa | grep jdk 会查询出系统…...

RocketMQ消息积压问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ消息积压问题如何解决?】面试题。希望对大家有帮助&#xff1b; RocketMQ消息积压问题如何解决? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 消息积压问题通常是指消息队列中的消息堆积过多&…...

【Java基础】进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化

1. 进程和线程 1.1 进程 几乎所有的操作系统都支持进程的概念&#xff0c;所有运行中的任务通常对应一个进程&#xff08;Process&#xff09;。 当一个程序进入内存运行时&#xff0c;即变成一个进程。 进程是处于运行过程中的程序&#xff0c;并且具有一定的独立功能&…...

CDN防御如何保护我们的网络安全?

在当今数字化时代&#xff0c;网络安全成为了一个至关重要的议题。随着网络攻击的日益频繁和复杂化&#xff0c;企业和个人都面临着前所未有的安全威胁。内容分发网络&#xff08;CDN&#xff09;作为一种分布式网络架构&#xff0c;不仅能够提高网站的访问速度和用户体验&…...

深度学习驱动的蛋白质设计技术与实践

通过设计特定的蛋白质结构&#xff0c;可以实现预期的生物功能&#xff0c;如催化特定化学反应、识别和结合特定分子、调控生物信号传导等&#xff0c;为生物医学、药物研发、生物技术等领域提供重要工具和解决方案。传统的蛋白质设计方法主要依赖于已知蛋白质结构的同源建模、…...

Centos7使用yum工具出现 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具时&#xff0c;出现 "Could not resolve host: mirrorlist.centos.org" 的错误&#xff0c;一般情况是因为默认的镜像源无法访问。 以下是一些常用的解决方法&#xff1a; 检查网络连接&#xff1a;首先使用 ping 命令测试网络连接是否…...

iOS - 原子操作

在 Objective-C 运行时中&#xff0c;原子操作主要通过以下几种方式实现&#xff1a; 1. 基本原子操作 // 原子操作的基本实现 #if __has_feature(c_atomic)#define OSAtomicIncrement32(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED) #define …...

PHP二维数组去除重复值

Date: 2025.01.07 20:45:01 author: lijianzhan PHP二维数组内根据ID或者名称去除重复值 代码示例如下&#xff1a; // 假设 data数组如下 $data [[id > 1, name > Type A],[id > 2, name > Type B],[id > 1, name > Type A] // 重复项 ];// 去重方法 $dat…...

【Flink部署】-- 部署 flink 1.19.1 standalone 集群

目录 1、环境准备 2、部署步骤 2.1、下载 flink 二进制包 2.2、配置全局环境变量 2.3、验证 flink 版本 2.4、配置 config.yaml 2.5、启动和停止本地 standalone 集群 2.6、提交测试作业 2.7、查询作业 3、参考 1、环境准备 jdk 11apache flink 1.19.1 安装包2、部署…...

关于物联网的基础知识(二)——物联网体系结构分层

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;二&a…...

使用Paddledetection进行模型训练【Part2:数据准备+模型训练】

目录 写在前面 数据准备 模型优化 1. 使用自定义数据 2. 加载预训练模型 3. 启动训练 写在前面 在目标检测算法产业落地过程中&#xff0c;常常会出现需要额外训练以满足实际使用的要求&#xff0c;项目迭代过程中也会出先需要修改类别的情况。本文档详细介绍如何使用Pa…...

使用最广泛的FastAPI项目结构推荐,命名规范等

使用最广泛的FastAPI项目结构推荐&#xff0c;命名规范等 一、FastAPI项目结构如下&#xff1a;二、组件管理&#xff1a;使用依赖注入三、命名约定四、建议分层架构的设计五、文档和测试六、版本控制和持续集成七、环境和配置管理工具八、性能优化与权限安全 一、FastAPI项目结…...

【JAVA】java中将一个list进行拆解重新组装

一、使用场景 1、当需要对一个list中的元素属性进行重新赋值&#xff0c;比如一个list中存储了订单数据&#xff0c;我们需要改变list中每个订单的id&#xff0c;然后再重新输出订单list if(CollectionUtils.isNotEmpty(orderList)){ orderList.forEach(p->{ …...

怎样修改el-table主题样式

起因&#xff1a;el-table有主题样式&#xff0c;部分需要单独设置 环境&#xff1a;ideanodejs插件谷歌浏览器 第一步&#xff1a;找到scss文件&#xff1a; 谷歌浏览器打开表格页面&#xff0c;ctrlshifti打开开发者工具&#xff0c;点击后鼠标移动到表格单元格上单击一下…...

【Docker项目实战】使用Docker部署gallery轻量级图片管理系统

【Docker项目实战】使用Docker部署gallery轻量级图片管理系统 一、SFPG介绍1.1 应用简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载gallery…...

缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)

缓存击穿&#xff08;Cache Breakdown&#xff09; 是在高并发场景下&#xff0c;当某个热点数据在缓存中失效或不存在时&#xff0c;瞬间大量请求同时击中数据库&#xff0c;导致数据库压力骤增甚至崩溃的现象。为了解决这一问题&#xff0c;“永不过期” “逻辑过期” 的策略…...

【0x006D】HCI_Write_LE_Host_Support命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_LE_Host_Support命令格式 2.2. LE_Supported_Host 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令发起阶段&#xff08;主机端&#xff09; 4.2. 命令处理阶段…...

尚硅谷· vue3+ts 知识点学习整理 |14h的课程(持续更ing)

vue3 主要内容 核心&#xff1a;ref、reactive、computed、watch、生命周期 常用&#xff1a;hooks、自定义ref、路由、pinia、miit 面试&#xff1a;组件通信、响应式相关api ----> 笔记&#xff1a;ts快速梳理&#xff1b;vue3快速上手.pdf 笔记及大纲 如下&#xff…...

【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

C++ constexpr(八股总结)

答&#xff1a;这个关键字用于指示一个变量、函数或者对象可以在编译时求值&#xff08;即它们是常量表达式&#xff09;。这意味着当程序编译时&#xff0c;编译器会尝试计算出该表达式的值&#xff0c;而不是在程序运行时计算它&#xff0c;从而提高了程序的性能。 常量表达…...

继承(5)

大家好&#xff0c;今天我们继续来学习继承的相关知识&#xff0c;来看看子类构造方法&#xff08;也叫做构造器&#xff09;是如何做的。 1.6 子类构造方法 父子父子,先有父再有子,即:子类对象构选时,需要先调用基类构造方法,然后执行子类的构造方法 ★此时虽然执行了父类的…...

Oracle Dataguard(主库为 RAC 双节点集群)配置详解(1):安装 Oracle11g RAC 双节点集群

Oracle Dataguard&#xff08;主库为 RAC 双节点集群&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;安装 Oracle11g RAC 双节点集群 目录 Oracle Dataguard&#xff08;主库为 RAC 双节点集群&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;安装 Orac…...

基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型

1.单相升压自耦变压器的基本方程和等效电路 单相升压自耦变压器的接线原理图如图1所示。在建立自耦变压器的基本方程时,仍然把它看成是从双绕组变压器演变而来。在图1中,设节点a到节点b部分的绕组的匝数为,对应于双绕组变压器的原边绕组;节点c到节点a部分的绕组的绕组匝数为…...

ffmpeg 常用命令

更详细请参考ffmpeg手册&#xff0c;下载ffmpegrelease版后在doc中就有&#xff0c;主页面。video filter 参考ffmpeg-filters.html -version -formats -demuxers -protocols -muxers -filters -devices —pix_fmts -codecs -sample_fmts -decoders -layouts -encoders -colors…...

c#集成itext7导出pdf,包含表格

在Nuget解决方案中搜索itext7&#xff0c;进行安装 同时还要安装 itext7.bouncy-castle-adapter。 否则 PdfWriter writer new PdfWriter(pdfOutputPath);执行时会报错unknown PdfException&#xff0c;然后生成一个空白的pdf&#xff0c;且显示已损坏。 捕获异常发现 ex.In…...

STM32-WWDG/IWDG看门狗

WWDG/IWDG一旦开启不能关闭&#xff0c;可通过选项字节在上电时启动硬件看门狗&#xff0c;看门狗计数只能写入不能读取。看门狗启用时&#xff0c;T6bit必须置1&#xff0c;防止立即重置。 一、原理 独立看门狗-超时复位 窗口看门狗-喂狗&#xff08;重置计数器&#xff0c;…...