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

NVIDIA工业设施数字孪生中的机器人模拟

工业设施数字孪生中的机器人模拟

文章目录

  • 工业设施数字孪生中的机器人模拟
    • 数字孪生技术的价值
    • NVIDIA Omniverse平台
    • 工业机器人仿真的核心组件
    • 示例一:使用Isaac Sim创建基本机器人场景
    • 示例二:机器人运动规划和轨迹执行
    • 示例三:传感器集成与感知模拟
    • 数字孪生仿真的优势
    • 实际应用场景
    • 总结
    • 参考资料

在当今智能制造的时代,工业设施数字孪生技术正在彻底改变我们设计、测试和优化机器人系统的方式。NVIDIA提供的先进仿真技术允许工程师在虚拟环境中准确模拟机器人行为,从而加速开发周期,降低成本,并提高最终部署系统的质量和安全性。本文将探讨如何利用NVIDIA的工具在工业设施数字孪生中进行机器人模拟。

数字孪生技术的价值

数字孪生是真实物理对象或系统的虚拟复制品,它能够在虚拟环境中模拟真实世界的行为和性能。在工业自动化领域,数字孪生特别有价值,因为它们允许工程师:

  • 在物理硬件可用之前进行设计和测试
  • 加速开发过程而不损害质量
  • 在不中断生产或危及设备的情况下进行实验
  • 轻松测试各种操作场景和边缘情况

在这里插入图片描述

NVIDIA Omniverse平台

NVIDIA Omniverse是构建数字孪生的理想平台,它提供了基于USD(通用场景描述)的协作环境,支持实时物理仿真和逼真的渲染。对于机器人模拟,Omniverse集成了多种工具:

  • Isaac Sim:专为机器人仿真设计
  • Omniverse Physics:提供高精度物理仿真
  • RTX渲染:生成逼真的视觉效果
  • OmniGraph:用于创建仿真逻辑

工业机器人仿真的核心组件

在工业环境中模拟机器人系统需要几个关键组件:

  1. 精确的3D场景:包括工厂布局、设备和障碍物
  2. 机器人模型:具有正确关节、动力学和运动学的精确表示
  3. 传感器仿真:模拟相机、激光雷达和其他传感器
  4. 控制系统:实现机器人的决策和动作逻辑
  5. 物理引擎:提供真实的物理交互

示例一:使用Isaac Sim创建基本机器人场景

以下是使用NVIDIA Isaac Sim创建基本工业机器人仿真场景的代码示例:

import omni.isaac.core.utils.stage as stage_utils
from omni.isaac.core.robots import Robot
from omni.isaac.core.utils.nucleus import get_assets_root_path
from omni.isaac.core.prims import RigidPrim
import numpy as np# 初始化机器人仿真场景
stage = stage_utils.create_new_stage()
assets_root_path = get_assets_root_path()# 加载工厂环境
# 注意:这里我们加载的是一个预制的工厂环境USD文件
factory_env_path = assets_root_path + "/Environments/Factory/factory_floor.usd"
stage_utils.add_reference_to_stage(factory_env_path, "/World/Factory")# 加载工业机器人模型
# 这里使用的是一个通用的UR10机器人模型
robot_path = assets_root_path + "/Robots/UR10/ur10.usd"
robot_prim_path = "/World/Robot"
stage_utils.add_reference_to_stage(robot_path, robot_prim_path)# 创建一个机器人对象,用于控制
robot = Robot(prim_path=robot_prim_path,name="industrial_robot",position=np.array([0, 0, 0])  # 设置机器人在场景中的位置
)# 添加一个工作台作为机器人的工作区域
workbench_path = assets_root_path + "/Props/Industrial/workbench.usd"
stage_utils.add_reference_to_stage(workbench_path, "/World/Workbench")# 设置工作台位置,使其位于机器人前方
workbench = RigidPrim(prim_path="/World/Workbench",name="robot_workbench",position=np.array([1.0, 0, 0])  # 工作台放置在机器人前方1米处
)# 添加一些工作对象(如零件)
part_path = assets_root_path + "/Props/Industrial/metal_part.usd"
stage_utils.add_reference_to_stage(part_path, "/World/Part")
part = RigidPrim(prim_path="/World/Part",name="target_part",position=np.array([1.0, 0, 0.5])  # 零件放在工作台上
)# 设置物理属性
# 为零件添加物理属性,使其能够被抓取和移动
part.get_applied_physics_rep().enable_rigid_body_physics()
part.get_applied_physics_rep().set_mass(1.0)  # 设置零件质量为1千克print("工业机器人仿真场景已创建完成")

