机器人制作开源方案 | 清洁机器人

作者:胡志宇、白永康、颉志国、刘昭迅、王维浩

单位:北京石油化工学院

指导老师:陈亚、王殿军

1. 设计方案论证

1.1 清洁机器人方案选择

      目前,市场上清洁机器人比比皆是,各大品牌之间的竞争也相当激烈,每个厂商都想制作出更吸引人眼球、功能齐全、覆盖率广且价格实惠的机器人。随着科学技术的不断更进,能够自主吸尘和拖地的机器人已经出现,在全国机械及机器人设计大赛上也纷纷涌出很多兴趣爱好者们对清洁机器人研发及制作的作品。值得一提的是,这些大学生们所设计的作品,不仅有着高水平的创新意义,在技术方面也不亚于生产领域的工程师们,相信不少产品投放市场的机会指日可待。本次课题“清洁机器人设计”范围广泛,本着多个方案择优选择的原则对本次课题进行方案的选择。

      方案一:吸尘+净化空气

      当今市场的吸尘机器人技术和功能都相当成熟,要想在现有的基础上实现创新的价值,要么增加或改变功能,要么对该领域所存在的技术缺陷进行改善。对于后者来说,实现起来相当困难,不仅是因为自己的相关技术知识有限,更是对高科技的一种敬畏。于是,初步的设想是在原有吸尘器的基础上添加净化空气的装置,在机器人实现扫地功能的同时对室内空气质量也做了改善。

      方案二:外观似昆虫(有触角和尾巴),用触角吸尘,用尾巴拖地

      搜寻资料时,发现一款清洁机器人带有两个长长的触角,后边还有一个长尾巴,形状像极了昆虫。对于它的介绍很少,用两个长长的触角吸尘,后边的尾巴上携带了一个长方形的毛刷,用来拖地。于是,想仿照这个样子,做出一个雷同的可以吸尘和拖地的清洁机器人。

      方案三:吸尘+拖地(带水箱)

      此方案也是吸尘和拖地并用功能,带有水箱装置,可以自动给拖布供水。为了达到更好的拖地效果,需要增大拖布与地面之间的摩擦力,此方案将吸尘口设置在驱动轮和拖布之间,利用真空吸尘产生的负压使拖布对地面的摩擦力增大,拖地效果更好。

      综上所述,对于三种方案,肯定都存在着不足之处,但都是朝着创新方向进行设计。针对家庭清洁机器人来说,相比较之下,方案三更贴近主题,更能替辛勤的人们减轻家务负担。

1.2 清洁机器人方案分析

      由于本项目的范围定位在地面清洁,对于以上三种方案进行各方面的对比与性能分析。

     方案一:吸尘是地面清洁机器人所必备的功能,安装净化装置测量空气指数,来达到净化空气的目的,它在某种意义上实现了清洁机器人的创新,但是,从地面清洁的程度来说,它简化了清洁的力度,降低了清洁效果。一个全新的清洁机器人设计,只有吸尘是不够的,所以此方案不是很完善。

      方案二:在技术方面不知如何创新时,初步的设想是选择从外观方面入手,做一个外观漂亮,功能有吸尘,有拖地的机器人。如下图所示:两个长长的触角,一对眼睛用来探测障碍物,后面像个尾巴连着拖地刷。这种方案的优点是能够很好的清洁角落,可以吸尘和拖地。缺点是触角也能影响它的清洁域,此方案结构看似简单,实际做起来很难。若想实现吸尘、拖地功能,程序会很复杂。这是一个理想化的清洁机器人,不易于实现。

