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

机器人的手眼标定——机器人抓取系统基础系列(五)

机器人的手眼标定——机器人抓取系统基础系列(五)

  • 前言
  • 一、机器人标定相关概念
    • 1.1 内参标定和外参标定
    • 1.2 Eye-in-Hand 和 Eye-to-Hand
    • 1.3 ArUco二维码和棋盘格标定区别
  • 二、机器人标定基本原理
    • 2.1 机器人抓取系统坐标系
    • 2.2 标定原理
  • 三、标定步骤和注意事项
    • 3.1 高质量教程推荐
    • 3.2 主要步骤回顾
      • 3.2.1 标定功能包安装
      • 3.2.2 Launch文件配置
      • 3.2.3 标定执行与测试
    • 3.3 相关问题与说明
  • 总结


前言

机器人的手眼标定是机器人完成抓取的重要一步,它能够将相机检测到的物体映射到机器人坐标系中,便于机器人完成抓取。

本文将首先介绍手眼标定的易混概念与标定原理,然后介绍其标定实操。由于实操部分网上已经有非常多的教程,所以此部分主要推荐高质量教程并补充说明,主要起到拾遗补缺的作用。


一、机器人标定相关概念

机器人抓取的流程包括物体的识别和定位,位姿估计,手眼标定,机器人规划,夹爪控制等部分。其中手眼标定作为重要一环,其能够将相机的计算结果通过坐标系转换映射到机器人坐标系中,便于机器人抓取。

为了方便对标定过程的介绍,首先需要介绍相关的基本概念如下:

1.1 内参标定和外参标定

相机内参标定:内参是相机内部的基本参数,包括镜头焦距、畸变等。一般相机出厂时内参已标定完成,保存在相机内部。内参标定的目的是确定相机的内部参数,以便将图像坐标转换为相机坐标系中的坐标。

关于Realsense相机的内参自动标定的说明:
Realsense相机固件版本为5.12.02.100及以上的相机,可以通过Realsense Viewer界面手动触发自动标定功能。
但是需要注意的是Realsense D4××系列相机的自标定功能主要用于恢复深度性能,而不是针对RGB相机的内参标定。
如果需要对RGB相机进行内参标定,仍需要使用其他工具(如OpenCV)或手动标定。

相机外参标定:外参表示的是机器人与相机之间的位姿转换关系,即手眼关系,因此相机外参的标定称之为机器人手眼标定。外参标定就是确定相机坐标系相对于机器人位姿。

本文所说的手眼标定指的是相机的外参标定

1.2 Eye-in-Hand 和 Eye-to-Hand

Eye-in-Hand:相机安装在机械臂的末端执行器上,随着机械臂的运动而移动。主要解决相机与机械臂末端的相对关系。适用于需要机械臂携带相机进行动态操作的场景。
眼在手内和眼在手外

图1:眼在手内和眼在手外。左:眼在手内示意图;右:眼在手外示意图。

Eye-to-Hand:相机固定在机械臂之外的某个位置,通常安装在工作台或机器人基座上。主要解决相机与机械臂基座的相对关系。适用于相机固定不动,机械臂末端需要根据相机信息进行操作的场景。

本文主要讲解Eye-to-Hand的手眼标定案例,对于Eye-in-Hand可以依此类推。

1.3 ArUco二维码和棋盘格标定区别

常用的标定板工具包括ArUco二维码和棋盘格,它们两者区别由DeepSeek总结如下表所示。
在这里插入图片描述

由上述表格可知,总体来讲,使用棋盘格标定的精度会更高一点,因为其有多个角点的约束,但同时其也对环境和光照有一定的要求,因为棋盘格占用空间更大,需要清楚检测出所有的角点。

本文则是采用ArUco二维码进行标定,其面积较小,布置灵活,可以方便的粘贴在机器人末端执行器上进行眼在手外情况的标定。

二、机器人标定基本原理

本节主要介绍Eye to hand的手眼标定原理,对于Eye-in-Hand的情况可以依次类推。