这段代码展示了如何创建一个基本的工业机器人仿真场景,包括加载工厂环境、放置机器人和工作对象,以及设置基本的物理属性。

示例二:机器人运动规划和轨迹执行

下面的代码展示了如何为工业机器人实现基本的运动规划和轨迹执行:

import omni.isaac.motion_generation as mg
from omni.isaac.core.articulations import ArticulationController
import numpy as np
import time# 假设我们已经有了上面示例中创建的机器人
# 这里我们将实现机器人的运动规划和执行# 创建运动控制器
controller = ArticulationController(robot.get_articulation())# 定义机器人的关节目标位置(弧度)
# 这里示例了一系列关节角度,代表机器人的不同姿态
home_position = np.array([0.0, -1.57, 0.0, -1.57, 0.0, 0.0])  # 机器人的初始姿态
pick_position = np.array([0.5, -1.0, 0.5, -1.2, 1.57, 0.0])   # 抓取姿态
place_position = np.array([-0.5, -1.0, 0.5, -1.2, 1.57, 0.0]) # 放置姿态# 创建运动规划器
# RRT(快速随机树)是一种常用的路径规划算法
motion_planner = mg.lula.RRT(robot_articulation=robot.get_articulation(),robot_prim_path=robot_prim_path
)# 设置避障参数
motion_planner.set_collision_check_parameters(enable_collision_check=True,          # 启用碰撞检测collision_check_distance=0.02,        # 碰撞检测距离阈值(米)self_collision_check=True,            # 检查自碰撞collision_category="robots"           # 碰撞类别
)# 执行拾取和放置任务的函数
def perform_pick_and_place():"""执行简单的拾取和放置任务"""print("开始执行拾取和放置任务")# 步骤1:移动到初始位置print("移动到初始位置...")plan_to_home = motion_planner.plan_path(end_joint_positions=home_position,max_planning_time=2.0  # 最大规划时间(秒))# 检查规划是否成功if not plan_to_home.success:print("无法规划到初始位置")return False# 执行计划execute_plan(plan_to_home)# 步骤2:移动到拾取位置print("移动到拾取位置...")plan_to_pick = motion_planner.plan_path(end_joint_positions=pick_position,max_planning_time=2.0)if not plan_to_pick.success:print("无法规划到拾取位置")return Falseexecute_plan(plan_to_pick)# 这里应有抓取逻辑print("抓取物体...")time.sleep(1)  # 模拟抓取动作的时间# 步骤3:移动到放置位置print("移动到放置位置...")plan_to_place = motion_planner.plan_path(end_joint_positions=place_position,max_planning_time=2.0)if not plan_to_place.success:print("无法规划到放置位置")return Falseexecute_plan(plan_to_place)# 这里应有释放物体的逻辑print("释放物体...")time.sleep(1)  # 模拟释放动作的时间# 返回初始位置print("返回初始位置...")plan_to_home_final = motion_planner.plan_path(end_joint_positions=home_position,max_planning_time=2.0)if not plan_to_home_final.success:print("无法规划回初始位置")return Falseexecute_plan(plan_to_home_final)print("拾取和放置任务完成")return True# 执行规划好的路径
def execute_plan(plan):"""执行规划好的路径参数:plan: 由运动规划器生成的路径计划"""# 获取轨迹中的所有路径点trajectory_points = plan.trajectory.get_trajectory_points()# 为每个路径点设置控制目标并等待执行完成for point in trajectory_points:# 设置关节位置目标controller.set_joint_positions(point.positions)# 等待机器人达到目标位置# 在实际应用中,应该使用传感器反馈来确认位置time.sleep(0.1)  # 简化的等待时间# 调用函数执行拾取和放置任务
perform_pick_and_place()

这段代码演示了如何使用NVIDIA Isaac Sim的运动规划模块为工业机器人创建一个基本的拾取和放置任务。它包括路径规划、碰撞避免和轨迹执行。

