基于视觉识别的自动采摘机器人设计与实现
一、前言
1.1 项目介绍
【1】项目功能介绍
随着科技的进步和农业现代化的发展,农业生产效率与质量的提升成为重要的研究对象。其中,果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下,而且在劳动力成本逐渐上升的背景下,越来越难以满足大规模种植基地的需求。人工采摘还可能因不规范的操作导致果实损伤,影响商品果率。
基于视觉识别技术的自动采摘机器人的研发,正是针对这一问题提出的创新解决方案。本项目采用树莓派4B作为主控芯片,因其具有强大的计算能力和丰富的扩展接口,可以方便地集成各种传感器和执行机构,实现对复杂环境下的实时图像采集与处理。
项目利用百度飞浆(PaddlePaddle)深度学习框架中的目标检测和分类算法,通过安装在机器人上的高清摄像头获取果树图像,并进行实时分析,精准识别出果实的位置、大小以及成熟度等信息。当成功识别到目标果实后,主控系统将根据识别结果快速计算出机械手臂的最佳运动路径,控制其移动至指定位置,以最适宜的方式完成果实的高效、无损采摘。
基于视觉识别的自动采摘机器人设计与实现项目旨在解决传统农业中人工采摘的瓶颈问题,通过人工智能与自动化技术的深度融合,提高果园管理的智能化水平,降低劳动成本,提高生产效率,从而推动我国乃至全球农业产业向更加智能、高效的现代农业转型。