2.1 机器人抓取系统坐标系

  • 世界坐标系:代表物体在真实世界里的三维坐标。所有其他坐标系都是相对于世界坐标系来定义的。
  • 相机坐标系:代表以相机光学中心为原点的坐标系,光轴与 z 轴重合。
  • 机器人坐标系:此为机器人坐标系的起始点,通常与机器人基座或底座的中心对应。
  • 末端坐标系:为相对于机器人末端执行器(工具)来定义的坐标系。其原点通常位于末端执行器的中心,并且与基座坐标系的位置和方向有关。
  • 标定板坐标系:代表标定板在真实世界中的坐标系,用于确定相机与机器人之间的相对位置和方向。

对于眼在手外的情形(图1(右)),机器人的手眼标定的目标就是求相机坐标系相对机器人底座坐标系的齐次转换矩阵。

注:在相机识别过程中,还会涉及到图像坐标系和像素坐标系,本文暂不涉及。

2.2 标定原理

如图1(右)所示,机器人通过多次调整机械臂末端的位姿完成标定,其标定原理如下。其中Robot为机器人坐标系,End为工具坐标系,Camera为相机坐标系,Object此处为标定板坐标系。
T End Robot1 ⋅ T Robot1 Camera1 ⋅ T Camera1 Object = T End Robot2 ⋅ T Robot2 Camera2 ⋅ T Camera2 Object \mathbf{T}_{\text{End}}^{\text{Robot1}} \cdot \mathbf{T}_{\text{Robot1}}^{\text{Camera1}} \cdot \mathbf{T}_{\text{Camera1}}^{\text{Object}} = \mathbf{T}_{\text{End}}^{\text{Robot2}} \cdot \mathbf{T}_{\text{Robot2}}^{\text{Camera2}} \cdot \mathbf{T}_{\text{Camera2}}^{\text{Object}} TEndRobot1TRobot1Camera1TCamera1Object=TEndRobot2TRobot2Camera2TCamera2Object
移项可得如下公式:
T End Robot2 ⋅ ( T End Robot1 ) − 1 ⋅ T Robot1 Camera1 = T Robot2 Camera2 ⋅ T Camera2 Object ⋅ ( T Camera1 Object ) − 1 \mathbf{T}_{\text{End}}^{\text{Robot2}} \cdot (\mathbf{T}_{\text{End}}^{\text{Robot1}})^{-1} \cdot \mathbf{T}_{\text{Robot1}}^{\text{Camera1}} = \mathbf{T}_{\text{Robot2}}^{\text{Camera2}} \cdot \mathbf{T}_{\text{Camera2}}^{\text{Object}} \cdot (\mathbf{T}_{\text{Camera1}}^{\text{Object}})^{-1} TEndRobot2(TEndRobot1)1TRobot1Camera1=TRobot2Camera2TCamera2Object(TCamera1Object)1
A ⋅ X = X ⋅ B \mathbf{A} \cdot \mathbf{X} = \mathbf{X} \cdot \mathbf{B} AX=XB
其中X就是我们要求的目标,相机坐标系与机器人坐标系的关系。

注意此处并没有使用到Object(标定板)相对于End(末端)的转换关系,这有助于我们理解标定板的固定方式(本文3.3节问题一)。

三、标定步骤和注意事项

对于标定过程,网上已经有海量的教程,没有必要再累述,主要是推荐一下高质量教程,回顾一下步骤,另外再说明一下常见疑惑问题,主要起到拾遗补缺的作用。

3.1 高质量教程推荐

小编看了网上不少的教程,个人推荐以下两个教程,这两篇文章步骤清晰完整,同时对易出错的地方进行了解释,可以结合着来看:

1) CSDN博客文章:UR5、realsense手眼标定
网址:https://blog.csdn.net/weixin_43735353/article/details/106128655;

2) 知乎文章:【手眼标定】ros / easy_handeye + ur5 + realsense d435i
网址:https://zhuanlan.zhihu.com/p/92339362。

3.2 主要步骤回顾

基于上述推荐教程,此部分对标定的流程进行快速的回顾,使铁子们有一个宏观的廓。主要步骤包括相关ROS功能包的安装,Launch文件配置,和标定执行。