示例三:传感器集成与感知模拟

在工业机器人仿真中,传感器仿真是另一个关键方面。以下代码展示了如何集成和使用视觉传感器:

import omni.kit.commands
from omni.isaac.sensor import Camera
import numpy as np
import cv2# 创建相机传感器
# 假设我们已经有了上面示例中的机器人和场景# 创建机器人末端执行器上的相机
camera_prim_path = "/World/Robot/camera"# 创建相机传感器
camera = Camera(prim_path=camera_prim_path,position=np.array([0, 0, 0.1]),  # 相对于末端执行器的位置orientation=np.array([0, 0, 0, 1]),  # 四元数表示的方向width=640,  # 图像宽度(像素)height=480,  # 图像高度(像素)frequency=20  # 相机帧率(Hz)
)# 将相机附加到机器人末端执行器
omni.kit.commands.execute("CreateRigidConstraintCommand",constraint_type="Fixed",  # 固定约束source_prim_path="/World/Robot/ee_link",  # 机器人末端执行器target_prim_path=camera_prim_path,  # 相机offset_pos=np.array([0, 0, 0.1]),  # 相对位置偏移offset_rot=np.array([0, 0, 0])  # 相对旋转偏移(欧拉角)
)# 实现一个简单的视觉处理函数
def process_camera_images():"""处理相机图像以识别工作区域中的物体"""# 获取当前相机图像camera_data = camera.get_current_frame()if camera_data is None:print("无法获取相机图像")return None# 获取RGB图像和深度图rgb_image = camera_data["rgb"]  # RGB图像depth_image = camera_data["depth"]  # 深度图# 将RGB图像转换为OpenCV格式用于处理# RGB图像转BGR(OpenCV使用BGR格式)bgr_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)# 简单的图像处理:转换为灰度图并进行阈值分割# 这只是一个基本示例,实际应用可能需要更复杂的计算机视觉算法gray_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY)_, thresh_image = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY)# 查找轮廓contours, _ = cv2.findContours(thresh_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 如果找到轮廓,处理最大的轮廓(假设它是我们的目标物体)detected_objects = []if contours:# 按轮廓面积排序sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)# 处理最大的几个轮廓for i, contour in enumerate(sorted_contours[:3]):  # 取最大的三个轮廓# 计算轮廓的边界矩形x, y, w, h = cv2.boundingRect(contour)# 计算轮廓中心center_x = x + w/2center_y = y + h/2# 从深度图获取此位置的深度# 注意:真实应用中应考虑深度图的噪声和有效性depth = depth_image[int(center_y), int(center_x)]# 将2D图像坐标转换为3D世界坐标的函数# 这里简化处理,实际应用需要相机内参和外参进行精确转换world_x = (center_x - 320) * depth * 0.001  # 简化的计算world_y = (center_y - 240) * depth * 0.001  # 简化的计算world_z = depth * 0.001  # 将深度从毫米转换为米# 添加到检测到的物体列表detected_objects.append({"id": i,"position": [world_x, world_y, world_z],"size": [w, h],"contour": contour})# 在图像上绘制边界框cv2.rectangle(bgr_image, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.putText(bgr_image, f"Obj {i}", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 保存处理后的图像(实际应用中可能不需要)cv2.imwrite("/tmp/processed_image.jpg", bgr_image)return {"original_image": rgb_image,"processed_image": bgr_image,"depth_image": depth_image,"detected_objects": detected_objects}# 使用相机数据进行物体检测和机器人导航的示例
def visual_servoing_example():"""使用视觉反馈控制机器人的示例"""# 获取并处理相机图像vision_data = process_camera_images()if vision_data is None or not vision_data["detected_objects"]:print("未检测到物体")return# 获取第一个检测到的物体target_object = vision_data["detected_objects"][0]target_position = target_object["position"]print(f"检测到目标物体,位置: {target_position}")# 在实际应用中,这里会使用目标位置来规划机器人路径# 这里只是简单打印信息,实际实现需要与运动规划系统集成print(f"机器人将移动到目标位置进行抓取")# 在仿真循环中定期调用视觉处理函数
# 在实际应用中,这应该在仿真的主循环或特定的回调函数中执行
visual_servoing_example()