带触角清洁机器人

      方案三:考虑到本项目着重突出地面清洁,能将地面清洁的越干净越好。所以设想能够吸尘和拖地,拖地更需要智能化。市场上的清洁机器人有带水箱的,由于拖布与地面的摩擦力小,但是拖地效果都一般。为了解决此方案的问题,将吸尘口布置在驱动轮与拖布之间,利用吸尘产生的真空负压增大拖布与地面的摩擦力,从而增强了拖地效果。

      水箱模块最初的设想为开放式塑料水箱,水箱需要密封,应该增加箱盖,水箱需要加水,箱盖是可开启式的。水箱需要向拖布注水,增加导管和阀门,阀门自动开启关闭,应该用电磁阀或电机驱动开闭。这种传统的思维最终结果是导致水箱结构非常复杂,难以加工且成本很高。体积较大的水箱也增加了清洁机器人的高度。

      用注射器代替水箱的方案。注射器容量大,自带密封胶圈,加水也容易,不出水时不会渗漏。但是其原本长度就比较长,当活塞拉出后长度会更长,难以安装在清洁机器人上,最终这一方案也被舍弃。

1.3 清洁机器人方案确定

      根据以上对三种方案的分析,最终选择第三种方案。由两个驱动轮组成移动机构,便于机器人更灵活的行走;机体前端和两侧安装三个红外传感器,控制机器人对障碍物、楼梯或者墙壁的检测,防止碰撞;清扫机构的旋转刷安装在驱动轮前方,由旋转刷清扫灰尘,进入吸尘口吸入垃圾箱;拖布设计在吸尘口的下端部位,且自带水箱给拖布供水,水箱设计为可以按压的微型水箱,利用四杆机构原理按压出水。此设计将吸尘口放置在驱动轮和拖布之间,利用真空吸尘产生的负压使拖布对地面的摩擦力增大,拖地效果更好。

      本次设计的清洁机器人能够实现以下几种功能:

      清扫功能:在行走过程中,由旋转刷将灰尘扫起,后置的吸尘器吸走灰尘,将灰尘放于垃圾盒中。

      拖地功能:由水箱持续往拖布上供水,依靠清洁布与地面的摩擦达到彻底清洁灰尘的效果。

      红外避障功能:在一定范围内,如果没有障碍物,发射出去的红外线,因为传播距离越远而逐渐减弱,最后消失。如果有障碍物,红外线遇到障碍物,被反射到达传感器接收头。

2. 清洁机器人机械结构

      本项目根据“探索者”机器人模块化平台,对清洁机器人进行机械结构的设计和搭建提出如下要求:

      ① 基于“探索者”套件制作,不允许损坏套件设备。具体包括不允许对零件进行胶粘、焊接、铆接、切割、打磨、钻孔、折弯等加工,只允许使用套件提供的螺丝螺母作为紧固件和受力部件,并且不允许使用螺丝胶。

      ② 能够实现扫地、吸尘、拖地功能。

      ③ 为拖布设计合适的润湿机构,能够储水且不能出现渗漏。设计一种控制机构将水均匀地润湿拖布,并且易于控制出水量。

      ④ 通过分析传统清洁机器人结构,针对拖地不干净的现象,提出解决方案并验证理论可行性。

2.1 清洁机器人移动机构

2.1.1 移动机构的设计

      地面移动机器人可采用的移动机构主要有三种形式:车轮式移动机构,履带式移动机构和腿足步行机构。清洁机器人工作环境是室内,采用轮式移动机构非常适合室内地面环境的特点,而且轮式移动机构和其它移动机构相比较,在平坦地面上移动快速灵活,控制相对简单容易。两个驱动轮是由电机驱动,可以整周旋转。

2.1.2 移动机构的电机选型

      初步估计机器人的总重量m=1kg,取g=9.8N/kg

则分配到每个轮子上的载荷为:

由电子称测出机器人吸尘时的重力约为340g,即0.34kg。机器人拖地时拖布对地面的压力为F1:

清洁机器人在优质路面上行走,取

滚动摩擦阻力:

滑动摩擦阻力:

取轮子直径为:D=65mm   d=32.5mm

则轮子在行走过程中所受的阻力矩(扭矩)为(取滑动摩擦阻力):

初步预算清洁机器人的行驶速度V=100mm/s

则车轮每转360°清洁机器人行驶的距离为:

由此可得车轮转360°的时间为:

那么车轮的转速为2s/r,即2s/360°=0.33s/60°

经过计算驱动轮的电机选择圆周舵机,它的参数如下表所示:

选此型号舵机合适。圆周舵机如下图所示:

圆周舵机

2.2 清洁机器人清扫机构

2.2.1 清扫刷的设计

      本项目所制作的清洁机器人带有清扫机构,传统机器人通常采用水平旋转刷清洁地面。考虑到制作成本、工具方面的限制,本文采用圆柱刷代替圆刷。圆柱刷使用金属主轴,刚性好,不易变形。两端采用尼龙架支承,高度可调,并且可以大大缩短制作时间。这种刷子清扫的力度大,效果佳。

      该机构利用电机直接驱动旋转刷的钢丝,在机器人运动的过程中,使旋转刷将垃圾灰尘扫入机器人机体下面,由吸尘系统收集。利用附壁效应形成低压涡流气体,将灰尘截留在吸尘盒中。

2.2.2 清扫机构的电机选型

      刷子的旋转速度只要达到3r/s就可以实现清扫目的,并把垃圾扫到吸尘口处。采用电机直接驱动旋转刷工作,选用直流电机(仅A3003)。直流电机的参数如表2即可满足要求。

电机如下图所示:

直流电机

2.3 清洁机器人的吸尘机构

2.3.1 吸尘盒的设计

      吸尘盒不但要求能够吸入灰尘,而且在断电后不能使灰尘漏出。本文采用薄壁聚乙烯方盒作为吸尘盒,内部使用挡板分隔灰尘,保证断电后不造成二次污染。如下图所示,它的优点是造价便宜,盒子透明,容易看出吸进的灰尘量。缺点是吸尘盒固定于机架,灰尘不易取出,必须通过拆卸吸尘盒来去除。

吸尘盒

2.3.2 吸尘电机的选型

      吸尘器的工作原理,是利用电动机的高速旋转带动叶轮旋转,形成真空空吸,将地面上的灰尘和杂质吸进垃圾储存箱。基本要求是转速高,工作电压低,转矩一般大小就行,噪音小,尺寸小,便于安装,适应长时间工作。叶轮采用7叶叶轮,与传统的轴流风机叶轮相比,奇数片叶轮可以有效减少共振,每只叶轮均经过动平衡处理,震动更小,吸力和转速也因此得到提升。叶轮材质为高强度铝合金,可以承受极高的转速而不发生解体。叶轮如下图所示:

综上选择SP-MD370电机,测试电压为8V,负载转速为19300rpm,最大功率为64W。符合要求,电机如下图所示:

2.4 清洁机器人的拖地机构

2.4.1 水箱的设计

      利用现有的工业成品来制作。虽然购买成品比使用原材料自己搭建更昂贵,但实际上由于工业生产的批量化,很多产品买一个新的比自己做更便宜,而且可以节省时间。这里采用微型喷水瓶作为水箱的替代部件,如下图所示:

微型水箱

      微型喷水瓶使用活塞原理,当活塞被按下时,气压将内部的液体喷出,喷雾均匀,体积小,易操作,不喷水时活塞和气压共同密封内部液体,不会渗漏。

2.4.2 水箱喷水设计

      为了实现软件控制喷水器,需要制作一套四杆机构按压喷水器。采用电机作为喷水器的控制部件,通过水箱自动喷水给拖布供水进行拖地。

      四杆机构设计:

      首先对微型水箱进行分析,从水箱的按压口开始计算,到挤压出水的距离为6mm。所以,需要设计四杆机构装置来完成喷水过程。

      根据微型水箱的高度定义,四杆机构的机架长度为40mm;曲柄的长度为12mm;另一曲柄的长度也为12mm;连杆的长度为40mm;机构的最长杆与最短杆的长度之和为40+12=52mm,其余两杆的长度之和为40+12=52mm,根据四杆机构的基本性质,最短杆和最长杆之和等于其余两杆之和,且是平行四边形为双曲柄机构。

四杆机构原理图

       此机构的旋转角度为60°就可以达到挤压水箱的有效行程,当b、d两杆旋转60°时,b、e、f为等边三角形,f为此机构的有效行程,长度为12mm,而按压的杆到水箱的挤压端的距离为4-6mm,所以此机构的有效行程完全可以达到挤压出水的目的。水箱装置实体建模如下图所示:

水箱结构

2.4.3 增大拖布对地面摩擦力的设计

      由于室内地面并不是理想的平面,车身难免会产生颠簸。而如果将拖布刚性固定在车身下部则会造成拖布前后边缘受力不均,只有一边紧贴地面,大部分面积压力不足,难以充分发挥其清洁作用。本文采用活动式压力板固定拖布,左右各一组。这种结构可以保证拖布前后左右时刻紧贴地面,发挥最佳清洁效果。

      此设计将吸尘口放置在驱动轮和拖布之间,利用真空吸尘产生的负压使拖布对地面的摩擦力增大,拖地效果更好。利用电子称来分别测出风机在旋转和静止时的重力,由此对比可得出对地面摩擦力的增大。参照图如下所示:

2.4.4 拖地机构的电机选型

      由以上介绍可知,此电机需要转动角度为±60°。在“探索者”模块化平台中,有两种标准舵机的转动角度为±90°,可供选型。

      微型水箱下压出水的力,用电子称测出重量转化而成,约为4kg=40N,由四杆机构的曲柄长度12mm可知,扭力为40×1.2=48N.cm=4.8kg.cm。标准舵机的扭力为2.4kg.cm<4.8kg.cm。不能达到要求。

      因此,拖地机构选用“探索者”大标准伺服电机驱动四杆机构挤压水箱给拖布供水,它的参数如表3所示。扭力12.2kg.cm>4.8kg.cm,符合要求。

2.5 机构三维建模

      本设计应用目前比较广泛且好用的Solidworks软件对清洁机器人的模型进行建模。对于Solidworks软件,它有很强大的功能,比如:曲面的结构,异型向导孔的生成,标准件的导出,工程图的生成,还有模拟仿真等等。它可以通过草图完成大部分设计,建模是也相对简单,对于模型的修改也较方便,只要进草图修改尺寸,模型就会随着尺寸的改变而改变,装配体也会随着单个模型的改变跟着改变。清洁机器人的三维建模图形如下所示:

清洁机器人装配体

3. 清洁机器人控制系统设计

     本项目的控制系统平台采用STC系列单片机,它拥有15个输出口,256个字节内存。STC系列单片机自带复位,不需要外部复位电路,兼容5V电源,可以通过USB或移动电源供电,不需要外部供电模块。只需四根线,两个电容,一个12MHz晶振即可工作。

3.1 控制系统硬件设计

     清洁机器人硬件结构主要由以下几部分组成:控制器(单片机)、电机驱动器、环境监测装置与电源模块等,这几个模块在单片机的控制下,相互协调工作,保证了清洁机器人各种功能的实现,模块间关系具体如下图所示:

清洁机器人硬件系统结构框图

   各模块主要组成与功能叙述如下:

      ① 控制器(单片机):主要由单片机STC12C4052AD组成,它的主要功能是完成主控程序与其他各模块的接口,是程序运行的载体并实现对整个机器人的控制。

      ② 电机驱动器:主要由驱动电机驱动器、旋转刷电机驱动器、水箱喷水电机驱动器和吸尘电机驱动器组成,其中驱动电机驱动左右行走轮从而带动清洁机器人运动,旋转刷电机和吸尘电机负责清扫吸尘工作,水箱喷水驱动电机负责拖地工作。

      ③ 环境检测装置:由传感器组成,表示机器人对外界环境的判断。

3.1.1 移动装置

      行驶模块由2个圆周舵机组成,圆周舵机采用PWM信号驱动。通过高电平时长表示输出信号。这种方式可以保证输出信号不受电压波动的干扰。在程序中,只要设置单片机I/O口的电平状态与对应的延时时间即可使用单片机控制舵机。

      如下图所示,当高电平时长为1.5ms时,标准舵机处于中立位置,圆周舵机停止转动,当高电平时长为1ms时,标准舵机正转45度,圆周舵机正转。当高电平时长为2ms时,标准舵机反转45度,圆周舵机反转。