【2】设计实现的功能
(1)视觉识别:借助高性能的摄像头和图像处理算法(本项目采用百度飞浆的目标识别和分类算法),机器人能够捕捉到果园中的果实图像,并准确地从中识别出目标果实。
(2)定位与导航:在识别到果实后,系统会通过计算果实的空间坐标和距离,确定机械手臂需要到达的精确位置。同时,机器人会根据果园内的环境信息和路径规划算法,自动导航至目标果实附近。
(3)机械手臂控制:一旦机器人到达目标位置,机械手臂会在系统的精确控制下,自动调整姿态和动作,以轻柔而准确的方式采摘果实。这一过程涉及到复杂的机械动力学和协同控制算法,确保采摘动作的高效和安全。
(4)果实收集与处理:采摘下来的果实会被机器人收集到专门的容器中,以便后续的分拣、包装和处理。系统还可以对采摘的果实进行数量统计和质量评估,为农业生产提供有价值的数据支持。
本项目实现的功能是一个完整的自动采摘机器人系统,从视觉识别到机械手臂控制,再到果实收集与处理,形成了一个高效、智能的自动化采摘流程。这不仅大大提高了农业生产的效率和质量,也展示了人工智能技术在现代农业领域的广阔应用前景。
【3】项目硬件模块组成
(1)主控板:采用树莓派4B开发板作为整个系统的主控芯片。树莓派是一款功能强大且易于使用的计算机主板,具备高性能的处理器、充足的内存和存储空间,以及丰富的接口和扩展功能,可以满足本项目对计算和控制的需求。
(2)视觉系统:视觉系统包括高性能的摄像头和图像处理单元。摄像头负责捕捉果园中的图像信息,而图像处理单元则基于百度飞浆的目标识别和分类算法,对图像进行处理和分析,以识别和定位目标果实。
(3)机械手臂:机械手臂是实现自动采摘的关键部件,由多个关节和执行器组成,可以在三维空间内自由移动和旋转。通过精确的控制算法,机械手臂能够准确地到达目标果实的位置,并执行采摘动作。
(4)传感器和导航系统:为了实现自动导航和精确定位,项目中还集成了多种传感器和导航系统。这些传感器可以感知环境信息,如距离、方位、障碍物等,而导航系统则根据这些信息规划出机器人的最佳路径。
(4)电源和供电系统:为了保证机器人的持续工作,项目中还包括了电源和供电系统。电源负责为各个硬件模块提供稳定的电力供应,而供电系统则可以根据实际需要调整电力输出,以满足机器人在不同工作状态下的能耗需求。
本项目的硬件模块组成包括主控板、视觉系统、机械手臂、传感器和导航系统、电源和供电系统以及其他辅助模块。这些硬件模块相互协作,共同实现了基于视觉识别的自动采摘机器人系统的功能。
【3】功能总结
系统集成了先进的视觉识别技术、机械手臂控制技术以及自动导航技术,能够自动识别和定位果园中的目标果实,并通过机械手臂完成采摘动作。整个过程无需人工干预,实现了果园采摘的自动化和智能化。
功能包括果实的自动识别和定位、机械手臂的自动导航和控制以及果实的自动收集和处理。通过高性能的摄像头和图像处理算法,系统能够准确捕捉和识别目标果实的图像信息;借助精确的导航和控制算法,机械手臂能够自动导航至果实位置并完成采摘;最后,采摘下来的果实会被自动收集并进行后续处理。
本项目的功能实现不仅提高了果园采摘的效率和准确性,降低了人力成本,同时也为农业生产的现代化和智能化发展提供了新的解决方案和思路。该系统的成功应用将为农业生产带来革命性的变革,推动农业向更高效、更环保、更可持续的方向发展。
1.2 设计思路
(1)需求分析:对果园采摘的实际需求进行分析,明确项目需要解决的问题和达到的目标。了解果园的环境特点、果实类型和生长状况,以及采摘作业的流程和要求,为后续设计提供基础依据。
(2)技术选型:根据需求分析的结果,选择合适的技术方案。选用树莓派4B开发板作为主控芯片,利用其高性能的处理器和丰富的接口资源,实现机器人的控制和管理。同时,采用百度飞浆的目标识别和分类算法,通过视觉系统实现对目标果实的准确识别和定位。
(3)硬件设计:根据技术选型,设计机器人的硬件结构。包括摄像头的选型和布局,确保能够捕捉到清晰、稳定的图像信息;机械手臂的设计和选型,使其能够适应果园环境和采摘需求;导航和传感器系统的设计和选型,实现机器人的自动导航和精确定位。
(4)软件设计:编写机器人的控制程序和算法。通过图像处理算法实现对目标果实的识别和定位,将结果传递给导航和控制系统;根据导航和传感器系统提供的信息,规划机器人的运动路径和动作,控制机械手臂完成采摘动作;实现果实的计数、分类和收集等功能,以及数据的存储和传输。
(5)系统集成与测试:将各个硬件模块和软件程序进行集成,并进行系统测试和调试。确保各个模块之间的通信和协作正常,机器人能够准确识别和采摘目标果实,并实现自动导航和收集等功能。
1.3 系统功能总结
| 功能模块 | 功能描述 |
|---|---|
| 视觉识别 | - 通过高性能摄像头捕捉果园图像 |
| - 利用百度飞浆的目标识别和分类算法,识别目标果实 | |
| - 确定果实的空间坐标和距离 | |
| 导航与定位 | - 根据果园环境信息和路径规划算法,自动导航至目标果实附近 |
| - 集成多种传感器,感知环境信息,如距离、方位、障碍物等 | |
| 机械手臂控制 | - 在系统精确控制下,自动调整姿态和动作,采摘果实 |
| - 确保采摘动作的高效和安全 | |
| 果实收集与处理 | - 采摘下来的果实被自动收集到专门容器中 |
| - 对采摘的果实进行数量统计和质量评估 | |
| - 提供数据支持,为农业生产决策提供参考 | |
| 通信与监控 | - 实现远程监控和控制功能 |
二、树莓派4B环境搭建
【1】硬件环境介绍
树莓派是什么?Raspberry Pi(中文名为“树莓派”,简写为RPi,或者RasPi/RPi)是为学生计算机编程教育而设计,只有信用卡大小的卡片式电脑,其系统基于Linux。

【2】资料下载
第一步,先将树莓派4B需要使用的资料下载下来。

【3】准备需要的配件
(1)准备一张至少32G的TFT卡,用来烧写系统。
(2)准备一个读卡器,方便插入TFT卡,好方便插入到电脑上拷贝系统
(3)树莓派主板一个
(4)一根网线(方便插路由器上与树莓派连接)
(5)一根type-C的电源线。用自己Android手机的数据线就行,拿手机充电器供电。