这段代码展示了如何在工业机器人仿真中添加相机传感器,并使用计算机视觉技术处理图像数据以识别和定位物体。这对于视觉引导的机器人任务,如抓取和装配非常重要。

数字孪生仿真的优势

在这里插入图片描述

NVIDIA仿真技术为工业机器人开发提供了诸多优势:

  1. 加速开发周期:在物理原型可用之前测试设计和算法
  2. 降低成本:减少对物理硬件测试的需求,降低开发和调试成本
  3. 提高安全性:在虚拟环境中测试极端情况和故障模式,无安全风险
  4. 优化性能:快速迭代和测试多种配置以找到最佳设置
  5. 改进协作:不同团队可以同时在同一虚拟环境中工作
  6. 简化培训:为操作人员提供安全的培训环境

实际应用场景

数字孪生机器人仿真在工业领域有广泛应用:

  • 生产线优化:模拟并优化整条生产线的机器人布局和工作流程
  • 柔性制造:测试快速切换不同产品生产的能力
  • 预测性维护:模拟组件磨损和潜在故障模式
  • 人机协作:测试和优化人类工人与机器人的安全协作
  • 场景复制:复制真实工厂中的问题场景进行分析和修复

在这里插入图片描述

总结

工业设施数字孪生中的机器人仿真是未来智能制造的关键技术。通过NVIDIA提供的强大工具,工程师可以创建高度逼真的虚拟环境,模拟机器人操作,优化性能,并在物理部署前识别潜在问题。

随着计算能力的不断提升和仿真技术的进步,我们可以期待数字孪生技术在工业自动化中发挥越来越重要的作用,推动智能制造进入新的发展阶段。

参考资料

  • NVIDIA开发者博客:在工业设施数字孪生中模拟机器人
  • NVIDIA Omniverse官方文档
  • NVIDIA Isaac Sim官方文档r

相关文章:

NVIDIA工业设施数字孪生中的机器人模拟

工业设施数字孪生中的机器人模拟 文章目录 工业设施数字孪生中的机器人模拟数字孪生技术的价值NVIDIA Omniverse平台工业机器人仿真的核心组件示例一:使用Isaac Sim创建基本机器人场景示例二:机器人运动规划和轨迹执行示例三:传感器集成与感知…...

docker安装jenkins

docker安装jenkins 1.安装javaJDK 服务器安装javaJDK ,因为我的服务器是直接集成了宝塔面板,我就直接从宝塔面板去安装JDK 最好安装17的JDK,因为后面会安装jenkins,需要17的版本 1.2查看安装是否完成 java --version 安装成功如下&#x…...

量子计算与人工智能融合的未来趋势

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。 在当今科技飞速发展…...

人工智能在生物医药-新版ChatGPT-4o辅助一键生成机制图

新版ChatGPT-4o辅助一键生成机制图 作为一位生物医学教授专家,我将基于PubMed最新研究和科研大数据信息,遵循您的要求,一步一步进行思考和预测。 核心问题:乳酸化修饰促进肾透明细胞癌(ccRCC)恶性进展的机…...

支持 MCP 协议的开源 AI Agent 项目

关键要点 研究表明,目前有多个开源 AI Agent 项目支持 MCP 协议,包括 ChatMCP、HyperChat、5ire 和 Cherry Studio 等。这些项目主要用于聊天或桌面助手,允许通过 MCP 协议连接外部数据和工具。MCP 协议是 2024 年 11 月由 Anthropic 开源的…...

JavaRedis和数据库相关面试题

JavaRedis面试题 1. Redis是什么以及Redis为什么快? ​ Redis(Remote Dictionary Server)是一个开源的内存键值数据库,支持多种数据结构(如字符串、哈希、列表、集合等),并提供持久化、复制、…...

Android开发RxJava3延迟操作

Android开发RxJava3延迟操作 直接上代码: /*** param timeMillis 毫秒单位* desc : 延迟多少毫秒操作,* 注:它和Activity生命周期绑定,界面关闭了不会再执行delayTodoListener.delayTodo()* author : congge on 2021-03-25 15:31**/p…...

android 设置状态栏背景