3.2.1 标定功能包安装

因为手眼标定需要同时启动机器人,相机,以及相关的标定ROS功能包,所以最好是已经完成本系列教程前述的UR驱动和Realsense相机的相关配置。

接下来就是标定相关的功能包的安装,包括aruco_ros,vision_visp,和easy_handeye三个ROS功能包,这些所有的功能包需要下载到同一个工作空间中并编译,具体教程参考本文3.1 高质量教程推荐

用于手眼标定的三个功能包的作用:
1)aruco_ros 主要用于检测和定位aruco二维码;
2)vision_visp 提供视觉跟踪和伺服功能;
3)easy_handeye 则负责计算和存储手眼标定结果。

3.2.2 Launch文件配置

刚刚提到easy_handeye负责计算手眼标定结果,在计算时需要我们运行其功能包中的launch文件启动上述所有标定需要的节点,其中包括UR机器人节点,Realsense相机节点,aruco节点,easy_handeye节点的启动。

我们可以在这个功能包的路径(xxx/easy_handeye/docs/example_launch/ur5_kinect_calibration.launch)中找到示例launch文件并在此基础上修改。这个示例launch文件不在launch文件夹下,所以需要将其复制到easy_handeye功能包的Launch文件夹,再修改,当然也可以重命名。

此处贴上个人的launch文件:

<?xml version="1.0" ?>
<launch><arg name="namespace_prefix" default="ur5e_realsense_calibration" /><arg name="eye_on_hand" default="false" /><arg name="camera_namespace" default="/camera/color" /><arg name="robot_ip" doc="The IP address of the UR5 robot" default="192.168.31.2" /><arg name="marker_size" doc="Size of the ArUco marker used, in meters" default="0.1" /><arg name="marker_id" doc="The ID of the ArUco marker used" default="582"/><!-- start the realsense --><include file="$(find realsense2_camera)/launch/rs_camera.launch" ><arg name="color_height" value="1080" /><arg name="color_width" value="1920" /><arg name="color_fps" value="30" /></include><!-- start ArUco --><node name="aruco_tracker" pkg="aruco_ros" type="single"><remap from="/camera_info" to="/camera/color/camera_info" /><remap from="/image" to="/camera/color/image_raw" /><param name="image_is_rectified" value="true"/><param name="marker_size"        value="$(arg marker_size)"/><param name="marker_id"          value="$(arg marker_id)"/><param name="reference_frame"    value="camera_color_frame"/><param name="camera_frame"       value="camera_color_frame"/><param name="marker_frame"       value="camera_marker" /></node><!-- start the robot --><!-- calibration of the robot --><include file="$(find ur_calibration)/launch/calibration_correction.launch"><arg name="robot_ip" value="$(arg robot_ip)" /><arg name="target_filename" value= "$(find ur_robot_driver)/config/my_robot_calibration.yaml"/></include><!-- bring up the real robot --><include file="$(find ur_robot_driver)/launch/ur5e_bringup.launch"><arg name="robot_ip" value="$(arg robot_ip)" /><arg name="kinematics_config" value= "$(find ur_robot_driver)/config/my_robot_calibration.yaml"/></include><!-- moveit --><include file="$(find ur5e_moveit_config)/launch/moveit_planning_execution.launch"></include><!-- start easy_handeye --><include file="$(find easy_handeye)/launch/calibrate.launch" ><arg name="namespace_prefix" value="$(arg namespace_prefix)" /><arg name="eye_on_hand" value="$(arg eye_on_hand)" /><arg name="tracking_base_frame" value="camera_color_frame" /><arg name="tracking_marker_frame" value="camera_marker" /><arg name="robot_base_frame" value="base" /><arg name="robot_effector_frame" value="tool0" /><arg name="freehand_robot_movement" value="false" /><arg name="robot_velocity_scaling" value="0.5" /><arg name="robot_acceleration_scaling" value="0.2" /><arg name="translation_delta_meters" default="0.05"  /><arg name="rotation_delta_degrees" default="25"  /></include></launch>