驱动信号时序图

      然而,普通单片机I/O口的输出电流强度并不高,即使作为控制信号,也很难被舵机识别。传统方法是使用三极管对信号进行放大,但在面包板上这将会大大增加连线复杂程度。推挽输出是用两个晶体管或者场效应管构成的推挽电路,这个电路的特点就是输出电阻小,能够驱动大的负载,从而能够使得单片机管脚直接输出舵机驱动信号,无需使用三极管进行放大。如下图所示:

推挽输出对比图

      单片机同一时间只能运行一个程序,利用分时驱动方式同时驱动两个舵机并调节转速,即先给左轮发出信号,再给右轮发出信号,同一时间只驱动一只舵机。由于舵机齿轮具有惯性且信号周期只有20ms,这种驱动方式并不影响正常行驶,是完全可行的。

3.1.2 清洁装置

      清洁部分分为清扫、吸尘和拖地。清扫和吸尘时使用的是直流电机驱动,拖地时给拖布供水的喷水系统使用的是大标准舵机驱动。

      直流电机通过接直流电工作,如果需要调速,可以利用单片机产生高频PWM信号,改变占空比进行调速。该单片机支持2路PWM输出,只需要外接2个三极管即可。喷水系统使用的是大标准舵机。大标准舵机可以调节角度。由于喷水器需要反复按压,因此可以用一个简单的循环程序进行驱动,程序每执行一次,舵机正转60°再反转60°,完成一次按压。

3.1.3 环境检测装置

      清洁机器人在工作时,需要对外界环境进行检测,当遇到墙壁或障碍物时,能够及时避开并进入正常工作状态[17,18],因此本课题选用“探索者”模块化平台中的近红外线传感器。近红外接收端前方5cm以内有障碍物时触发,可用于避障、跟随等。近红外传感器可以发射并接收反射的红外信号,有效检测范围在20cm以内。工作电压:4.7~5.5V,工作电流:1.2mA,频率38KHZ。

      ① 固定孔,便于用螺丝将模块固定于机器人上。

      ② 四芯输入线接口,连接四芯输入线。

      ③ 近红外信号发射头,用于发射红外信号。

      ④ 近红外信号接收头,用于接收反射的红外信号。

近红外传感器

      清洁机器人需要三个近红外传感器,三个红外传感器分别分布在旋转刷的前方,用来检测前方的障碍物;左右驱动轮旁边各一个,用来检测左右两侧的障碍物,分布图如下图所示,在安装近红外传感器时,不能遮挡发射和接收头,以免传感器检测发生偏差。红外线传感器自身有四个接口,其中两个为电源接口,另外两个接口是识别有无障碍的情况。经过测试,连接电源后,当遇到障碍物时输出低电平的那个接口,便是能够检测到障碍物的接口。

3.1.4清洁机器人总电路图

3.2 控制系统程序设计

      清扫机器人作为一种家庭服务机器人,关键的问题在于机器人本身是否实用,也就是说是否能有效清扫房间,清洁机器人在工作时,不是杂乱无章的行走,它需要有计划有规律的进行清洁。因此,需要从机器人的实用性强、可靠性高,成本低等角度,设计一种机器人路径规划算法。

3.2.1 路径规划概述

      路径规划技术是智能机器人领域中的核心问题之一,移动机器人的路径规划就是要给定机器人及其工作环境信息,按照某种优化指标,在起始点和目标点之间规划出一条与环境障碍物无碰撞的路径。对移动机器人的路径规划系统主要要求是:

      ① 在环境地图中寻找移动路径,保证机器人沿该路径移动时不与外界发生碰撞。

      ② 能够处理用传感器感知的环境模型环境中的不确定因素和路径规划执行中出现的误差。

      ③ 通过使机器人避开外界物体而使其对机器人传感器感知范围的影响降到最小。

      ④ 能够按照需要找到最优路径。

3.2.2 路径规划的几种方式

      对于使用单片机控制的清洁机器人来说,很多算法需要占用较大的内存空间,这些要求都过于苛刻。对应清洁机器人自身与工作环境的特点,有四种比较实用的路径规划算法:内螺旋式、往复式、椭圆式、随机式等,如下所示:

内螺旋算法

      内螺旋算法,是让移动机器人沿着墙边移动,然后进行内收缩式的清扫。在移动过程中,可以不断根据与墙边的距离调整所走的方向,这样对于在移动中自身坐标不是很确定的机器人来说,可以辅助周边的事物对其当前的位置进行调整。

往复式算法

      往复式算法或称犁田式算法,可以说是让机器人按“弓”字形方式行走。机器人选择房间的一角,开始来回往返的“犁田式”清扫。往复式清扫有两个基本行为组成,直线行走和转弯。往复式清扫在矩形无障碍物的房间内能很好的工作,通过往复式覆盖,清洁机器人基本能覆盖整个房间,当出现障碍物时,障碍物的另一侧将无法覆盖,就必须有进一步的行为来弥补。

椭圆式覆盖算法

      椭圆式覆盖,机器人由某一点开始沿着椭圆渐开线式轨迹由内向外逐渐扩大。遇到障碍物后,进行避障处理,然后重新选择一点开始椭圆式行走。由于是曲线运动,控制上较难,只能进行初步原理性的探索,进行开环控制。

随机式覆盖算法

      随机式覆盖,就是机器人在工作范围内随机选择方向运动,这就是最简便的一种方法,机器人一直前行,遇到障碍物后就随机改变一个方向继续前行,随机式运动的缺点是覆盖率太低。传统扫地机器人采用避障式算法,通过遇到障碍后随机改变路线实现对室内面积的覆盖。这种方法控制原理简单,但覆盖率差,消耗时间长;少数清洁机器人会采用激光雷达扫描室内障碍物的距离,并使用栅格法自动生成地图,在理论上如果地图分辨率越高,即网格数越多,清洁覆盖率越趋近于100%。然而由于激光雷达传感器十分昂贵,这种清洁机器人的性价比和销售量远不如普通清洁机器人。实际使用中,由于机器人的外形尺寸是固定的,平均尺寸为25cm×30cm即使栅格精度达到1cm每格,由于外形不能缩小,所以仍然难以清洁彻底。

3.2.3 往复式路径规划算法

      由于单片机内部只有256字节RAM空间,无法存储庞大的数组组成栅格并随时对地图中的栅格进行修改,难以进行栅格法路径规划,因此也无法实现以上介绍的内螺旋式路径规划算法。即使通过优化程序勉强存储较小的栅格,由于栅格尺寸大,分辨率差,实际清洁效率反而不如传统方法。因此适用于单片机的路径规划方法既要比传统的避障式算法效率更高,又要能够在单片机中顺利运行。本课题使用往复式路径规划算法。

      由于充电点的位置通常位于房间的角落,这给往复式路径规划算法带来了很大的便利,不但可以使坐标系相对固定,还可以校准起始方向,保证路径的直线度。这种算法的优势在于只需要执行固定的循环程序,就可以对复杂的区域循环清扫。行间距很小,分辨率高。即使房间不是标准的矩形也可以顺利清扫。循环清扫在第一次碰到障碍时需要向右掉头,第二次碰到障碍时需要向左掉头。正是这种特性可以使机器人对地面逐行清扫。

      可是如何执行固定的程序使掉头方向则成了编程的主要难点。另外,由于单片机同一时间只能执行一条程序,不能同时做两件事。如何一边给舵机发送驱动信号让机器人前进,一边检测传感器状态也成了问题。由于控制方式为开环控制,如何确保机器人转动角度刚好为90°也是问题。由于实现这一功能的方法不唯一。本文使用了比较简单的一种,即程序嵌套。也就是将一次右转和一次左转作为一个大循环。当右转结束后,程序循环并未结束,而是进入下一个判断循环,边行驶边检测障碍,当第二次检测到障碍后,机器人向左掉头,才完成一次大循环。

      为了实现边行驶边判断传感器状态,本文采用分时处理的方法实现该功能。分时处理可以让舵机驱动程序与传感器判断程序交替执行。由于舵机驱动程序周期为20毫秒,判断指令耗时小于2微秒,交替执行造成的轻微时间误差完全可以被忽略,不会对行驶造成影响。