一 让activity ui界面和手机状态栏一样的背景 要让 Activity 的 UI 界面和手机状态栏具有相同的背景颜色,并且能够随着深色模式和非深色模式的切换而改变颜色,你可以按照以下步骤操作: 1. 让 Activity 和 状态栏背景颜色一致 使用 window.s…...

vue 常见优化手段

文章目录 vue常见的优化手段前言使用key(避免明明相同的dom,每次更新都要重新生成)使用冻结的对象(避免无意义的响应式数据)使用函数式组件(减少vue组件实例的生成)vue3vue2使用计算属性(减少数据计算的次数)非实时绑定的表单项(避免表单过多触发监听事件)保持对象的…...

vue生命周期、钩子以及跨域问题简介

Vue 的生命周期是指 Vue 实例从创建到销毁的整个过程。在这个过程中,Vue 提供了一系列的生命周期钩子(Lifecycle Hooks),允许开发者在特定的时间点执行代码。以下是 Vue 的生命周期和钩子的简单说明: Vue 的生命周期阶…...

主相机绑定小地图

资源初始化:在类中通过 property 装饰器定义主相机、小地图相机、小地图精灵等资源属性,便于在编辑器中赋值。在 start 方法里,当确认这些资源存在后,创建渲染纹理并设置其大小,将渲染纹理与小地图相机关联&#xff0c…...

关于音频采样率,比特,时间轴的理解

是的,你的理解完全正确!-ar、-af aresampleasync1000 和 -b:a 64k 分别用于控制音频的采样率、时间戳调整和比特率。它们各自有不同的作用,但共同确保音频的质量和同步性。下面我将详细解释每个参数的作用和它们之间的关系。 1. -ar 参数 作用…...

三、FFmpeg学习笔记

​ FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的“瑞士军刀”。 FFmp…...

什么是 Java 泛型

一、什么是 Java 泛型? 泛型(Generics) 是 Java 中一种强大的编程机制,允许在定义类、接口和方法时使用类型参数。通过泛型,可以将数据类型作为参数传递,从而实现代码的通用性和类型安全。 简单来说&…...

从 WPF 到 MAUI:跨平台 UI 开发的进化之路

一、引言 在软件开发领域,用户界面(UI)开发一直是至关重要的环节。随着技术的不断发展,开发者对于创建跨平台、高性能且美观的 UI 需求日益增长。Windows Presentation Foundation(WPF)和 .NET Multi - pl…...

Docker学习之dockerfile篇(day8)

文章目录 前言一、问题描述二、具体内容1. Docker 镜像原理2. Docker 镜像制作3. Dockerfile 概念Dockerfile 的基本结构: 4. Dockerfile 关键字5. Docker 实战案例5.1 基于 Nginx 构建 Web 服务器 6. 验证与总结6.1 验证 Dockerfile6.2 总结 前言 Docker 是一种轻…...

Kotlin 作用域函数:apply、let、run、with、also

在 Kotlin 开发中,作用域函数(Scope Functions)是一组能让代码更简洁、更函数式的高阶函数。它们通过不同的作用域规则和返回值设计,解决了对象配置、空安全处理、链式操作等常见场景问题。本文将结合核心特性、代码示例和对比表格…...

Java 线程池与 Kotlin 协程 高阶学习

以下是Java 线程池与 Kotlin 协程 高阶学习的对比指南,结合具体代码示例,展示两者在异步任务处理中的差异和 Kotlin 的简化优势: 分析: 首先,我们需要回忆Java中线程池的常见用法,比如通过ExecutorService创…...

C++学习笔记(三十三)——forward_list

一、std::forward_list (1) forward_list与其适用场景 std::forward_list 是 C的STL中的单向链表(Singly Linked List),它相比 std::list(双向链表)更轻量,适用于仅需要单向遍历的场景。 主要特点&#…...

ROS订阅相机图像识别颜色并发布识别信息

一、前言 区别于之前的直接驱动相机,这里改为读取图像话题进行处理,原因是如果opencv驱动相机后只能单一使用,就限制了其他识别功能(除非将原始图像发布出来),所以这里改成可以读取任意相机图像话题的方法…...

Redis-15.在Java中操作Redis-Spring Data Redis使用方式-操作集合类型的数据