注意事项如下:

aruco码:
a) aruco码的下载地址为网站;
b) Dictionary 一定要选 Original ArUco;
c) Marker ID 和 Marker size 自选,在launch 文件中做相应的修改;
d) 打印时,要选择原始大小,否则要测量一下打印出来的真实大小;

机器人节点
a) 用机器人的真实ip替代launch文件中的robot_ip参数;
b) 注意UR机器人的一些功能包的名称,不同版本的驱动可能会有所差别;

easy_handeye节点
a) eye_on_hand参数的设置,眼在手外:value为 false;
b) robot_base_frame为机器人基座坐标系,robot_effector_frame为工具坐标系;
c) robot_effector_frame工具坐标系是测试时用来固定aruco二维码的;

3.2.3 标定执行与测试

将下载和打印的aruco二维码只作成标定板,将其固定在末端执行器上,固定方式和位置自行决定(本文3.3节解释为什么)。

在工作空间中执行launh文件:

roslaunch easy_handeye ur5e_realsense_calibration.launch

Launch文件执行之后会出现以下三个界面(如图2所示):
请添加图片描述

图2:手眼标定实施截图。
①为打开的Rviz软件,其中包含机器人的状态并且可以调出/camera/color/image_raw话题,观察aruco二维码的实时位姿;
②用来调节机器人的末端位姿,也就是标定板的位姿;
③用来选择标定算法,记录采集到标定板位姿,并完成计算与保存标定结果。

具体的标定步骤参考推荐的高质量教程1:UR5、realsense手眼标定,其介绍的标定过程非常详细。

3.3 相关问题与说明

在标定的过程中,铁子们也包括我在内可能会有这样那样的疑惑,这里对这些疑惑进行了整理,希望能对其了解地更深入一点。

1)为什么末端坐标系的选择和标定板的固定位置没有那么重要?

根据本文2.2节标定原理所示,在标定的过程中始终使用的是相机相对于标定板的转换矩阵和末端相对于机器人底座的转换矩阵(如下图3所示),并没有使用标定板相对于末端的转换矩阵,也就是说这两者之间的相对位姿不重要,只需要保证它们之间的位姿固定即可。

此外,末端坐标系所在的部件只要是和标定板处于同一个构件上即可,对末端坐标系的选择是不限制的,可以选取末端wrist的坐标系,也可以选择末端tool的坐标系。
在这里插入图片描述

图3:眼在手外情况下的坐标系关系。
T 相机 标定板 \mathbf{T}_{\text{相机}}^{\text{标定板}} T相机标定板为已知,可变的;
T 末端 机器人底座 \mathbf{T}_{\text{末端}}^{\text{机器人底座}} T末端机器人底座为已知,不变的;
T 机器人底座 相机 \mathbf{T}_{\text{机器人底座}}^{\text{相机}} T机器人底座相机为未知,不变的,需要求解的;
T 标定板 末端 \mathbf{T}_{\text{标定板}}^{\text{末端}} T标定板末端为未知,不变的,不需要求解的;

2)不同标定算法的区别,标定算法选哪个?

如图2中③所示,calibration algorithm是可以选择的。对于本文的标定板的形状和尺寸已知的情况,可以选择Tsai-Lenz(默认算法)或Park算法(第二个)。

Tsai-Lenz算法是一种经典的手眼标定方法,它通过最小化重投影误差来求解相机和机器人末端执行器之间的相对位置和姿态。
而Park算法是一种改进的Tsai-Lenz算法,它通过引入更多的约束条件来提高标定的精度和鲁棒性。

此处从精度和鲁棒性的角度,个人推荐第二个Park算法。更多关于标定算法的对比可以参考下述两篇综述文章:

  1. Jiang J, Luo X, Luo Q, et al. An overview of hand-eye calibration[J]. The International Journal of Advanced Manufacturing Technology, 2022, 119(1): 77-97.
  2. Enebuse I, Foo M, Ibrahim B S K K, et al. A comparative review of hand-eye calibration techniques for vision guided robots[J]. IEEE Access, 2021, 9: 113143-113155.