【4】准备烧写系统
(1)安装镜像烧写工具


(2)格式化SD卡
将TFT卡通过读卡器插入到电脑上,将TFT卡格式化。


(3)烧写系统
**接下来准备烧写的系统是这一个系统:**将系统解压出来。

然后打开刚才安装好的镜像烧写工具,在软件中选择需要安装的 img(镜像)文件,“Device”下选择SD的盘符,然后选择“Write”,然后就开始安装系统了,根据你的SD速度,安装过程有快有慢。
注意:从网盘下载下来的镜像如果没有解压就先解压,释放出img文件。

下面是烧写的流程:

点击YES,开始烧写。

烧写过程中:

安装结束后会弹出完成对话框,说明安装就完成了,如果不成功,需要关闭防火墙一类的软件,重新插入SD进行安装。

需要注意的是,安装完,windows系统下看到SD只有74MB了,这是正常现象,因为linux下的磁盘分区win下是看不到的。 烧录成功后windows系统可能会因为无法识别分区而提示格式化分区,此时**千万不要格式化!不要格式化!不要格式化!**点击取消,然后弹出内存卡,插入到树莓派上。

至此,树莓派烧写成功。
【5】启动系统
(1)树莓派供电
由于我买的树莓派开发板不带电源线,就采用Android手机的充电线供电。 使用Type-C供电时,要求电源头的参数要求,电压是5V,电流是3A。
我的充电器是小米的120W有线快充,刚好满足要求。


(2)启动树莓派(以Type-C供电示例)
烧写完后把MicroSD卡直接插入树莓派的MicroSD卡插槽,如果有显示器就连接显示器,有DHMI线机也可以连接外接的显示器,有鼠标、键盘都可以插上去,就可以进入树莓派系统了。
但是,我这块板子就一个主板,什么都没有。就拿网线将树莓派的网口与路由器连接。

上电之后,开发板的指示灯会闪烁,说明已经启动。
(3)查看开发板的IP地址
现在板子没屏幕,想要连接板子,只能通过SSH远程登录的方式,当前烧写的这个系统默认开机就启动了SSH,所以只要知道开发板的IP地址就可以远程登录进去。
**如何知道树莓派板子的IP地址?**方法很多,最简单是直接登录路由器的后台界面查看连接进入的设备。
我使用的小米路由器,登录后台,看到了树莓派的IP地址。

(4)SSH方式登录开发板
当前烧写系统的登录账号和密码如下:
账号:pi 密码:yahboom
打开SSH远程登录工具:PuTTY_0.67.0.0.exe。

输入IP地址和端口号,点击open。

然后输入账号和密码。

输入用户名 pi按下回车,然后再输入密码 yahboom。 注意:Linux下为了保护隐私,输入密码是不可见的,你只需要正常输入,按下回车键确定 即可。
正常情况下,就登录成功了。

接下来看看联网情况。 ping一下百度测试互联网是否畅通,因为接下来要在线安装软件包。
ping www.baidu.com

可以看到网络没有问题。
提示: 按下 Ctrl + C 可以终止命令行。 这算是Linux基础。
【6】windows远程登录桌面
为了方便图形化方式开发,可以使用windows系统通过远程桌面登录树莓派,就可以看到界面了,不过需要先安装工具。
(1)安装xdrp
在树莓派的命令行终端输入命令:
sudo apt-get install xrdp
按下回车之后,会弹出确认窗口。输入 y之后,按下回车,继续安装。

安装完毕:

(2)打开windows远程桌面
在windows电脑上打开运行命令的窗口,输入mstsc来打开远程桌面。

打开远程桌面的窗口:

(3)连接树莓派远程桌面
打开远程桌面后,输入树莓派开发板的IP地址,点击连接。

如果弹出窗口,就选择是。

接下来就进入到树莓派开发板的远程桌面的登录窗口了。

接下来输入面账号和密码。
账号:pi 密码:yahboom
输入后点击OK按钮登录。