一.操作集合类型的数据 package com.sky.test;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;import j…...

第十一届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

1.字串排序 不会做&#xff0c;感觉挺难的&#xff0c;有兴趣的可以看下面题解 #include <iostream> #include <string.h> using namespace std; int V; int len;//符合交换次数V&#xff0c;字符串长度最小值 int now; //当前已经构造好的那一部分字符串逆序对个数…...

CentOS 安装 zip

安装软件 sudo yum install zip unzip # CentOS 7 sudo dnf install zip unzip # CentOS 8/9压缩文件 # 压缩单个文件 zip 压缩包名.zip 文件1# 压缩多个文件 zip 压缩包名.zip 文件1 文件2 文件3# 压缩目录&#xff08;包含子目录&#xff09; zip -r 压缩包名.zip 目…...

FastPillars:一种易于部署的基于支柱的 3D 探测器

FastPillars&#xff1a;一种易于部署的基于支柱的 3D 探测器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…...

LVS高可用负载均衡

一、项目图 二、主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT192.168.72.115/24lvs-masterredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.116/24 VIP 192.168.72.100/32lvs-backupredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.117/24 VIP 192.168…...

Kafka延迟队列实现分级重试

技术方案 方案背景 Kafka队列消息消费处理过程中&#xff0c;发生处理异常&#xff0c;需要实现重试机制&#xff0c;并基于重试次数实现不同延迟时间重试方案。 方案介绍 通过实现Kafka延迟队列来实现消息重试机制。 目标&#xff1a; 支持所有业务场景的延迟重试支持多…...

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…...

3.第二阶段x64游戏实战-分析人物移动实现人物加速

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;2.第二阶段x64游戏实战-x64dbg的使用 想找人物的速度&#xff0c;就需要使用Ch…...

MQTT 服务器(emqx)搭建及使用(一)

一. EMQX 服务器搭建 1.下载EMQX 下载链接&#xff1a;Windows | EMQX 文档 官方手册 2.下载内容解压至盘符根目录 3.进入bin文件夹&#xff0c;在地址栏输入cmd 4.依次输入下面命令安装服务 .\emqx.cmd install .\emqx.cmd console 5.设置自启动 创建批处理文件&#x…...

什么是SSE和websocket

以下是 SSE&#xff08;Server-Sent Events&#xff09; 和 WebSocket 在大模型&#xff08;如 ChatGPT&#xff09;流式输出中的实际例子对比&#xff0c;包含代码实现和场景分析&#xff1a; —### 1. SSE&#xff08;Server-Sent Events&#xff09;#### 场景 大模型生成文本…...

蓝桥杯专项复习——二分查找、二分答案

目录 二分查找、二分答案基础知识 二分查找模版 【模版题】数的范围 借教室 二分查找、二分答案基础知识 二分模版 二分查找 【模版题】数的范围 输入样例 6 3 1 2 2 3 3 4 3 4 5输出样例 3 4 5 5 -1 -1 思路&#xff1a; 对应两个模版&#xff0c;起始位置是对应第一…...

Android学习总结之Kotlin 协程

一、引言 在 Android 开发中&#xff0c;异步任务处理是绕不开的话题。传统的线程、Handler、AsyncTask 等方案要么过于繁琐&#xff0c;要么存在生命周期管理问题。Kotlin 协程的出现&#xff0c;以优雅的语法和强大的结构化并发能力&#xff0c;成为解决异步编程难题的理想方…...

docker的与使用

1 docker初体验 1.1 docker简介 问题&#xff1a;为什么会有docker出现&#xff1f; 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发运维之间的协作我们需要关心很多东西&#xff0c;这也是很多互联网公司都不得不面对…...

解决ubuntu18.04无法进入系统桌面

解决ubuntu18.04无法进入系统桌面 解决ubuntu18.04无法进入系统桌面前言1、原因2、解决现象总结 前言 Vmware虚拟机运行跑Linux项目&#xff0c;没有关掉运行的进程就关机&#xff0c;导致系统无法进入系统桌面&#xff0c;一直卡在系统的初始化界面&#xff0c;按下快捷键发…...

Docker学习之容器虚拟化与虚拟机的区别(day11)