3)标定好的转换矩阵如何使用?如何将物体的坐标系转换到机器人坐标系中进行抓取?

最终标定保存的结果为相机坐标系相对于机器人基座的坐标系,在机器人实际抓取的过程中,需要将其标定的结果发布出去,发布指令如下所示:

roslaunch easy_handeye publish.launch

其标定结果可以用于计算相机视野中物体的位姿到机器人坐标系的位姿,进而给机器人发指令去抓取该物体,即 T 待抓取物 机器人 = T 待抓取物 相机 ⋅ T 相机 机器人 \mathbf{T}_{\text{待抓取物}}^{\text{机器人}}=\mathbf{T}_{\text{待抓取物}}^{\text{相机}} \cdot \mathbf{T}_{\text{相机}}^{\text{机器人}} T待抓取物机器人=T待抓取物相机T相机机器人


总结

本文主要介绍了机器人手眼标定的相关概念,标定原理,以及标定实操。对易混淆概念进行了详细阐述,并重点介绍了实操方面的注意事项和常见问题,希望对网上的教程起到拾遗补缺的作用,让大家有更深入的理解。

注:
1 本文为个人观点,不足或错误之处请指正,也欢迎大家在评论区讨论。
2 由于功能包更新原因,实际功能包安装和配置可能和本文稍有出入,请根据实际情况自行调整。
3 UR机器人的版本和型号也会导致其坐标系名称略有不同。

相关文章:

机器人的手眼标定——机器人抓取系统基础系列(五)

机器人的手眼标定——机器人抓取系统基础系列&#xff08;五&#xff09; 前言一、机器人标定相关概念1.1 内参标定和外参标定1.2 Eye-in-Hand 和 Eye-to-Hand1.3 ArUco二维码和棋盘格标定区别 二、机器人标定基本原理2.1 机器人抓取系统坐标系2.2 标定原理 三、标定步骤和注意…...

Android 图片加载框架:Picasso vs Glide

引言 在 Android 开发中&#xff0c;图片加载是移动应用的核心功能之一。合理选择图片加载框架不仅能提升用户体验&#xff0c;还能优化内存管理和应用性能。本文将深入对比 Picasso 和 Glide 两大主流框架&#xff0c;结合代码示例分析它们的差异、工作原理及优化策略。 1. …...

uniapp从 vue2 项目迁移到 vue3流程

以下是必须为迁移到 vue3 进行调整的要点&#xff0c;以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...

DeepSeek R1 本地部署指南 (2) - macOS 本地部署

上一篇&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…...

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初&#xff0c;DeepSeek V3以557万美元的研发成本&#xff08;仅为GPT-4的1/14&#xff09;和开源模型第一的排名&#xff0c;在全球AI领域掀起波澜。其核心创新之一——混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的优化设计&#xff0c;不…...

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…...

2025年2月-3月后端go开发找工作感悟

整体感悟 目标 找工作首先要有一个目标&#xff0c;这个目标尽可能的明确&#xff0c;比如我要字节、拼多多之类的公司&#xff0c;还是要去百度、滴滴这样的&#xff0c;或者目标是创业公司。但是这个目标是会动态调整的&#xff0c;有可能我们的心态发生了变化&#xff0c;一…...

OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...

【极速版 -- 大模型入门到进阶】快速了解大型语言模型

文章目录 &#x1f30a; 大模型作为一种生成式人工智慧&#xff0c;厉害在哪儿&#xff1f;-> 通用能力&#x1f30a; LLM 如何生成输出&#xff1a;简而言之就是文字接龙&#x1f30a; GPT 之前 ...&#xff1a;模型规模和数据规模概览&#x1f30a; ChatGPT 有三个训练阶段…...

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…...

牛客网【模板】二维差分(详解)c++

题目链接&#xff1a;【模板】二维差分 1.题目分析 类比一下&#xff0c;因为差分因为差分是在数组里的某一段同时加上一个K二维是在二维数组中选择一个词矩阵&#xff0c;让词矩阵中每一个元素都加上一个K 2.算法原理 解法-:暴力解法 -> 模拟 你告诉我一个左上角和右下…...

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…...