正常情况下,就顺利的进入树莓派的桌面了。接下来就可以进行远程桌面开发了。

【7】扩展树莓派SD卡可用空间
树莓派系统默认启动时,树莓派默认没有把整个存储空间拓展到整张卡中,如果需要使用整个SD卡,这时候可以通过人为的把存储空间拓展到整张卡上。
(1)查看内存使用情况
打开命令行终端,输入df -h 命令。

(2)扩展内存
<1> 打开树莓派命令行终端输入:
pi@raspberrypi:~ $ sudo raspi-config
<2> 在弹出的命令行里选择Advanced Options

<3> 选择第一个选项。

<4> 点击确定

<5> 点击右边的Finish按钮保存退出。
确定之后,关闭界面,系统会自动重启,重启之后,使用df命令查看是否扩展成功(我这里插的是32G的SD卡)。
可以看到,我的系统已经扩展成功了,目前可以内存空间是19G。

【8】树莓派连接WIFI
(1)配置需要连接的WIFI
点击右上角的数据连接图标,打开WIFI列表,点击想要的WIFI进行连接。

输入密码:

连接成功后的效果:

(2)通过WIFI的IP地址登录远程桌面
在路由器的后台可以看到,目前树莓派连入了两个IP地址。接下来把网线拔掉,使用WIFI无线也可以直接连接无线桌面,这样就不用插网线了。

