第十六讲、isaaclab中使用任务空间(task-space)控制
0 前言
官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/05_controllers/run_diff_ik.html
Isaacsim+Isaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm=1001.2014.3001.5502
在之前的教程中我们利用关节空间(joint-space)来控制机器人,但是,在很多情况下使用任务空间(task-space)控制机器人更直观。比如若想远程操控机器人,实际上指定末端夹具姿态比指定关节位置更容易。
本教程中,将学习如何使用任务空间(task-space)控制机器人,我们将使用controllers.DifferentialIKController
类来跟踪末端执行器姿态命令。
教程对应的脚本为run_diff_ik.py
在scripts/tutorials/05_controllers
目录下。
运行该程序:
- 进入安装 isaac lab 时创建的conda虚拟环境
- 在该环境下进入 isaac sim文件夹中运行
source setup_conda_env.sh
- 终端中输入
./isaaclab.sh -p scripts/tutorials/05_controllers/run_diff_ik.py --robot franka_panda --num_envs 128
运行你的代码。
注意事项:
- 任务空间(task-space)控制机器时必须保证坐标系正确。
- 并行化环境中,不同环境之间只存在一个为一的模拟世界坐标系。
- 每个环境本身有自己的局部坐标系。
在我们的API中,我们使用以下符号来表示坐标系框架:
- 仿真世界坐标系 (World Frame, w):全局静态坐标系,作为整个虚拟仿真环境的绝对参考系,通常位于场景加载时的初始地面中心点
- 固定不变,所有实体位置最终都相对于此坐标系
- Z轴默认垂直向上(遵循Isaac Sim的Z-up约定)
- 局部环境坐标系 (Local Environment Frame, e):动态生成的相对坐标系,用于多环境并行训练场景,当使用num_envs > 1时,每个环境实例有自己的局部坐标系。
- 原点通常位于每个环境实例的初始生成位置
- 随环境重置而重新定位(如机器人复位时)
- 机器人基座坐标系 (Base Frame, b):固定在机器人基座(通常为底盘或躯干中心)的动坐标系
- 根据机器人USD模型中/Robot/base Prim的位置确定
- 可通过ArticulationCfg配置调整安装点
1 创建IK控制器
DifferentialIKController
类,可以机器人达到所需末端执行器姿态所需的关节位置。并且支持不同类型的逆运动学求解器,不同的算法可以通过ik_method
参数指定。
官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab/isaaclab.controllers.html#isaaclab.controllers.DifferentialIKController
https://isaac-sim.github.io/IsaacLab/main/source/api/lab/isaaclab.controllers.html#isaaclab.controllers.DifferentialIKControllerCfg.ik_method
在本教程中,我们将使用Damped Moore-Penrose Pseudo-Inverse(阻尼摩尔-彭罗斯伪逆) 来计算所需的关节位置。此外,由于我们想要追踪所需的末端执行器位姿,因此我们将使用绝对位姿命令模式。
# 配置控制器参数diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls")# DifferentialIKControllerCfg:控制器配置类,定义逆运动学控制器的行为参数。# command_type="pose":指定控制器接收的目标输入类型为位姿(位置 + 姿态),而非速度或力。# use_relative_mode=False:使用绝对坐标系(相对于世界坐标系),若为 True 则使用相对于当前末端执行器的相对坐标系。# ik_method="dls":选择逆运动学求解方法。# 实例化控制器diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=scene.num_envs, device=sim.device)# DifferentialIKController:差分逆运动学控制器类,根据配置生成关节控制指令。# num_envs=scene.num_envs:指定并行环境数量(如批量仿真中的多个独立环境)。# device=sim.device:设置计算设备(如 "cuda:0" 或 "cpu"),确保与仿真环境的数据存储位置一致。
2 获取机器人的关节和身体索引
**数据依赖:**差分逆运动学控制器(Differential IK Controller)是一个纯计算模块,不直接访问机器人模型数据。用户需主动提供以下信息:
- 关节位置:机器人机械臂(非夹爪)的当前关节角度。
- 末端执行器位姿:末端在全局坐标系中的位置和姿态([x, y, z, qx, qy, qz, qw])。
- 雅可比矩阵:描述末端速度与关节速度关系的矩阵。
注意:需从机器人模型中精准提取机械臂关节和末端数据,避免包含无关部分(如夹爪关节)。
**数据提取:**机器人模型通常包含多个关节和身体(如夹爪、底盘等),但IK控制器仅需特定部分:
- 关节位置:
ArticulationData.joint_pos
包含所有关节的位置,但需过滤出机械臂关节。(
若机器人有["arm_joint1", "arm_joint2", "gripper_joint"]
,需排除gripper_joint
。) - 末端位姿:
ArticulationData.body_state_w
包含所有身体的状态,但需仅选择末端执行器。
索引获取:
1、通过名称查找关节或身体的索引(名称拼写错误会导致返回空索引,引发后续逻辑错误。)
find_joints()
:arm_joint_indices = articulation.find_joints(["arm_joint1", "arm_joint2"])
find_bodies()
:ee_body_index = articulation.find_bodies(["end_effector"])[0]
2、封装索引解析逻辑,增加名称有效性检查,避免无效索引。(SceneEntityCfg
)
from omni.isaac.lab.scene import SceneEntityCfg# 配置机械臂关节和末端执行器
robot_cfg = SceneEntityCfg("robot",joint_names=["arm_joint1", "arm_joint2"],body_names=["end_effector"]
)
# 解析索引
arm_joint_indices = robot_cfg.resolve_joint_indices(articulation)
ee_body_index = robot_cfg.resolve_body_indices(articulation)[0]
# 配置可视化标记(坐标系标记)frame_marker_cfg = FRAME_MARKER_CFG.copy() # 复制默认的坐标系标记配置frame_marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) # 缩小坐标系标记尺寸为原10%(X/Y/Z轴长度均为0.1米)# 在指定路径创建末端执行器当前位置标记(蓝色坐标系)ee_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_current") # 在USD场景的/Visuals/ee_current路径下创建)# 在指定路径创建目标位置标记(红色坐标系)goal_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_goal") # 在USD场景的/Visuals/ee_goal路径下创建)# 定义末端执行器的目标位姿序列(位置+四元数姿态)ee_goals = [# 目标1: 位置(0.5, 0.5, 0.7),姿态绕X轴旋转180度(四元数[0.707, 0, 0.707, 0])[0.5, 0.5, 0.7, 0.707, 0, 0.707, 0], # 目标2: 位置(0.5, -0.4, 0.6),姿态绕Z轴旋转90度(四元数[0.707, 0.707, 0.0, 0.0])[0.5, -0.4, 0.6, 0.707, 0.707, 0.0, 0.0], # 目标3: 位置(0.5, 0, 0.5),姿态绕Y轴旋转180度(四元数[0.0, 1.0, 0.0, 0.0])[0.5, 0, 0.5, 0.0, 1.0, 0.0, 0.0], ]ee_goals = torch.tensor(ee_goals, device=sim.device) # 将列表转换为PyTorch张量,并放置在仿真设备(GPU/CPU)上current_goal_idx = 0 # 当前目标索引初始化为0(指向第一个目标)# 创建逆运动学指令缓冲区(shape: [num_envs, action_dim])ik_commands = torch.zeros(scene.num_envs, # 环境数量(并行仿真时可能有多个独立环境)diff_ik_controller.action_dim, # 动作维度(7维:3位置 + 4姿态四元数)device=robot.device # 设备与机器人数据一致(GPU加速))ik_commands[:] = ee_goals[current_goal_idx] # 将所有环境的指令初始化为第一个目标位姿# 根据命令行参数 args_cli.robot 选择机器人类型,并配置对应的关节和末端执行器名称。if args_cli.robot == "franka_panda":robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], # 使用正则表达式匹配所有以 panda_joint 开头的关节(如 panda_joint1, panda_joint2 等),排除夹爪关节。body_names=["panda_hand"])# 指定末端执行器为 Panda 的夹爪(panda_hand 身体)。elif args_cli.robot == "ur10":robot_entity_cfg = SceneEntityCfg("robot", joint_names=[".*"], # 正则表达式 .* 匹配所有关节(假设 UR10 模型没有夹爪,或需要全部关节参与计算)。body_names=["ee_link"])# 指定末端执行器为 UR10 的 ee_link 身体。else:raise ValueError(f"Robot {args_cli.robot} is not supported. Valid: franka_panda, ur10")# 解析场景实体索引robot_entity_cfg.resolve(scene)# 调用 SceneEntityCfg.resolve() 方法,根据场景中的实际机器人模型解析关节和身体的索引。# 内部调用 find_joints() 和 find_bodies(),通过正则表达式匹配关节/身体名称。# 解析结果存储在 robot_entity_cfg.joint_ids 和 robot_entity_cfg.body_ids 中。#计算末端执行器的雅可比索引if robot.is_fixed_base:ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1# 固定基座机器人(如 Franka Panda):# 1 物理引擎(如 Isaac Sim)返回的雅可比矩阵 不包含根身体(root body)。# 2 若末端执行器的身体索引为 N,则其在雅可比矩阵中的索引为 N-1。# 3 示例:假设 panda_hand 的 body_ids[0] 是 8(根身体为 0),则雅可比索引为 8-1=7。else:ee_jacobi_idx = robot_entity_cfg.body_ids[0]# 移动基座机器人(如移动机械臂)# 1 雅可比矩阵包含根身体(如移动底盘),因此直接使用 body_ids[0]。
3 计算机器人指令
STEP1:目标设定阶段
- 通过
set_command()
设置基座坐标系下的目标位姿,控制器内部存储该指令。 - 可与控制循环异步执行(例如每100ms更新一次目标)。
# 重置逆运动学控制器内部状态(如积分项、历史误差等)
# 通常在每次开始新任务或目标切换时调用,确保控制器从干净状态开始
diff_ik_controller.reset()# 设置目标末端执行器位姿指令(所有并行环境共享同一目标)
# ik_commands 是形状为 [num_envs, 7] 的张量,包含 [x, y, z, qx, qy, qz, qw]
# 坐标系为机器人基座坐标系(base frame),而非世界坐标系
diff_ik_controller.set_command(ik_commands)
STEP2:状态获取阶段
- 雅可比矩阵:反映末端速度与关节速度关系的瞬时线性化矩阵,物理引擎实时计算。
- 坐标系转换:控制器需基于基座坐标系计算误差,因此需将末端位姿从世界坐标系转换到基座坐标系。
# 从物理引擎获取机器人雅可比矩阵数据(实时更新)
# root_physx_view.get_jacobians() 返回形状为 [num_envs, num_bodies, 6, total_dof] 的张量
# 通过索引操作提取特定末端执行器对应的雅可比矩阵:
# - ee_jacobi_idx : 末端执行器在雅可比矩阵中的索引(已考虑固定基座偏移)
# - robot_entity_cfg.joint_ids : 机械臂关节的物理引擎索引列表
# 最终 jacobian 形状为 [num_envs, 6, num_arm_joints]
jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids]# 获取末端执行器在世界坐标系中的位姿(位置+四元数姿态)
# body_state_w 形状为 [num_envs, num_bodies, 13](包含位置、姿态、速度等信息)
# 索引 [:, robot_entity_cfg.body_ids[0], 0:7] 提取第一个末端身体的 [x, y, z, qx, qy, qz, qw]
ee_pose_w = robot.data.body_state_w[:, robot_entity_cfg.body_ids[0], 0:7]# 获取机器人基座(root)在世界坐标系中的位姿
# root_state_w 形状为 [num_envs, 13],索引 [:, 0:7] 提取基座 [x, y, z, qx, qy, qz, qw]
root_pose_w = robot.data.root_state_w[:, 0:7]# 获取当前机械臂关节角度(仅目标关节,排除夹爪等无关关节)
# joint_pos 形状为 [num_envs, num_arm_joints]
joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids]# 将末端执行器的世界坐标系位姿转换为基座坐标系下的位姿
# 输入:基座位置(root_pos_w)和姿态(root_quat_w),末端位置(ee_pos_w)和姿态(ee_quat_w)
# 输出:基座坐标系下的末端位置(ee_pos_b)和姿态(ee_quat_b)
# 数学等效:T_base_to_world * T_ee_to_base = T_ee_to_world → 求解 T_ee_to_base
ee_pos_b, ee_quat_b = subtract_frame_transforms(root_pose_w[:, 0:3], # 基座位置 (x, y, z)root_pose_w[:, 3:7], # 基座姿态四元数 (qx, qy, qz, qw)ee_pose_w[:, 0:3], # 末端世界位置ee_pose_w[:, 3:7] # 末端世界姿态
)
STEP3:逆解计算阶段
- 调用
compute()
结合当前状态与目标,通过数值优化(如DLS)求解关节角度增量。 - 内部可能包含阻尼最小二乘、关节限位处理等逻辑。
# 逆运动学核心计算:基于当前状态求解目标关节角度
# 输入:
# - ee_pos_b : 基座坐标系下的末端当前位置 [num_envs, 3]
# - ee_quat_b : 基座坐标系下的末端当前姿态 [num_envs, 4]
# - jacobian : 当前雅可比矩阵 [num_envs, 6, num_arm_joints]
# - joint_pos : 当前关节角度 [num_envs, num_arm_joints]
# 输出:
# - joint_pos_des : 期望关节角度 [num_envs, num_arm_joints]
joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos)
STEP4:动作应用阶段
- 将计算的关节角度直接设为目标位置,底层可能通过PD控制器实现跟踪。
write_data_to_sim()
将数据同步到物理引擎,触发下一帧仿真计算。
# 将计算得到的关节角度目标值应用到机器人
# 通过 joint_ids 指定仅更新机械臂关节(不包含夹爪等)
robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids)# 将更新后的关节目标值写入物理引擎,准备下一仿真步计算
scene.write_data_to_sim()
相关文章:
第十六讲、isaaclab中使用任务空间(task-space)控制
0 前言 官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/05_controllers/run_diff_ik.html IsaacsimIsaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm1001.2014.3001.5502 在之前的教程中我们利…...
无人船 | 图解基于PID控制的路径跟踪算法(以欠驱动无人艇Otter为例)
目录 1 PID控制的三大组成1.1 比例控制作用1.2 积分控制作用1.3 微分控制作用 2 基于欠驱动运动学的PID控制3 跟踪效果分析 1 PID控制的三大组成 PID控制律的定量表达请参考无人船 | 图解基于PID控制的路径跟踪算法(以全驱动无人艇WAMV为例),本文进一步介绍PID每个…...
【C++】13.list的模拟实现
首先,我们需要把链表管理起来,也就是把一个个节点管理起来,但是每个节点的信息我们也需要管理,例如节点的前驱指针和后驱指针,以及节点的值,所以我们这里先封装两个类来管理节点和链表。 namespace Ro {te…...
Springfox + Swagger 的完整配置及同类框架对比的详细说明
以下是 Springfox Swagger 的完整配置及同类框架对比的详细说明: 一、Springfox Swagger 配置详解 1. 添加依赖 在 pom.xml 中添加以下依赖: <!-- Springfox Swagger 2 --> <dependency><groupId>io.springfox</groupId>…...
实现支付宝沙箱环境搭建
1.介绍 在业务开发的过程中,有时会涉及到一些支付相关的功能,这个时候就需要接入第三方支付接口,而由于开发中需要不断进行测试,使用真实的账号进行支付就有些不值得,所以支付宝为我们提供了第三方SDK,供我…...
element-ui transfer 组件源码分享
transfer 穿梭框组件源码简单分享,主要从以下几个方面: 1、transfer 组件页面结构。 2、transfer 组件属性。 3、transfer 组件方法。 4、transfer 组件事件。 5、transfer slot 挂载。 一、组件页面结构。 二、组件属性。 2.1 value / v-model 绑…...
【最新版】沃德代驾源码全开源+前端uniapp
一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源,代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等。用户可以通过小程序预约代驾服务,系统会估算代驾价格并推送附近代驾司机供用户选择&…...
【无标题】spark安装部署
Spark 4种部署模式的另外2种,分别是Yarn、windows模式。 二、 实验准备工作: 1. 三台linux虚拟机 2. spark的压缩包 三、 实验步骤 Spark-yarn 1. 解压缩文件,并重命名为spark-yarn。 tar zxvf spark-3.0.0-bin-hadoop3.2.tgz mv spar…...
【异常解决】Spring Boot 返回排序后的 Map 但前端接收顺序不对的解决方案
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
中兴云电脑W102D_晶晨S905X2_216G_mt7661无线_安卓9.0_线刷固件包 准备工作: 工具和设备在开始刷机之前,确保你已经准备好以下物品:双公头USB线:选择一根30-50厘米长的USB线,长度适中,方便操作,…...
深度学习激活函数与损失函数全解析:从Sigmoid到交叉熵的数学原理与实践应用
目录 前言一、sigmoid 及导数求导二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、极大似然估计与交叉熵损失函数8.1 极大似然估计与交叉熵损失函数算法理论8.1.1 伯努利分布8.1.2 二项分布8.1.3 极大似然估计总结 前言 书接上文 PaddlePaddle线性回归详解…...
Kotlin中实现静态
实现“类似静态” class Util {fun action1() {}//使用companion object关键字会在类的内部创建一个伴生类,每个类都允许有一个伴生类//而action2作为伴生类中的方法,可以直接通过类名进行调用,实现类似“静态”的效果companion object {fun…...
Android 回显
//执行 private void playRunTime(String cmd) throws Exception { Process p Runtime.getRuntime().exec(cmd); InputStream is p.getInputStream(); BufferedReader reader new BufferedReader(new InputStreamReader(is)); String l…...
基于大模型的胃食管反流病全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、胃食管反流病概述 2.1 疾病定义与分类 2.2 流行病学特征 2.3 发病机制 三、大模型技术原理与应用基础 3.1 大模型简介 3.2 适用于胃食管反流病预测的大模型类型 3.3 数据收集与预处理 四、大模型在胃食…...
class文件(二)
字段表集合: 用于描述接口或类中声明的变量 包括类级变量以及实例级变量,不包括方法内部声明的局部变量 字段的修饰符包括: 作用域:public、private、protected修饰符 实例还是类变量:static 可变性:fin…...
Django 实现电影推荐系统:从搭建到功能完善(附源码)
前言:本文将详细介绍如何使用 Django 构建一个电影推荐系统,涵盖项目的搭建、数据库设计、视图函数编写、模板渲染以及用户认证等多个方面。🔗软件安装、环境准备 ❤ 【作者主页—📚阅读更多优质文章、获取更多优质源码】 目录 一…...
UML2.0中的14种图简介,并借助AI生成UML图
UML2.0中的14种图简介,并借助AI生成UML图 绘制流程结构图(Structure Diagrams)1. 类图(Class Diagram):2. 对象图(Object Diagram):3. 组件图(Component Diag…...
Jsoup、Selenium 和 Playwright 的含义、作用和区别
文章目录 一、Jsoup1. 含义2. 作用3. 核心特性4. 适用场景 二、Selenium1. 含义2. 作用3. 核心特性4. 适用场景 三、Playwright1. 含义2. 作用3. 核心特性4. 适用场景 四、Jsoup、Selenium 和 Playwright 的区别五、适用场景对比六、总结 Jsoup、Selenium 和 Playwright 都是用…...
服务器如何修复SSL证书错误?
修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案: --- ### **1. 确认错误类型** 首先检查浏览器或工具(如OpenSSL)报错的具体信息,常见错误包括: - **证书过期**…...
AD9253链路训练
传统方式 参考Xilinx官方文档xapp524。对于AD9253器件 - 125M采样率 - DDR模式,ADC器件的DCO采样时钟(500M Hz)和FCO帧时钟是中心对齐的,适合直接采样。但是DCO时钟不能直接被FPGA内部逻辑使用,需要经过BUFIO和BUFR缓冲后,得到s_b…...
VAE-LSTM异常检测模型复刻报告
VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法,用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下: Python 3.…...
有哪些信誉良好的脂多糖供应商推荐?
一般描述 Sigma-Aldrich的脂多糖 (LPS) 是糖脂,由连接单个或多个脂肪酸的碳水化合物单元组合而成,存在于革兰氏阴性菌细胞壁中。LPS是外膜的重要组成部分,结构由脂质A、葡萄糖胺基磷脂、短核寡糖和O-抗原(远端多糖)组…...
初识分布式事务原理
事务是指符合ACID特性的操作就是事务,在同一个数据库中,如果要分别对表A和表B进行插入和删除操作,如果其中一个操作执行失败,可以对当前数据库进行回滚,使其回滚到执行操作前的状态,但是现有的系统架构都是…...
文件上传过程中出现EOFException的解决方案
文件上传过程中出现EOFException的解决方案 项目场景: 项目是一个考试测评系统,包含学生答题截图上传功能。学生通过前端界面提交答题截图,后端服务接收并处理这些图片文件,存储到MinIO对象存储中。 问题描述 前端调用’提交答…...
智能文档解析系统架构师角色定义
(根据专业写作类任务要求,以系统架构师角色定义范式进行结构化呈现) 智能文档解析系统架构师角色定义 核心技能模块 1. 多模态语义解析引擎 支持中英双语对齐的异构数据解码遵循ISO/IEC 30140标准的JSON语法校验体系 ├─ 智能字段补全机…...
翻倍缠论系统+拐点多空雷达,组合指标的使用操盘技术
如上图,单独从副图指标信号来说,在标记①的位置,开始出现副图指标【拐点多空雷达】转多的买点,红柱开始出现就是跟进做多的第一买点。 在标记②的位置,副图指标出现红柱持续,而黑色的柱线开始出现…...
Linux脏页相关参数
参数 以下是Linux内核中与脏页(Dirty Page)相关的各个参数及其含义的详细说明: 1. vm.dirty_background_bytes 含义:系统内存中脏页数量的绝对字节阈值(单位为字节),当脏页达到此值时&#x…...
C++20 module下的LVGL模拟器
ARM GCC:14.2 Toolchain:MSVC 前篇:使用SDL2搭建简易LVGL模拟器_lvgl sdl-CSDN博客 故事 从前 我所用的单片机工程本身是为了电赛设计的,由于电赛的特性,需要使用同一个实验平台通过不同外设的“排列组合”来实现不…...
Go全栈_Golang、Gin实战、Gorm实战、Go_Socket、Redis、Elasticsearch、微服务、K8s、RabbitMQ全家桶
Go全栈全家桶包含: 1、【零基础入门】Go语言核心编程零基础入门实战,B站学习地址分享: 【2025年新版】Go语言教程 2、GolangGinGorm仿小米商城企业级项目实战 3、Golang仿小米商城高并发微服务实战 4、Golang RabbitMQ高并发秒杀、抢购、预约…...
STM32提高篇: 蓝牙通讯
STM32提高篇: 蓝牙通讯 一.蓝牙通讯介绍1.蓝牙技术类型 二.蓝牙协议栈1.蓝牙芯片架构2.BLE低功耗蓝牙协议栈框架 三.ESP32-C3中的蓝牙功能1.广播2.扫描3.通讯 四.发送和接收 一.蓝牙通讯介绍 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技…...
Linux系统编程---精灵进程与守护进程
1、前言 精灵进程又称守护进程、后台进程,在英文中称为 daemon 进程。精灵进程是运行在一个相对干净的环境、不受终端影响、常驻内存的进程,和神话中的精灵一样,拥有不死不灭的特性,长期稳定提供某种功能或服务。 在Linux系统中&a…...
《让机器人读懂你的心:情感分析技术融合奥秘》
机器人早已不再局限于执行简单机械的任务,人们期望它们能像人类伙伴一样,理解我们的喜怒哀乐,实现更自然、温暖的互动。情感分析技术,正是赋予机器人这种“理解人类情绪”能力的关键钥匙,它的融入将彻底革新机器人与人…...
科技项目必须进行验收测试吗?项目验收测试服务机构有哪些?
在现代科技迅猛发展的背景下,各类科技项目层出不穷,从智能硬件到软件系统,乃至工业自动化解决方案,项目的质量直接关系到企业的信誉、用户体验和市场竞争力。那么科技项目必须进行验收测试吗? 简短且明确的回答是:必…...
7.7 Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践
Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践 连接前端与后端 API:全链路数据交互设计指南 关键词:前后端通信架构设计、RESTful API 开发、Axios 请求拦截、Redux 状态管理、JWT 认证集成 1. 前后端通信架构设计原则 我们采用分层架构实现前后端解耦,通过 RES…...
零基础入门 Verilog VHDL:在线仿真与 FPGA 实战全流程指南
摘要 本文面向零基础读者,全面详解 Verilog 与 VHDL 两大主流硬件描述语言(HDL)的核心概念、典型用法及开发流程。文章在浅显易懂的语言下,配合多组可在线验证的示例代码、PlantUML 电路结构图,让你在 EDA Playground 上动手体验数字电路设计与仿真,并深入了解从 HDL 编写…...
[蓝桥杯 2025 省 Python B] 最多次数
import sysdef max_times() -> int:s sys.stdin.readline().strip()checked {l,q,b} # set(),不存在键值对,识别为set()n len(s)time 0i 0while i < n - 2:sec s[i:i3]if set(sec) checked:i 3time 1else:i 1sys.…...
HTTP相关
目录 一、HTTP状态码 1XX信息性状态码 2XX成功状态码 3XX重定向状态码 4XX客户端错误状态码 5XX服务器错误状态码 二、GET/POST/PUT/DELETE请求 2.1GET 2.2POST 2.3PUT 2.4DELETE 2.5RESTful API例子 三、RESTful API 3.1什么是RESTful API 3.2RESTful API中的关…...
使用rclone迁移minio文件
文章目录 一、rclone简介1、工具说明2、核心特点2.1、跨平台支持2.2、多存储支持2.3、加密与安全2.4、增量同步与断点续传2.5、高性能 3、适用场景3.1、云存储迁移3.2、备份与同步3.3、跨云协作3.4、数据加密归档 二、常用命令1、基础操作2、文件传输3、文件管理4、高级功能5、…...
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题 背景需求: 我们目前有一个基于Cube飞控的无人机系统,需实现以下核心功能: 多机通信:通过MAVLink协议同时连接并控制多架无人机&#x…...
Super-Vlan和MUX-Vlan的原理、配置、区别
Super-Vlan 原理 Super-Vlan也叫Aggregate-Vlan。 一般的三层交换机中,通常是采用一个VLAN对应一个vlanif接口的方式实现广播域之间的互通,这在某些情况下导致了IP地址的浪费。因为一个VLAN对应的子网中,子网号、子网定向广播地址、子网缺…...
数据一致性问题剖析与实践(二)——单机事务的一致性问题
一、前言 我们一般讲到单机事务,离不开的就是数据库,其最重要的定义就是,要么全部成功执行,要么全部不执行,保证安全的状态转化。 之前我们讨论了几种场景的一致性问题 冗余数据存储中的一致性问题分布式共识中的一…...
VUE Element-ui Message 消息提示组件自定义封装
为了让message 信息提示的更加方便快捷,减少不同地方的调用,避免代码的重复,特意再官方message 组件的基础上二次封装,使代码更加的优雅和高效。 实现效果: 代码组件: 封装成 message.js 文件,…...
HSTL详解
一、HSTL的基本定义 HSTL(High-Speed Transceiver Logic) 是一种针对高速数字电路设计的差分信号接口标准,主要用于高带宽、低功耗场景(如FPGA、ASIC、高速存储器接口)。其核心特性包括: 差分信号传输&…...
【PCB工艺】运放电路中的负反馈机制
通过运算方法器电路设计详细解释负反馈机制(Negative Feedback) 负反馈 是控制系统、电子电路、神经系统等多个领域中非常核心的概念。特别在运算放大器(Op-Amp)电路中,负反馈是实现精确控制和高稳定性的关键机制。 …...
玩转Docker | 使用Docker部署Neko自托管浏览器
玩转Docker | 使用Docker部署Neko自托管浏览器 前言一、Neko介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Neko服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问Neko服务访问Neko首页登录Neko五、基本使用设置键…...
聊聊自动化用例的维护
自动化测试中的农药悖论:为何长期维护至关重要 自动化测试常被视为"一次编写,永久有效"的解决方案,但随着时间的推移,即使设计最精良的测试套件也会逐渐失效。这种现象被称为农药悖论(Pesticide Paradox&am…...
OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…...
Docker配置带证书的远程访问监听
一、生成证书和密钥 1、准备证书目录和生成CA证书 # 创建证书目录 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密钥和证书 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、为…...
监督学习(Supervised Learning)与无监督学习(Unsupervised Learning)
监督学习与无监督学习是机器学习的两大核心范式,主要区别在于数据是否包含明确的“标签”(目标输出)。 1. 监督学习(Supervised Learning) 定义: 数据形式:输入数据&…...
批量将多个 Excel 表格中的某张图片替换为新的图片
对于 Excel 文档,相信大家都不陌生,我们可以在 Excel 单元格中插入各种各样的图片,我们也可以将 Excel 表格中的图片替换为新的图片,常规的做法我们都是通过 Office 来进行单个处理的,但是如果我们遇到批量处理的场景&…...