【清华大学】AIGC发展研究(3.0版)

目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容&#xff08;一&#xff09;文本生成&#xff08;二&#xff09;图像生成&#xff08;三&#xff09;音乐生成&#xff08;四&#xff09;视频生成 五、各行业应用六、未来展望 AIGC发展研究…...

Kafka--常见问题

1.为什么要使用 Kafka&#xff0c;起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统&#xff0c;它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输&#xff0c;每秒可以处理数百万条消息。它能够在处理大量并发请求时&#xff0c;保持低延迟和…...

maptalks图层交互 - 模拟 Tooltip

maptalks图层交互 - 模拟 Tooltip 图层交互-模拟tooltip官方文档 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>图层交互 - 模拟 Tooltip</title><style typet…...

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看&#xff01; 一、Visual Studio Code下载 下载官网&#xff1a;https://code.visualstudio.com/ 进入官网后点击右上角的Download &…...

datetime“陷阱”与救赎:扒“时间差值”证道

时间工具陷阱&#xff0c;其实是工具引用的误解。 笔记模板由python脚本于2025-03-23 23:32:58创建&#xff0c;本篇笔记适合时间工具研究的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…...

3DMAX曲线生成器插件CurveGenerator使用方法

1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具&#xff0c;用户可以通过简单的UI界面输入参数&#xff0c;快速生成多条样条线。每条样条线的高度值随机生成&#xff0c;且可以自定义以下参数&#xff1a; 顶点数量&#xff1a;每条…...

Apache漏洞再现

CVE-2021-41773路径穿越漏洞 1、开环境 sudo docker pull blueteamsteve/cve-2021-41773:no-cgid sudo docker run -dit -p 8082:80 blueteamsteve/cve-2021-41773:no-cgid 2、访问8082端口 3、打开工具 4、输入网址&#xff0c;检测漏洞...

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(11)

7.3. 查询计划相关操作符 98&#xff09;Table Scan&#xff1a;该操作符从查询计划参数列确定的表中获取所有数据行。如果其参数列中出现WHERE:()谓词&#xff0c;则只返回满足该谓词的数据行。该操作符为逻辑操作符和物理操作符。该操作符具体如图7.3-98节点1所示。 图 7.3-…...

编译原理——词法分析

文章目录 词法分析&#xff1a;从基础到自动构造一、词法分析程序的设计一、词法分析程序的设计二、PL/0编译程序中词法分析程序的设计与实现1. 语法特定考量2. 通过状态转移表运用有限状态自动机3. 示例代码片段&#xff08;用于说明的伪代码&#xff09; 三、单词的形式化描述…...

Linux内核,内存分布

x86_64的物理地址范围为64bit&#xff0c;但是因为地址空间太大目前不可能完全用完&#xff0c;当前支持57bit和48bit两种虚拟地址模式。 地址模式单个空间用户地址空间内核地址空间32位2G0x00000000 - 0x7FFFFFFF0x80000000 - 0xFFFFFFFF64位(48bit)128T0x00000000 00000000 …...

AI鸟类识别技术革新生态监测:快瞳科技如何用“智慧之眼”守护自然?

在生态环境保护日益受关注的今天&#xff0c;“鸟类识别”已从专业科研工具演变为推动生态治理数字化的核心技术。无论是湿地保护区的珍稀候鸟监测&#xff0c;还是城市机场的鸟击风险预警&#xff0c;AI技术的精准赋能正在改写人类与自然的互动方式。作为行业领先的智能解决方…...

c++之set

一、set特性及用途&#xff1f; 唯一性&#xff1a;set 中的元素是唯一的&#xff0c;不会存在重复的元素。自动排序&#xff1a;set 中的元素会自动按照默认的升序规则进行排序。底层实现&#xff1a;set 通常基于红黑树实现&#xff0c;具有自平衡功能&#xff0c;因此插入、…...

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…...