往复式路径规划的程序流程图如下所示:

往复式路径规划程序流程图

      为了实现一边行驶一边检测,使用while循环而非if判断进行检测,这样才能不断循环检测。在每一个循环中,舵机信号占用40ms,判断语句占用时间小于2ms。虽然先前进再判断会对控制信号有影响,但由于影响非常小,可以忽略不计。当信号消失后,再发出固定的脉冲个数使机器人转动到90度。例如用Keil编译软件编译的如下程序:

While (DT == 0) {

  RIGHT (1);   //一边右转 一边判断左红外

  if(IR1 == 1){   //无障碍灭灯

       RIGHT (15);      //灭灯后第二次右转 调整数据使之为90度

PENSHUI ();

PENSHUI ();

DT = 1;

}

  }

3.3 本章小结

      在本章中,主要有控制系统硬件设计和程序设计两个部分,硬件设计主要是电机驱动、环境检测等装置设计,程序部分则是对清洁机器人路径规划的研究,利用Keil编译软件编程来实现路径规划的算法,如下图所示:

清洁机器人控制系统搭建

更多详情请见:【S046】清洁机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【KingbaseES】实现MySql函数Field

CREATE OR REPLACE FUNCTION field(value TEXT, VARIADIC arr TEXT[]) RETURNS INT AS $$ DECLAREi INT; BEGINFOR i IN 1 .. array_length(arr, 1) LOOPIF arr[i] value THENRETURN i;END IF;END LOOP;RETURN 0; END; $$ LANGUAGE plpgsql IMMUTABLE;

Qt6学习笔记:对象树

使用QObject及其子类创建的对象是以对象树的形式来组织的。创建一个QObject对象时若设置一个父对象&#xff0c;它就会被添加到父对象的子对象列表里&#xff0c;一个父对象被删除时&#xff0c;其全部的子对象都会自动删除。QObject类的构造函数里有一个参数用于设置对象的父对…

报表控件Stimulsoft 2023回顾:都做了哪些产品的改变?

在2023年过去一年中&#xff0c;报表控件Stimulsoft 针各类控件都做了重大改变&#xff0c;其中新增了某些产品、同时加强了很多产品的性能和UI设计&#xff0c;更加符合开发者需求&#xff0c;下面就跟随小编一起来回顾&#xff0c;具体都有哪些↓↓↓ Stimulsoft Ultimate &…

HTTP打怪升级之路

新手村 上个世纪80年代末&#xff0c;有一天&#xff0c;Tim Berners-Lee正在工作&#xff0c;他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件&#xff0c;但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到&#xff0c;他需要一种新的协议来共享二进制…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

【萤火虫系列教程】1/5-Adobe Firefly 注册账号

001-Adobe Firefly 注册账号 AI时代如火如荼&#xff0c;Adobe也不甘落后&#xff0c;于今年3月份发布AI创意生成工具Firefly&#xff08;中文翻译&#xff1a;萤火虫&#xff09; Adobe Firefly简介 Adobe Firefly的官方介绍为&#xff1a;Firefly是Adobe产品中新的创意生成…

在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置 题目解法一解法二&#xff08;二分查找&#xff09;代码展示原理剖析 题目 在排序数组中查找元素的第一个和最后一个位置 解法一 class Solution { public:vector<int> searchRange(vector<int>& nums, int targ…

CentOs搭建Kafka集群

Centos7搭建Kafka集群 一、集群规划二、环境准备三、安装kafka集群1、下载kafka安装包2、解压3、配置环境变量4、编辑配置文件①修改broker.id②配置kafka运行日志路径③配置Zookeeper集群地址 5、启动集群6、测试kafka①、创建topic②、查看当前服务器中的所有topic③、生产者…

Springcloud 微服务实战笔记 Zuul

优点 解决路由规则与服务实例维护问题。对于类似签名校验、登录校验在微服务架构中的冗余问题。 入门使用 构建网关 pom.xml引入 spring-cloud-starter-netflix-zuul <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-c…