账号和密码:
账号:pi 密码:yahboom
三、代码设计
3.1 舵机控制代码(机械手臂控制)
C语言代码: 使用wiringPi库控制树莓派上的GPIO引脚,实现对舵机的控制。通过servo_rotate()函数可以控制舵机旋转到指定的角度。在main()函数中,使用键盘输入获取目标角度,并调用servo_rotate()函数控制舵机旋转到目标角度。
舵机的控制方式为PWM脉冲宽度调制,即将角度转换为脉宽值并输出对应的高低电平信号。将舵机信号线连接到GPIO18引脚,通过digitalWrite()函数输出高低电平来控制舵机旋转。
#include <wiringPi.h>
#include <stdio.h>#define SERVO_PIN 18 // SG90舵机信号线连接的GPIO引脚void servo_rotate(int angle) {int pulse_width = (angle * 11) + 500; // 将角度转换为脉宽值digitalWrite(SERVO_PIN, HIGH); // 输出高电平delayMicroseconds(pulse_width); // 延时脉宽值对应的时间digitalWrite(SERVO_PIN, LOW); // 输出低电平delay(20 - pulse_width / 1000); // 延时剩余时间
}int main(void) {wiringPiSetupGpio(); // 初始化wiringPi库pinMode(SERVO_PIN, OUTPUT); // 将舵机信号线接口设为输出模式while(1) {// 从键盘输入目标角度printf("Enter the angle to rotate (0-180): ");fflush(stdout);int angle;scanf("%d", &angle);// 旋转到目标角度if(angle >= 0 && angle <= 180) {servo_rotate(angle);} else {printf("Invalid angle! Please enter an angle between 0 and 180.\n");}}return 0;
}
Pyhon代码: 使用RPi.GPIO库来控制树莓派上的GPIO引脚,实现对舵机的控制。通过setup()函数进行初始化设置,并通过set_angle()函数控制舵机旋转到指定的角度。
在main()函数中,使用键盘输入获取目标角度,并调用set_angle()函数控制舵机旋转到目标角度。
import RPi.GPIO as GPIO
import timeSERVO_PIN = 18 # SG90舵机信号线连接的GPIO引脚def setup():GPIO.setmode(GPIO.BCM)GPIO.setup(SERVO_PIN, GPIO.OUT)global servo_pwmservo_pwm = GPIO.PWM(SERVO_PIN, 50) # 创建PWM对象,频率设置为50Hzservo_pwm.start(0) # 启动PWM输出,初始占空比设为0def set_angle(angle):duty_cycle = (angle / 18) + 2.5 # 将角度转换为占空比值servo_pwm.ChangeDutyCycle(duty_cycle)time.sleep(0.3) # 等待舵机转到指定角度def main():setup()while True:# 从键盘输入目标角度angle = int(input("Enter the angle to rotate (0-180): "))# 旋转到目标角度if 0 <= angle <= 180:set_angle(angle)else:print("Invalid angle! Please enter an angle between 0 and 180.")if __name__ == '__main__':try:main()finally:servo_pwm.stop() # 停止PWM输出GPIO.cleanup() # 清理GPIO资源
3.2 调用算法识别目标
(1)安装PaddlePaddle和PaddleDetection库:
-
先安装Python和pip。然后,打开终端并执行以下命令安装PaddlePaddle和PaddleDetection库:
pip install paddlepaddle paddlepaddle-gpu pip install paddlehub pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
(2)下载预训练模型:
- 百度飞桨提供了预训练的目标检测模型,可以从PaddleDetection的GitHub页面下载这些模型。选择适合的任务的模型,并将其解压到合适的目录中。
(3)编写调用代码:
-
创建一个Python脚本文件,例如
detect_fruits.py,并使用以下代码编写脚本:import paddlehub as hub import cv2def detect_fruits(image_path, model_path):# 加载模型module = hub.Module(name='yolov3_mobilenet_v1_coco2017')input_dict = {'image': [image_path]}# 目标检测results = module.object_detection(data=input_dict)# 处理结果for result in results:if len(result['data']) > 0:for obj in result['data']:label = obj['label']confidence = obj['confidence']left, top, right, bottom = obj['left'], obj['top'], obj['right'], obj['bottom']print(f"Label: {label}, Confidence: {confidence:.2f}")print(f"Bounding Box: ({left}, {top}), ({right}, {bottom})")# 可视化结果img = cv2.imread(image_path)for result in results:module.visualize(data=result, output_dir='output', score_thresh=0.5, use_visualize=True, visualization=True, plot_bbox=True, save_bbox_txt=True, image=img)if __name__ == '__main__':image_path = 'path/to/your/image.jpg' # 替换为你的图片路径model_path = 'path/to/your/model' # 替换为你的模型路径detect_fruits(image_path, model_path)在上面的代码中,使用PaddleHub库加载了预训练的
yolov3_mobilenet_v1_coco2017模型,并将其应用于指定的图像。然后,处理检测结果并进行输出。最后,使用OpenCV库可视化结果并保存到指定目录中。
(4)运行脚本:
-
将目标果实图像放置在与脚本相同的目录下(或根据需要修改图像路径)。然后,在终端中执行以下命令运行脚本:
python detect_fruits.py
脚本将分析图像并输出检测到的目标果实的标签、置信度和边界框。会生成一个带有目标果实标注的图像。
3.3 机器人小车控制代码
小车的电机驱动采用L298N模块,连接在GPIO17、GPIO18、GPIO27和GPIO22上。 使用了wiringPi库来控制树莓派上的GPIO引脚,实现对小车电机驱动的控制。通过setup()函数进行初始化设置,并通过forward()、backward()、turn_left()和turn_right()函数控制小车前进、后退和转弯。其中,stop()函数用于停止小车运动。
#include <wiringPi.h>#define MOTOR_ENA_PIN 0 // L298N模块ENA引脚连接的GPIO引脚
#define MOTOR_ENB_PIN 2 // L298N模块ENB引脚连接的GPIO引脚
#define MOTOR_IN1_PIN 3 // L298N模块IN1引脚连接的GPIO引脚
#define MOTOR_IN2_PIN 4 // L298N模块IN2引脚连接的GPIO引脚
#define MOTOR_IN3_PIN 5 // L298N模块IN3引脚连接的GPIO引脚
#define MOTOR_IN4_PIN 6 // L298N模块IN4引脚连接的GPIO引脚void setup() {wiringPiSetup(); // 初始化wiringPi库pinMode(MOTOR_ENA_PIN, OUTPUT);pinMode(MOTOR_ENB_PIN, OUTPUT);pinMode(MOTOR_IN1_PIN, OUTPUT);pinMode(MOTOR_IN2_PIN, OUTPUT);pinMode(MOTOR_IN3_PIN, OUTPUT);pinMode(MOTOR_IN4_PIN, OUTPUT);
}void forward() {digitalWrite(MOTOR_IN1_PIN, HIGH);digitalWrite(MOTOR_IN2_PIN, LOW);digitalWrite(MOTOR_IN3_PIN, LOW);digitalWrite(MOTOR_IN4_PIN, HIGH);digitalWrite(MOTOR_ENA_PIN, HIGH);digitalWrite(MOTOR_ENB_PIN, HIGH);
}void backward() {digitalWrite(MOTOR_IN1_PIN, LOW);digitalWrite(MOTOR_IN2_PIN, HIGH);digitalWrite(MOTOR_IN3_PIN, HIGH);digitalWrite(MOTOR_IN4_PIN, LOW);digitalWrite(MOTOR_ENA_PIN, HIGH);digitalWrite(MOTOR_ENB_PIN, HIGH);
}void turn_left() {digitalWrite(MOTOR_IN1_PIN, LOW);digitalWrite(MOTOR_IN2_PIN, HIGH);digitalWrite(MOTOR_IN3_PIN, LOW);digitalWrite(MOTOR_IN4_PIN, HIGH);digitalWrite(MOTOR_ENA_PIN, HIGH);digitalWrite(MOTOR_ENB_PIN, HIGH);
}void turn_right() {digitalWrite(MOTOR_IN1_PIN, HIGH);digitalWrite(MOTOR_IN2_PIN, LOW);digitalWrite(MOTOR_IN3_PIN, HIGH);digitalWrite(MOTOR_IN4_PIN, LOW);digitalWrite(MOTOR_ENA_PIN, HIGH);digitalWrite(MOTOR_ENB_PIN, HIGH);
}void stop() {digitalWrite(MOTOR_ENA_PIN, LOW);digitalWrite(MOTOR_ENB_PIN, LOW);
}int main() {setup();while (1) {// 从键盘输入指令char cmd = getchar();getchar(); // 忽略回车符// 根据指令执行动作switch (cmd) {case 'w': // 前进forward();break;case 's': // 后退backward();break;case 'a': // 左转turn_left();break;case 'd': // 右转turn_right();break;case 'x': // 停止stop();break;default:break;}}return 0;
}
四、总结
随着农业技术的不断进步,自动化、智能化已成为现代农业生产的重要趋势。本项目通过结合视觉识别技术、机器人技术和自动化控制技术,成功设计并实现了基于视觉识别的自动采摘机器人系统。这一创新性的成果不仅提高了果园采摘的效率和准确性,降低了人力成本,还为农业生产的现代化和智能化发展提供了新的解决方案和思路。
相关文章:
基于视觉识别的自动采摘机器人设计与实现
一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展,农业生产效率与质量的提升成为重要的研究对象。其中,果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下,而且在劳…...
算法D32 | 贪心算法2 | 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
122.买卖股票的最佳时机II 本题解法很巧妙,大家可以看题思考一下,在看题解。 代码随想录P 只收集每天的正利润,利润可以每天分解。 Python: class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices)<2: retur…...
【iOS ARKit】协作 Session 实例
协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术,ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场(View)。如果用户在某一个位置新创建了一个 ARAnchor,这时…...
云原生精品资料合集(附下载)
云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声,以应用价值为中心的云原生时代已经到,所以IT人员学习云原生正当时!最近跟各位大神征集了云原生的教程,行业报告和最佳实践,总有一款适…...
JVM 第一部分 JVM两种解释器 类加载过程和类加载器
JVM是跨平台跨语言的虚拟机,不直接接触硬件,位于操作系统的上一层 跟字节码文件直接关联,和语言没有关系 一次编译成字节码文件,多次执行 虚拟机可以分成三部分:类加载器,运行时数据区,执行引…...
用Java语言创建的Spring Boot项目中,如何传递数组呢??
问题: 用Java语言创建的Spring Boot项目中,如何传递数组呢?? 在这个思路中,其实,Java作为一个后端开发的语言,没必要着重于如何传入,我们主要做的便是对传入的数组数据进行处理即可…...
[笔记] 使用 Java Swing 实现一个简单的窗口
Java Swing 是一个用于构建图形用户界面(GUI)的Java库,它提供了丰富的组件和工具,用于创建交互式的桌面应用程序。Swing 是 Java Foundation Classes(JFC)的一部分,它是 Java 平台的一种标准用户…...
2024.03.03蓝桥云课笔记——排序
sort简介 #include<algorithm> 使用的是快速排序 时间复杂度为O(nlogn) sort使用(默认是从小到大) 1.sort(起始地址,结束地址的下一位,*比较函数); #include<iostream> #include<algorithm> using namesp…...
Vue3和ElementPlus封装table组件
最近学习vue3.2并自己在写一个项目,然后发现好几个页面都是列表页,重复写table和column也是觉得累,学习的项目列表页不算多,要是公司项目就不一样了,所以就想着自己封装一个table组件,免去大量重复工作和co…...
第一篇:参考资料地址
javaGuide JavaGuide(Java学习&面试指南) | JavaGuide 清华学生总结的 小林coding labuladong labuladong 的算法笔记 | labuladong 的算法笔记 【华仔说技术】kafka的系列文章 https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg3MTcxMDgxNA…...
wordpress 开源主题
海外就医wordpress主题 出国看病、海外就医是越来越多中产家庭的选择,此wordpress主题适合做相关业务的公司官网。 https://www.jianzhanpress.com/?p5220 防护wordpress外贸主题 个人防护器具wordpress外贸主题,适合做劳动保护的外贸公司使用。 ht…...
【Linux网络命令系列】ping curl telnet三剑客
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
于月仙主动与赵本山握手表示欢迎,赵:怎么着要跟我第二次牵手啊?
于月仙主动与赵本山握手表示欢迎,赵:怎么着要跟我第二次牵手啊? --小品《乡村爱情》(中1)的台词 表演者:赵本山 于月仙 王小利 唐鉴军等 (接上) 咱们呢就给新人揭盖头 好 好长贵…...
Unity UGUI之Slider基本了解
在Unity中,Slider(滑动条)是一种常用的用户界面控件之一,允许用户通过拖动滑块来选择一个数值。常常应用于调节数值(如调节音量、亮度、游戏难度等)、设置选项等。 以下是Slider的基本信息和用法: 1、创建…...
【Linux】进程间通信之共享内存
文章目录 引入共享内存的原理共享内存的相关接口shmget()shmat()shmdt()shmctl() 共享内存的简单使用共享内存的特点 引入 进程间通信,顾名思义就是一个进程和另一个进程之间进行对话,以此完成数据传输、资源共享、通知事件或进程控制等。 众所周知&am…...
文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于条件风险价值的虚拟电厂参与能量及备用市场的双层随机优化》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 这篇文章的标题涉及到以下几个关键点…...
前端架构: 脚手架通用框架封装之CommonJS和ESM混合开发兼容解决(教程五)
CommonJS 和 ESModule 混合开发 接上文,仍旧在 abc-cli 项目中参考:https://blog.csdn.net/Tyro_java/article/details/136433159现在要在脚手架项目中安装 chalk 依赖,因为在 abc-cli 项目几乎都是 CommonJS的实现而 chalk 这个依赖源码是基…...
基于主从模式的Reactor的仿muduo网络库
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…...
Linux服务器搭建超简易跳板机连接阿里云服务器
简介 想要规范内部连接阿里云云服务器的方式,但是最近懒病犯了,先搞一个简易式的跳板机过渡一下,顺便在出一个教程,其他以后再说! 配置方法 创建密钥 登录阿里云,找到云服务器ECS控制台,点击…...
Windows Server 各版本搭建文件服务器实现共享文件(03~19)
一、Windows Server 2003 打开服务器,点击左下角开始➡管理工具➡管理您的服务器➡添加或删除角色 点击下一步等待测试 勾选自定义配置,点击下一步 选择文件服务器,点击下一步 勾选设置默认磁盘空间,数据自己更改,最…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...