【操作系统】自旋锁和互斥锁

自旋锁和互斥锁是用于多线程同步的两种常见锁机制&#xff0c;主要区别在于等待锁的方式和适用场景。以下是它们的对比分析&#xff1a; 1. 等待机制 自旋锁&#xff08;Spinlock&#xff09;互斥锁&#xff08;Mutex&#xff09;线程通过 忙等待&#xff08;Busy-Wait&#x…...

人工智能在医疗影像诊断中的应用与实践

引言 随着人工智能技术的飞速发展&#xff0c;其在医疗领域的应用逐渐成为研究和实践的热点。特别是在医疗影像诊断方面&#xff0c;人工智能技术凭借其强大的数据处理能力和模式识别能力&#xff0c;为提高诊断效率和准确性带来了新的希望。本文将探讨人工智能在医疗影像诊断中…...

Java中synchronized 和 Lock

1. synchronized 关键字 工作原理 对象锁&#xff1a;在Java中&#xff0c;每个对象都有一个与之关联的监视器锁&#xff08;monitor lock&#xff09;。当一个线程尝试进入由 synchronized 保护的代码块或方法时&#xff0c;它必须首先获取该对象的监视器锁。如果锁已经被其…...

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端&#xff1f;2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…...

qt 对QObject::tr()函数进行重定向

在 Qt 中&#xff0c;QObject::tr() 函数用于国际化&#xff08;i18n&#xff09;&#xff0c;它用于标记需要翻译的字符串。通常情况下&#xff0c;tr() 函数会从翻译文件&#xff08;如 .qm 文件&#xff09;中查找对应的翻译字符串。如果你希望重定向 tr() 函数的行为&#…...

C#基础学习(三)值类型和引用类型:编程世界的“现金“ vs “银行卡“,以及string这个“渣男“的叛变行为

开场白 各位程序猿/媛们&#xff0c;今天我们来聊一聊编程世界里的"金钱观"。 你以为只有人类会纠结现金和存款的区别&#xff1f;不不不&#xff0c;C#中的值类型和引用类型每天都在上演这场大戏&#xff01; 而我们的string同学&#xff0c;表面是…...

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…...

如何设置sudo权限

打开终端&#xff1a;按 Ctrl Alt T 打开终端。 编辑 sudoers 文件&#xff1a; 使用 visudo 命令编辑 /etc/sudoers 文件&#xff08;visudo 会检查语法&#xff0c;避免错误&#xff09;&#xff1a; sudo visudo 添加用户权限&#xff1a; 在文件中找到以下行&#xff1…...

Codeforces Round 1012 (Div. 2) 3.23

文章目录 2025.3.23 Div2B. Pushing Balls&#xff08;暴力&#xff09;代码 C. Dining Hall题意思路代码 2025.3.23 Div2 Dashboard - Codeforces Round 1012 (Div. 2) - Codeforces B. Pushing Balls&#xff08;暴力&#xff09; 题意很好懂&#xff0c;每一行每一列从左…...

langfuse追踪Trace

介绍 &#x1f9e0; Langfuse 是什么&#xff1f; Langfuse 是一个专门为 LLM 应用&#xff08;如 OpenAI / LangChain / 自定义 Agent&#xff09; 设计的 观测与追踪平台&#xff08;Observability Platform&#xff09;。 简单说&#xff0c;它就像是你为 AI 应用插上的 “…...

Java-模块二-2

整数类型 byte&#xff1a;在 Java 中占用8位&#xff08;1字节&#xff09;&#xff0c;因此它的取值范围是从 -128 到 127。这是最小的整数类型&#xff0c;适合用于节省空间的情况。 short&#xff1a;这种类型的大小是16位&#xff08;2字节&#xff09;&#xff0c;允许的…...

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…...

大模型RLHF训练-PPO算法详解:Proximal Policy Optimization Algorithms

一、TL&#xff1b;DR 提出了一种新的策略梯度方法家族&#xff0c;用于强化学习&#xff0c;这些方法交替进行与环境交互采样数据提出了一个新的目标函数&#xff0c;使得能够进行多个小批量更新的多轮训练这些新方法为近端策略优化&#xff08;Proximal Policy Optimization…...

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…...