苹果Vision Pro将于1月27日上市!

在无数期待中&#xff0c;苹果全新产品Vision Pro头显终于定下上市日期。 彭博社记者马克古曼&#xff08;Mark Gurman&#xff09;于近日在X&#xff08;前推特&#xff09;平台爆料了这一信息&#xff0c;预计苹果Vision Pro头显将于2024年1月27日率先在美国上市。 在过去看…

LeetCode 641. 设计循环双端队列

难度&#xff1a;Medium 641. 设计循环双端队列 设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。boolean insertFront()&#xff1a;将一个元素添加到双端队列头部。 如果操作成功返回 true &#xff0c;否…

Java CPU或内存使用率过高问题定位教程

简介 Spring cloud微服务广泛应用后&#xff0c;服务的监控和运维压力也与日俱增&#xff0c;经常有服务出现CPU或者内存使用率过高的告警&#xff0c;那么遇到这样的问题我们该如何排查呢&#xff1f;我们可以借助哪些工具来定位问题呢&#xff1f;本文将介绍一下遇到此类问题…

案例精选|淄博绿能燃气工程有限公司日志审计系统建设方案

淄博绿能燃气工程有限公司&#xff0c;成立于1994年&#xff0c;前身为淄博市煤气公司管道液化气分公司。公司业务主要涉及天然气、液化气等市政工程施工及城镇燃气供应等领域&#xff0c;具有市政公用工程施工总承包二级资质&#xff0c;《压力管道安装许可证》压力管道安装GB…

亚信安慧AntDB数据库:数字化时代的数据库创新引领者

AntDB数据库以其卓越的创新能力&#xff0c;集中体现在融合统一与实时处理两大关键领域。作为一款服务全国超过10亿用户的分布式数据库&#xff0c;其独特之处在于长期积累的经验、多样性的支持能力、快速响应的数据处理速度以及卓越的系统稳定性。AntDB不仅仅是一个数据库系统…

Node.js+Express+Mysql实现分页查询

接收请求代码 router.get(/api/user/page, async (req, res) > {let pageNo req.query.pageNo;let pageSize req.query.pageSize;const startIndex (pageNo - 1) * pageSize;const queryString SELECT * FROM sys_user LIMIT ${startIndex}, ${pageSize};data await …

【React系列】父子组件通信—props属性传值

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识组件的嵌套 组件之间存在嵌套关系&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&…

Netty实战(待完善)

Netty组件 1. Bootstrap, ServerBootstrap Netty 中 Bootstrap 类是客户端程序的启动引导类&#xff0c;ServerBootstrap 是服务端启动引导类。 2. NioEventLoop, NioEventLoopGroup NioEventLoop 中维护了一个线程和任务队列&#xff0c;支持异步提交执行任务&#xff0c;…

小梅哥Xilinx FPGA学习笔记20——无源蜂鸣器驱动设计与验证(音乐发生器设计)

目录 一&#xff1a;章节导读 二&#xff1a;无源蜂鸣器驱动原理 三&#xff1a;PWM 发生器模块设计 3.1 PWM 发生器模块框图 3.2 PWM 发生器模块接口功能描述 3.3 PWM波生成设计文件代码 3.4 测试仿真文件 3.5 测试仿真结果 3.6 板级调试与验证之顶层文件设计 四&am…

neo4j图数据库安装和测试

neo4j图数据库安装和测试 1. 下载合适的neo4j软件版本。 https://we-yun.com/doc/neo4j/ https://neo4j.com/deployment-center/#enterprise 2. 下载JAVAJDK 由于neo4j是一个用Java编写的图形数据库&#xff0c;因此在安装和运行Neo4j之前&#xff0c;需要先安装Java Developm…

【shell漫步】1 变量定义和使用

碎碎念 转眼间已经使用了一个月的shell了&#xff0c;作为一个纯小白&#xff0c;我特别理解刚入门的时候对于linux和shell一头雾水的状态&#xff0c;尤其是打算开始学&#xff0c;但是又找不到学习的“入口函数”的那种感受。所以打算整理一下shell的骨架。shell给我的感触就…