文章目录 前言一、问题描述二、具体内容1. 虚拟机&#xff08;VM&#xff09;2. 容器虚拟化&#xff08;Docker&#xff09;容器虚拟化的核心技术 三、总结1. 资源占用对比2. 适用场景3. 结论 前言 在现代软件开发和部署过程中&#xff0c;Docker 和虚拟机&#xff08;VM&…...

无人机数据链技术及运行方式详解!

一、无人机数据链技术要点 1. 通信传输技术 频段选择&#xff1a; 常用频段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同频段在传输距离、带宽和抗干扰性间权衡。 低…...

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档&#xff1a;MyBatis Plus官方文档…...

设计模式 三、结构型设计模式

一、代理模式 代理设计模式&#xff08;Proxy Design Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供了一个代理&#xff0c;以控制对这个对象的访问。 代理模式可以用于实现懒加载、安全访问控制、日志记录等功能。简单来说&#xff0c;代理模式 就是通…...

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…...

JMeter脚本录制(火狐)

录制前准备&#xff1a; 电脑&#xff1a; 1、将JMeter证书导入&#xff0c;&#xff08;bin目录下有一个证书&#xff0c;需要安装这个证书到电脑中&#xff09; 2、按winr&#xff0c;输入certmgr.msc&#xff0c;打开证书&#xff0c;点击下一步&#xff0c;输入JMeter证书…...

10、Linux C 网络编程(完整版)

1、网络发展历史和分层 1.1 Internet 的历史 起源&#xff1a; 1957 年&#xff1a;苏联发射第一颗人造卫星 "Sputnik"。 1958 年&#xff1a;美国总统艾森豪威尔成立 DARPA&#xff08;国防部高级研究计划署&#xff09;。 1968 年&#xff1a;DARPA 提出 "…...

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 版本7.3-7.4 都试过加密没什…...

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发&#xff0c;但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析&#xff1a; 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…...

CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)

CSS3 媒体查询实现响应式布局语法指南 一、媒体查询核心语法 1. 基础语法结构 media 媒体类型 and (媒体特性) {/* 匹配条件时应用的CSS规则 */ }2. 媒体类型&#xff08;可省略&#xff09; 类型值说明all所有设备&#xff08;默认值&#xff09;screen屏幕设备print打印机…...

C#中,什么是委托,什么是事件及它们之间的关系

1. 委托&#xff08;Delegate&#xff09; 定义与作用 ‌委托‌是类型安全的函数指针&#xff0c;用于封装方法&#xff0c;支持多播&#xff08;链式调用&#xff09;。‌核心能力‌&#xff1a;将方法作为参数传递或异步回调。 使用场景 回调机制&#xff08;如异步操作完…...

【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)

&#x1f680; 力扣热题 347&#xff1a;前 K 个高频元素&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k&#xff0c;请你返回其中出现频率 前 k 高的元素。你可以按 任意顺序 返回答案。 &#x1f…...

②EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 EtherCAT 转 Modbus TCP 配置说明 网线连接电脑到模块上的 WEB 网页设置网口&#xff0c;电脑所连网口的网段设置成 192.168.1.X&#xff08;X 是除 8 外的任一数值&#xff09;后&#xff0c;打开浏览器&#xff0c;地址栏输入 192.168.1.8 &#xff…...

微服务集成测试 -华为OD机试真题(A卷、Python)

题目描述 现在有n个容器服务&#xff0c;服务的启动可能有一定的依赖性&#xff08;有些服务启动没有依赖&#xff09;&#xff0c;其次&#xff0c;服务自身启动加载会消耗一些时间。 给你一个n n 的二维矩阵useTime&#xff0c;其中useTime[i][i]10表示服务i自身启动加载需…...

k8s常用总结

1. Kubernetes 架构概览 主节点&#xff08;Master&#xff09;&#xff1a; 负责集群管理&#xff0c;包括 API Server、Controller Manager、Scheduler 和 etcd 存储。 工作节点&#xff08;Node&#xff09;&#xff1a; 运行 Pod 和容器&#xff0c;包含 kubelet、kube-pr…...

【算法】并查集基础讲解

一、定义 一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;只要找到了某个元素的的树根&#xff0c;就能确定它在哪个集合里。 …...