G1 人形机器人软件系统架构与 Python SDK
如果说人形机器人的硬件是它的“身体”,那么软件系统就是它的“大脑”和“神经系统”,负责接收信息、进行决策并控制身体行动。理解 G1 机器人的软件架构,特别是如何通过编程接口与其交互,是进行机器人开发的核心。本节将剖析 G1 的软件层次结构,介绍中间件的作用,详细讲解如何使用 Python SDK 或 ROS API,并提供一个实践示例。
1.3.1 G1 软件系统层次 (操作系统、中间件、驱动、应用层)
一个复杂的机器人系统通常由多个软件层次构成,每一层都建立在其下层之上,提供不同程度的抽象,使得开发更加模块化和高效。G1 人形机器人作为一个现代平台,其软件系统也遵循类似的层次结构:
- 硬件层 (Hardware Layer): 这是最底层,包括我们在 1.2 节中介绍的传感器、执行器(电机、驱动器)、计算单元(主控板、关节控制板等)以及它们之间的通信线路。
- 底层驱动层 (Low-level Driver Layer): 这一层是直接与硬件交互的软件。它们通常由硬件制造商编写,用于将高层指令转换为硬件能理解的信号,并将硬件状态(如传感器原始数据)读取上来。这些驱动可能运行在机器人内部的嵌入式系统或微控制器上。开发者通常不会直接与这一层打交道。
- 操作系统层 (Operating System - OS Layer): 运行在机器人主控计算机上的操作系统。对于像 G1 这样的机器人,通常会选择一个稳定、开放且支持实时或准实时处理的操作系统,Linux(如 Ubuntu,可能是其实时版本 RTLinux)是主流选择。OS 负责管理机器人上的计算资源、内存、文件系统、网络通信以及调度不同的软件进程运行。
- 中间件层 (Middleware Layer): 这是连接底层驱动和上层应用的关键层。中间件为机器人软件开发提供了一个标准化的框架,解决了分布式计算、进程间通信、硬件抽象等复杂问题。ROS (Robot Operating System) 是机器人领域最流行的中间件,Unitree Robotics 的机器人(包括 G1)通常都深度支持 ROS。通过中间件,不同的软件组件(可能运行在不同的计算机上)可以方便地交换数据和互相调用功能。
- 应用层 (Application Layer): 这是开发者编写各种机器人行为和智能算法的地方。例如,步态规划算法、机械臂操作控制、视觉处理、人机交互逻辑、任务规划等都属于应用层。应用层的软件通过中间件或厂家提供的 SDK 来访问传感器数据和控制执行器,而无需关心底层的硬件细节。你的 Python 控制脚本就运行在这一层。
这种分层架构使得 G1 的软件系统具有良好的模块化、可维护性和扩展性。开发者可以专注于应用层逻辑的实现,而不用担心底层硬件的复杂性。
1.3.2 ROS 或其他中间件在 G1 上的作用 (节点、话题、服务、动作)
正如前面提到的,ROS 在 G1 这样的机器人平台上扮演着至关重要的角色。它为构建复杂的机器人应用提供了一个灵活、分布式的框架。
-
为什么使用 ROS?
- 模块化与复用性: 将不同的功能(如 IMU 读取、关节控制、导航、视觉处理)分解成独立的模块——“节点”,这些节点可以独立开发、测试和运行。
- 分布式计算: 节点可以运行在同一台计算机上,也可以运行在网络中的不同计算机上,ROS 负责它们之间的通信。这对于 G1 这样可能包含多个计算单元的机器人非常有用。
- 标准化接口: ROS 定义了标准的通信机制和消息类型,使得不同的节点(即使由不同人编写)也能方便地协同工作。
- 丰富的工具和生态系统: ROS 提供了大量的开发工具(可视化、调试、仿真)以及预先构建的功能包(如导航、感知算法),极大地加速了开发过程。
-
ROS 的核心概念在 G1 上的体现:
- 节点 (Nodes): G1 软件系统中运行的每一个独立的可执行程序都可以是一个 ROS 节点。例如,可能有一个节点负责读取和发布 IMU 数据,一个节点负责监听控制指令并发送给关节驱动器,一个节点运行你的 Python 控制算法。
- 话题 (Topics): 节点之间通过话题发布和订阅数据流。这是 ROS 中最主要的通信方式。
- 数据发布: G1 的底层驱动节点会读取传感器数据(如关节角度、IMU 读数、足部力),并将这些数据打包成 ROS 消息,发布到相应的 ROS 话题上(例如
/joint_states
,/imu_data
,/foot_forces
)。 - 数据订阅: 你的 Python 控制节点或其他应用节点会订阅这些话题,实时接收机器人的状态信息。
- 指令发布: 你的 Python 控制节点会根据算法计算出控制指令(如目标关节力矩或位置),将这些指令打包成 ROS 消息,发布到机器人关节控制节点订阅的话题上(例如
/g1/commands/joint_torques
)。
- 数据发布: G1 的底层驱动节点会读取传感器数据(如关节角度、IMU 读数、足部力),并将这些数据打包成 ROS 消息,发布到相应的 ROS 话题上(例如
- 服务 (Services): 用于请求/响应式的通信,适合那些不需要持续发送数据,而是需要执行一次性任务并等待结果的场景。例如,你可能调用一个服务来让 G1 执行一个预设的动作序列,或者查询某个系统参数。
- 动作 (Actions): 适用于需要长时间执行且需要过程反馈的任务,如“行走 5 米”。一个节点作为动作服务器提供某个动作,另一个节点作为动作客户端发送目标并接收进度反馈,甚至可以在任务完成前取消任务。这对于控制 G1 执行复杂的运动或任务非常有用。
通过 ROS,G1 的硬件功能被抽象化并以标准化的接口暴露出来,使得开发者可以使用 Python 或 C++ 等语言方便地编写高层控制程序。
1.3.3 详细讲解 G1 提供的 Python SDK 或 ROS Python API 的使用
对于 G1 这样的机器人,进行 Python 开发主要有两种途径:使用厂家提供的原生 Python SDK,或者利用 ROS 的 Python 接口 (rospy)。由于 Unitree G1 强力支持 ROS,使用 ROS Python API 通常是更通用和推荐的方式,因为它能让你接入更广阔的 ROS 生态系统。
使用 ROS Python API (rospy):
rospy
是 ROS 官方提供的 Python 客户端库,允许你用 Python 编写 ROS 节点,并与其他 ROS 节点(包括 G1 的硬件驱动节点)进行通信。
- 安装与设置:
- 需要在你的开发环境(通常是运行 Ubuntu Linux 的电脑,可能需要安装 ROS)和 G1 机器人(如果 G1 运行 ROS)上都安装相应版本的 ROS。
- 安装 G1 机器人特定的 ROS 驱动包。这些包通常包含将 G1 硬件功能封装为 ROS 话题、服务和动作的节点。Unitree 会提供这些包。
- 设置 ROS 环境(如配置
ROS_MASTER_URI
和ROS_HOSTNAME
环境变量,确保你的电脑能找到机器人上的 ROS Master)。
- 基本使用流程:
- 初始化节点: 在 Python 脚本的开头,你需要初始化一个 ROS 节点。 Python
import rospy rospy.init_node('my_g1_controller_node') # 给你的节点起一个名字
- 创建发布者 (Publisher): 如果你想向 G1 发送控制指令,你需要创建一个发布者对象,指定要发布到的话题名称和消息类型。 Python
from unitree_msgs.msg import MotorCmd # 假设 G1 使用这个消息类型控制电机 motor_cmd_pub = rospy.Publisher('/g1/commands/motor_commands', MotorCmd, queue_size=10)
/g1/commands/motor_commands
是一个示例话题名,实际名称需要查阅 G1 的 ROS 文档。MotorCmd
是一个示例消息类型,表示电机指令的数据结构。queue_size
指定消息队列大小。 - 创建订阅者 (Subscriber): 如果你想接收 G1 的传感器数据或状态信息,你需要创建一个订阅者对象,指定要订阅的话题名称、消息类型以及一个回调函数。当收到新消息时,回调函数会被自动调用。 Python
from sensor_msgs.msg import JointState # 标准 ROS 消息类型,包含关节角度、速度、力矩 from sensor_msgs.msg import Imu # 标准 ROS 消息类型,包含 IMU 数据 from geometry_msgs.msg import WrenchStamped # 标准 ROS 消息类型,可能用于足部力传感器def joint_state_callback(msg):# 在这里处理接收到的关节状态数据print("Received Joint Positions:", msg.position)print("Received Joint Velocities:", msg.velocity)print("Received Joint Torques:", msg.effort)def imu_callback(msg):# 在这里处理接收到的 IMU 数据print("Received IMU Orientation (Quaternion):", msg.orientation)print("Received IMU Angular Velocity:", msg.angular_velocity)print("Received IMU Linear Acceleration:", msg.linear_acceleration)joint_state_sub = rospy.Subscriber('/g1/joint_states', JointState, joint_state_callback) imu_sub = rospy.Subscriber('/g1/imu', Imu, imu_callback) # 假设足部力传感器数据发布到 /g1/foot_forces 话题 # left_foot_force_sub = rospy.Subscriber('/g1/foot_forces/left', WrenchStamped, left_foot_force_callback)
/g1/joint_states
和/g1/imu
是示例话题名,实际话题名和消息类型请参考 G1 的 ROS 文档。 - 创建服务客户端 (Service Client): 如果你想调用 G1 提供的 ROS 服务,需要创建一个服务客户端对象。 Python
rospy.wait_for_service('/g1/set_mode') # 等待服务可用 try:set_mode_service = rospy.ServiceProxy('/g1/set_mode', SetMode) # 假设有 SetMode 服务resp = set_mode_service(mode='torque_control') # 调用服务if resp.success:print("Successfully set mode to torque control") except rospy.ServiceException as e:print(f"Service call failed: {e}")
- 循环运行: 大多数机器人控制程序都需要持续运行,处理接收到的数据并发送指令。
rospy.spin()
会阻塞当前线程,直到节点关闭,期间会处理所有的回调函数。或者你可以使用一个循环结合rospy.Rate
来控制循环频率。 Pythonrate = rospy.Rate(100) # 控制循环频率为 100Hz while not rospy.is_shutdown():# 在这里编写你的控制逻辑:读取处理数据,计算指令# 发送指令# motor_cmd_pub.publish(my_motor_command_msg)rate.sleep() # 按照设定的频率休眠
- 初始化节点: 在 Python 脚本的开头,你需要初始化一个 ROS 节点。 Python
- Python SDK (如果提供): 如果 Unitree 提供了独立的 Python SDK(不基于 ROS),其使用方式会更直接,你可能需要导入特定的库,建立连接,然后调用库提供的函数来获取数据和发送指令。API 名称和结构会由 SDK 定义,例如: Python
无论使用哪种方式,核心思想都是通过库函数或消息机制,在 Python 代码中实现与机器人硬件状态的交互和控制指令的发送。import unitree_g1_sdkrobot = unitree_g1_sdk.Robot('192.168.1.10') # 连接机器人 robot.connect()joint_state = robot.get_joint_state() # 获取关节状态 imu_data = robot.get_imu_data() # 获取 IMU 数据target_angles = [0.1, -0.2, ...] robot.set_joint_positions(target_angles) # 设置关节位置robot.disconnect()
1.3.4 Python 实践: 编写简单的 Python 脚本
由于我们无法直接连接到一个真实的 G1 机器人并运行代码,这里的实践部分将提供一个概念性的 Python 脚本结构和伪代码。你需要根据实际的 G1 ROS 驱动包或 SDK 文档,替换其中的话题名称、消息类型和函数调用。
这个示例脚本将演示如何:
- 初始化 ROS 节点。
- 订阅关节状态和 IMU 数据话题。
- 创建发布者,用于发送关节位置指令。
- 在一个循环中,读取接收到的传感器数据并打印。
- 发送一个简单的关节位置指令(例如,将某个关节移动到特定角度)。
重要提示:
- 这段代码是示例性质的,不能直接运行。
- 你需要先在你的开发环境中安装 ROS 和 G1 机器人对应的 ROS 包,并确保机器人和电脑在同一个 ROS 网络中。
- 你需要查阅 G1 机器人 ROS 包或 SDK 的官方文档,以获取正确的话题名称、消息类型和 API 函数。
Python
#!/usr/bin/env pythonimport rospy
import time
# 导入 G1 机器人相关的消息类型和/或服务
# 这些消息类型通常定义在 G1 的 ROS 包中,例如 unitree_msgs 或 sensor_msgs
from sensor_msgs.msg import JointState
from sensor_msgs.msg import Imu
# 假设使用 JointTrajectory 点来控制位置
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint# 定义接收传感器数据的回调函数
# 当订阅的话题有新消息时,这些函数会被 ROS 自动调用def joint_state_callback(msg):"""处理接收到的关节状态数据msg 包含关节名称、位置、速度、力矩等信息"""# 为了简洁,这里只打印一部分信息rospy.loginfo("--- Joint State Received ---")rospy.loginfo("Joint Names: %s", msg.name)rospy.loginfo("Joint Positions: %s", [f"{p:.2f}" for p in msg.position]) # 格式化输出,保留2位小数# rospy.loginfo("Joint Velocities: %s", [f"{v:.2f}" for v in msg.velocity])# rospy.loginfo("Joint Torques: %s", [f"{e:.2f}" for e in msg.effort])def imu_callback(msg):"""处理接收到的 IMU 数据msg 包含姿态(四元数)、角速度、线加速度"""rospy.loginfo("--- IMU Data Received ---")# 四元数通常表示姿态,这里简单打印rospy.loginfo("Orientation (Quaternion): x=%s, y=%s, z=%s, w=%s",f"{msg.orientation.x:.2f}", f"{msg.orientation.y:.2f}",f"{msg.orientation.z:.2f}", f"{msg.orientation.w:.2f}")rospy.loginfo("Angular Velocity: x=%s, y=%s, z=%s",f"{msg.angular_velocity.x:.2f}", f"{msg.angular_velocity.y:.2f}",f"{msg.angular_velocity.z:.2f}")# rospy.loginfo("Linear Acceleration: x=%s, y=%s, z=%s",# f"{msg.linear_acceleration.x:.2f}", f"{msg.linear_acceleration.y:.2f}",# f"{msg.linear_acceleration.z:.2f}")def simple_g1_control_script():"""主函数,用于初始化 ROS 节点,设置订阅和发布,并运行控制循环"""# 1. 初始化 ROS 节点rospy.init_node('g1_simple_controller', anonymous=True) # anonymous=True 确保节点名唯一# 2. 创建订阅者,订阅关节状态和 IMU 数据话题# 话题名称需要根据 G1 的 ROS 文档确定rospy.Subscriber('/g1/joint_states', JointState, joint_state_callback)rospy.Subscriber('/g1/imu_data', Imu, imu_callback) # 假设 IMU 话题名为 /g1/imu_data# 3. 创建发布者,用于发送关节控制指令# 假设 G1 接受 JointTrajectory 消息进行位置控制# 话题名称需要根据 G1 的 ROS 文档确定joint_command_pub = rospy.Publisher('/g1/commands/joint_trajectory', JointTrajectory, queue_size=10)rospy.loginfo("G1 Simple Controller Node Started.")rospy.loginfo("Subscribing to /g1/joint_states and /g1/imu_data...")rospy.loginfo("Publishing to /g1/commands/joint_trajectory...")# 等待订阅者和发布者建立连接(可选,但推荐)# time.sleep(1.0) # 给 ROS 一些时间建立连接# 4. 在一个循环中执行控制逻辑rate = rospy.Rate(10) # 控制主循环频率为 10 Hz# 简单的关节控制示例:让某个关节移动到目标位置# 再次强调:关节名称和目标位置需要根据 G1 的具体情况来定!target_joint_name = "left_shoulder_pitch" # 假设这是一个有效的关节名称target_position = 0.5 # 目标角度(弧度)duration = 2.0 # 达到目标位置所需时间 (秒)# 创建 JointTrajectory 消息joint_traj_msg = JointTrajectory()joint_traj_msg.header.stamp = rospy.Time.now() # 时间戳joint_traj_msg.joint_names = [target_joint_name] # 指定要控制的关节名称列表# 创建一个轨迹点point = JointTrajectoryPoint()point.positions = [target_position] # 目标位置列表,与 joint_names 对应point.time_from_start = rospy.Duration(duration) # 从开始执行这个轨迹点的时间joint_traj_msg.points.append(point) # 添加轨迹点到消息中# 发送指令的标志command_sent = Falserospy.loginfo("Entering control loop...")while not rospy.is_shutdown():# --- 在这里可以添加更复杂的控制逻辑 ---# 例如:# - 根据 IMU 数据调整平衡# - 根据视觉/Lidar 数据进行避障# - 实现更复杂的步态算法# - 根据接收到的传感器数据计算并发布新的关节指令 (位置、速度或力矩)# 示例:发送一次性关节位置指令if not command_sent:rospy.loginfo(f"Attempting to move joint '{target_joint_name}' to {target_position:.2f} radians...")joint_command_pub.publish(joint_traj_msg)command_sent = Truerospy.loginfo("Joint command sent.")# 确保 ROS 处理回调函数(订阅者接收数据)# 在 while not rospy.is_shutdown(): 循环中使用 rate.sleep() 会自动处理 ROS 回调# 按照设定的频率休眠rate.sleep()rospy.loginfo("G1 Simple Controller Node Shutting down.")if __name__ == '__main__':try:simple_g1_control_script()except rospy.ROSInterruptException:# 捕获 ROS 关闭异常passexcept Exception as e:# 捕获其他可能的异常并打印rospy.logerr(f"An error occurred: {e}")
运行这个示例脚本的步骤(概念性):
- 确保你已经搭建好 ROS 环境,并且 G1 机器人(或其仿真环境)正在运行,并且 G1 的 ROS 驱动节点已经启动并发布了传感器数据和订阅了指令话题。
- 将上面的代码保存为一个
.py
文件(例如g1_simple_controller.py
)。 - 给文件执行权限:
chmod +x g1_simple_controller.py
- 在终端中,确保你处于 ROS 环境下(
source /opt/ros/<your_ros_distro>/setup.bash
或你的工作空间 setup 文件)。 - 运行 ROS 节点:
rosrun your_package_name g1_simple_controller.py
(需要将脚本放在一个 ROS 包中) 或者直接使用rosrun --no-required your_package_name g1_simple_controller.py
如果你不确定依赖。
运行后,你应该能看到脚本打印出接收到的关节状态和 IMU 数据。如果机器人连接正确且驱动正常,它也应该尝试移动 left_shoulder_pitch
关节。
通过这个简单的示例,你就能初步体会到如何使用 Python 和 ROS API 与 G1 人形机器人进行通信,读取其状态并发送控制指令。这将是你后续进行更复杂机器人开发的基础。
相关文章:
G1 人形机器人软件系统架构与 Python SDK
如果说人形机器人的硬件是它的“身体”,那么软件系统就是它的“大脑”和“神经系统”,负责接收信息、进行决策并控制身体行动。理解 G1 机器人的软件架构,特别是如何通过编程接口与其交互,是进行机器人开发的核心。本节将剖析 G1 …...
Redis在SpringBoot中的使用
在SpringBoot项目中使用redis存储数据作为字典 本项目使用jdk1.8 一、添加依赖 <!-- spring boot redis缓存引入 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…...
SuperMap GIS基础产品FAQ集锦(20250421)
一、SuperMap iDesktopX 问题1:iDesktopX怎么根据对数据集中的每条记录进行批量布局出图? 11.3.0 【解决办法】打开地图系列设置功能,勾选启用并设置索引地图,索引图层和索引字段等参数,打印地图册,设置输出路径&am…...
Linux学习笔记2
1.man man指令相当于一个在线手册 使用q可以退出指令运行 例如,使用 man ls 指令可以得到以下运行结果: 在查找的时候还可以使用数字,使用 man man 指令,对应每个数字所表示的内容: 在Linux下,一切皆是文件…...
电脑安装adb并且连接华为手机mate60pro后查看设备
1.下载adb工具 下载地址: https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn#downloads 根据需要下载自己系统需要的安装包 下载后解压 2.配置adb工具环境变量 添加ADB_HOME D:\softwares\platform-tools-latest-windows\platform-…...
EAL4+与等保2.0:解读中国网络安全双标准
EAL4与等保2.0:解读中国网络安全双标准 在当今数字化时代,网络安全已成为各个行业不可忽视的重要议题。特别是在金融、政府、医疗等领域,保护信息的安全性和隐私性显得尤为关键。在中国,EAL4和等级保护2.0(简称“等保…...
树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率
树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率 1. 获取摄像头支持的分辨率2. 代码分析3. 树莓派实测 1. 获取摄像头支持的分辨率 使用如下代码获取摄像头支持的输出分辨率。 struct v4l2_frmsizeenum stFrameSize …...
CSS预处理器对比:Sass、Less与Stylus如何选择
引言 CSS预处理器已成为现代前端开发的标准工具,它们通过添加编程特性来增强纯CSS的功能,使样式表更加模块化、可维护且高效。在众多预处理器中,Sass、Less和Stylus是三个最流行的选择,它们各自拥有独特的语法和功能特点。本文将深…...
Vue3集成sass
安装依赖 pnpm add -D sass-embedded配置全局变量 新建文件 src/styles/variables.scss配置Vite 修改 vite.config.ts variables.scss $base-color: bluevite.config.ts // https://vite.dev/config/ export default defineConfig({plugins: [vue(),],resolve: {alias: {:…...
超越Dify工作流:如何通过修改QwenAgent的Function Call及ReAct方法实现对日期时间的高效意图识别
在构建复杂的AI应用时,意图识别是一个至关重要的环节。传统上,许多开发者会使用Dify工作流来完成这一任务,但在处理复杂意图时,这种方法往往需要大模型进行多级反复识别,从而带来较高的时间成本。 本文将介绍如何通过修改QwenAgent框架中的FnCallAgent和ReActChat类,实现…...
Lua 第8部分 补充知识
8.1 局部变量和代码块 Lua 语言中的变量在默认情况下是全局变量 ,所有的局部变量在使用前必须声明 。 与全局变量不同,局部变量的生效范围仅限于声明它的代码块。一个代码块( block )是一个控制结构的主体,或是一个函…...
Lua 第7部分 输入输出
由于 Lua 语言强调可移植性和嵌入性 , 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中,从图形、数据库到网络的访问等大多数 I/O 操作,要么由宿主程序实现,要么通过不包括在发行版中的外部库实现。 单就…...
Java 中 == 和 equals() 的区别
1. 运算符 是 Java 中的比较运算符,用于比较两个变量的值是否相等,但具体行为取决于变量的类型: 类型 比较的内容基本类型直接比较值是否相等(如 int a 5; int b 5; a b 返回 true)引用类型比较内存地址&#x…...
Redis新节点加入集群会发生什么(面试题)
新加入主节点:会发生槽位数据重新分配迁移, 新加入从节点,会发生主从同步,全量同步和增量同步 当一个新节点加入 Redis 集群时,会触发一系列操作以确保集群的稳定性和数据的一致性。以下是新节点加入 Redis 集群时的详…...
dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明
dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明 1 环境介绍2 安装部署dmncdm2.1 196部署cdm环境2.2 197部署cdm环境2.3 190部署cdm环境 3 主备集群/主从集群配置4 部署主备集群/主从集群5 部署日志6 更多达梦数据库全方位指南:安装 优化 与实战教程 1 环境介绍 cpu x8…...
docker容器,mysql的日志文件怎么清理
访问问题 你的问题是因为在当前路径 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录。以下是详细分析和解决方法: 错误原因 路径不存在 当前目录 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录,执行 cd data/ 时会报错 No suc…...
kafka auto.offset.reset详解
在 Kafka 中,auto.offset.reset latest 的含义及行为如下: 1. 核心定义 当消费者组首次启动或无法找到有效的 offset(例如 offset 过期、被删除或从未提交)时,消费者会从分区的最新位置…...
设备制造行业如何避免项目管理混乱?
项目常因进度延误、成本超支或部门协作不畅而陷入混乱? 这不仅拖累项目交付,还可能损害客户信任和企业利润。设备制造行业的项目管理复杂多变,从需求获取到生产交付再到售后运维,每一个环节都可能成为效率的瓶颈。 如何破解这一…...
kubernetes》》k8s》》删除命名空间
使用 kubectl delete ns 命名空间 --force --grace-period0 如果还删除不掉 需要 kubectl get namespace 命名空间 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空间/finalize” -f ./x.json...
【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...
55、Spring Boot 详细讲义(十一 项目实战)springboot应用的登录功能和权限认证
项目文档:springboot应用的登录功能和权限认证 一、项目概述 1. 项目简介 本项目是在一个基于Spring Boot的Web应用中实现登录功能和权限认证。要求实现登录功能,用户登录成功以后,会给前台返回当前登录用户可以访问的权限菜单,比如超级管理员可以访问所有权限,产品管理…...
react 父子组件通信 子 直接到父, 父 forwardref子
React核心概念:单向数据流(Unidirectional Data Flow) React 中数据的流动像瀑布一样,只能从上层组件(父组件)流向下层组件(子组件)。 子组件无法直接反向修改父组件的数据&#x…...
基于TCP的协议
目录 TCP 基于TCP的应用层协议: TCP的工作方式 TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它为应用层提供了一个可靠的端到端的数据传输服务。再TCP/IP模型中,TCP位于传输层,负责再…...
性能比拼: Go vs Java
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…...
【Spring】单例作用域下多次访问同一个接口
在Spring框架中,Controller和Service的Bean默认都是单例(Singleton)的。在多个请求同时访问Controller时,Service的Bean调用情况如下: 1. 核心机制 单例Bean:Spring容器为每个Bean定义(如Serv…...
数据库介绍
1、什么是数据库 数据库是一个“广义的概念" 1. 表示一门学科 2. 表示一类软件,管理数据的软件 3. 表示某一个具体的数据库软件 4. 表示部署了某个数据库软件的主机(电脑) 本专栏介绍的是具体的数据库软件:MySQL 数据库软件的主要功能是对数据的增删…...
Spring XML 配置
Spring XML 配置是 Spring Framework 的传统配置方式,通过 XML 文件定义 Bean、依赖注入、AOP 等核心功能。以下是详细的 Spring XML 配置解析: 一、基础配置 1. XML 配置文件结构 <?xml version"1.0" encoding"UTF-8"?> …...
AI数字人:品牌营销的新宠与增长密码(6/10)
摘要:AI数字人凭借低成本、高可控性与强互动性等优势,正成为品牌营销新宠。通过技术驱动,AI数字人从虚拟形象发展为智能交互的数字化身,广泛应用于直播、客服、内容生产等营销场景,助力品牌提升营销效果与用户互动体验…...
CentOS笔记本合上盖子不休眠
通过修改 /etc/systemd/logind.conf 文件中的 HandleLidSwitch 和 HandleLidSwitchDocked 设置为 ignore,可以实现合上笔记本盖子时不休眠的效果。如果有其他电源管理工具或桌面环境的设置干扰,也需要一并调整。 // 切换到root用户 su root// logind.co…...
Vue.js 之 `v-for` 命令详解
Vue.js 之 v-for 命令详解 在 Vue.js 中,v-for 是一个非常强大的指令,用于遍历数组或对象中的数据,并渲染相应的 DOM 元素。无论是在列表展示、表单生成还是动态组件加载中,v-for 都发挥着重要作用。本文将详细介绍 v-for 的用法…...
Linux命令-pidstat
pidstat命令是一个用于监控系统中各个进程活动的性能监控工具。它能够实时输出每个进程的 CPU、内存、I/O 等关键性能指标。以下是关于 pidstat 命令的详细介绍: 语法 pidstat [选项] [时间间隔] [次数]常用选项 -h 或 --help :显示帮助信息。 -v &…...
map和set
1.序列式容器和关联式容器 在认识map和set之前,关于容器,有两个重要的分类 序列式容器关联式容器 序列式容器:按照元素插入的顺序保存数据,关注元素的顺序和位置,因为逻辑结构为线性序列的数据结构,两个位…...
CentOS 6.9 安装 Zabbix 3.0 详细教程
一、引言 在 Linux 环境下,有许多实用的系统监控软件,如 Nagios、Cacti、Zabbix、Monit等。这些开源软件能帮助我们更好地管理机器,及时发现问题并警告系统维护人员。今天我们将重点研究 Zabbix,使用它的目的是为了更好地监控MySQ…...
通俗的理解TCP的三次握手四次挥手
前言 本文是博主根据自身理解,尽量用最通俗的形式解释TCP的三次握手四次挥手。 一、三次握手:为什么不是两次或四次? 1. 三次握手过程 SYN:客户端发送SYN1, seqx(我要连接)SYNACK:服务器回复…...
【Python进阶】正则表达式实战指南:从基础到高阶应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:邮箱格式验证案例2:提取电话号码案例3:替换敏感信息 运行…...
linux下内存地址数学运算
如下代码计算地址并16字节对齐: char* buffer (char*)malloc(a3 0x1000);unsigned long long tmp (((unsigned long long)buffer 0x10) & 0xffffffffffffff00);char* buf (char*)tmp;假如把地址当作整数,加减程序运算,直接转换是不行…...
考研单词笔记 2025.04.22
abuse v/n滥用,妄用,虐待,伤害 adopt v采用,采纳,收养,领养,正式通过,批准 apply v应用,运用,申请,适用,有效 deploy v有效利用&am…...
JVM虚拟机-类加载器、双亲委派模型、类装载的执行过程
一、什么是类加载器,类加载器有哪些 我们目前要讲的就是类加载子系统,主要作用是将java源码编译为class字节码文件后装载到运行时数据区,运行时数据区就可以去分配内存再通过执行引擎来执行java代码。 启动类加载器(也称引导类加载器)&…...
神经网络的 “成长密码”:正向传播与反向传播深度解析(四)
引言 在神经网络的神秘世界里,正向传播和反向传播是驱动模型学习和进化的核心机制。它们如同神经网络的 “左右脑”,正向传播负责信息的前向流动与初步处理,反向传播则通过优化权重参数来提升模型性能,二者相辅相成,共…...
激活函数:神经网络的 “魔法开关”,开启智能之门(三)
引言 在神经网络的复杂架构中,激活函数扮演着至关重要的角色,堪称神经网络的 “魔法开关”。它赋予了神经网络强大的能力,让其能够处理各种复杂的任务。本文将深入剖析激活函数的重要性、引入原因、常见类型以及选择策略,并针对面…...
服装印花/印烫环节计算机视觉应用设计方案
服装印花/印烫环节计算机视觉应用设计方案 一、引言 随着消费者对服装个性化、多样化需求的增加,服装印花/印烫环节作为服装生产中的重要一环,其质量和效率直接影响到产品的竞争力和市场占有率。传统的服装印花/印烫环节存在以下痛点: 人为…...
vue3:十一、主页面布局(修改左侧导航条的样式)
一、样式 1、初始样式 2、 左侧导航栏搭建完成样式 二、实现 1、设置左侧导航栏底色 (1)去掉顶部和左侧导航栏的底色 初始页面效果 顶部与左侧底色样式 将代码中与顶部与左侧的样式删掉 移除后页面效果 加入设定背景色 #f4f6f9 加入底色后颜色展示 (2)去除菜单项底色 初…...
Sentinel源码—8.限流算法和设计模式总结二
大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…...
Docker 部署 MySQL 数据库
Docker 部署 MySQL 数据库 基于 Docker 部署 MySQL 数据库一、拉取 MySQL 镜像二、运行 MySQL 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 MySQL 数据库 一、拉取 MySQL 镜像 在开始之前,请确保你的 Docker 环境已经正确安装并可以正常运行。…...
【Linux运维涉及的基础命令与排查方法大全】
文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议,Linux中常用命令,以及平时运维中使用的排查网络故障的…...
映射(Mapping)和地址(Address)
Addresses (地址) 以太坊区块链由 _ account _ (账户)组成,你可以把它想象成银行账户。一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银…...
用Java实现简易区块链:从零开始的探索
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...
Spark-Streaming
Spark-Streaming 一、Spark-Streaming简介 1、Spark-Streaming概述 1.1、Spark-Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多,例如:Kafka、Flume、Twitter等,以及和简单的 TCP 套接字等等…...
工程投标k值分析系统(基于微服务实现)
1 需求总括 2 企业管理模块: 新增、删除、修改企业/部门 <...
WebGL 工作原理
WebGL在GPU上的工作基本上分为两部分 第一部分是将顶点(或数据流)转换到裁剪空间坐标 就是将传入的位置坐标,转换为0-1的值,并绘制出来每个顶点的坐标(传入的值)通过顶点着色器计算转换为裁剪空间坐标转换…...