【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分&#xff1a; push_back()的实现 代码部分&#xff1a; 代码部分&#xff1a; 1.4拷贝构造函数 代码部分&#xff1a; 1.5支持{}初始化的构造函数 代码部分&#xff1a; …...

AI比人脑更强,因为被植入思维模型【21】冯诺依曼思维模型

定义 冯诺依曼思维模型是一种基于数理逻辑和系统分析的思维方式&#xff0c;它将复杂的问题或系统分解为若干个基本的组成部分&#xff0c;通过建立数学模型和逻辑规则来描述和分析这些部分之间的关系&#xff0c;进而实现对整个系统的理解和优化。该模型强调从整体到局部、再…...

Keil5调试技巧

一、引言 Keil5作为一款广泛应用于嵌入式系统开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;在微控制器编程领域占据着重要地位。它不仅提供了强大的代码编辑和编译功能&#xff0c;还具备丰富的调试工具&#xff0c;帮助开发者快速定位和解决代码中的问题。本文…...

Web PKI现行应用、标准

中国现行 Web PKI 标准 中国在 Web PKI&#xff08;公钥基础设施&#xff09;领域制定了多项国家标准&#xff0c;以确保网络安全和数字证书管理的规范性。以下是一些现行的重要标准&#xff1a; 1. GB/T 21053-2023《信息安全技术 公钥基础设施 PKI系统安全技术要求》 该标…...

ROS多机通信(四)——Ubuntu 网卡 Mesh 模式配置指南

引言 使用Ad-hoc加路由协议和直接Mesh模式配置网卡实现的网络结构是一样的&#xff0c;主要是看应用选择&#xff0c; Ad-Hoc模式 B.A.T.M.A.N. / OLSR 优点&#xff1a;灵活性高&#xff0c;适合移动性强或需要优化的复杂网络。 缺点&#xff1a;配置复杂&#xff0c;需手动…...

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录 引言系统要求1. 环境准备&#xff1a;安装Miniconda激活环境 2. 配置pip源加速下载3. 配置学术加速&#xff08;访问国外资源&#xff09;4. 安装系统依赖5. 安装OLMOCR6. 运行OLMOCR处理PDF文档7. 理解OLMOCR输出结果9. 可视化UI界面9.1 安装界面依赖9.2 创建界面应用…...

STM32单片机uCOS-Ⅲ系统11 中断管理

目录 一、异常与中断的基本概念 1、中断的介绍 2、和中断相关的名词解释 二、中断的运作机制 三、中断延迟的概念 四、中断的应用场景 五、中断管理讲解 六、中断延迟发布 1、中断延迟发布的概念 2、中断队列控制块 3、中断延迟发布任务初始化 OS_IntQTaskInit() 4…...

CTF【WEB】学习笔记1号刊

Kali的小工具箱 curl www.xxx.com&#xff1a;查看服务器响应返回的信息 curl -I www.xxx.com:查看响应的文件头 一、cmd执行命令 ipconfig&#xff1a;ip地址配置等&#xff1b; 二、 Kali操作 1.sudo su&#xff1b; 2.msfconsole 3.search ms17_010 永恒之蓝&#xff…...

cpp-友元

理解 C 中的友元&#xff08;Friend&#xff09; 在 C 语言中&#xff0c;封装&#xff08;Encapsulation&#xff09; 是面向对象编程的重要特性之一。它允许类将数据隐藏在私有&#xff08;private&#xff09;或受保护&#xff08;protected&#xff09;成员中&#xff0c;…...

Spring AOP 核心概念与实践指南

第一章&#xff1a;AOP 核心概念与基础应用 1.1 AOP 核心思想 ​面向切面编程&#xff1a;通过横向抽取机制解决代码重复问题&#xff08;如日志、事务、安全等&#xff09;​核心优势&#xff1a;不修改源代码增强功能&#xff0c;提高代码复用性和可维护性 1.2 基础环境搭…...