3D手眼标定转换详细实施步骤及原理概述

news2025/3/5 10:19:42

3D手眼标定转换详细实施步骤及原理概述

一、手眼标定的核心目标

通过数学方法确定传感器(如相机)与机械臂之间的空间变换关系,实现以下两种场景的精准坐标转换:

  1. Eye-in-Hand(眼在手上):相机安装在机械臂末端,标定相机到机械臂末端的变换矩阵 ( X )。
    T cam cal T_{\text{cam}}^{\text{cal}} Tcamcal
    在这里插入图片描述

  2. Eye-to-Hand(眼在手外):相机固定在工作空间外,标定相机到机械臂基座的变换矩阵 ( Y )。

  3. 在这里插入图片描述

二、3D手眼标定的原理概述


一、基本概念与坐标系定义

手眼标定的核心目标是求解传感器(如相机)与机械臂之间的刚性变换矩阵,即确定两者的相对位置和姿态。根据传感器安装位置的不同,分为两种场景:

  1. Eye-in-Hand(眼在手上)

    • 相机安装在机械臂末端,标定相机到末端的变换矩阵 ( X )。
    • 方程形式:( A X = X B )。
  2. Eye-to-Hand(眼在手外)

    • 相机固定在工作空间外,标定相机到机械臂基座的变换矩阵 ( Y )。
    • 方程形式:( A X = Y B )。

坐标系定义

  • 基座坐标系(Base):机械臂的固定参考系。
  • 末端坐标系(Tool):机械臂末端执行器的坐标系。
  • 相机坐标系(Camera):相机的光学中心坐标系。
  • 标定板坐标系(Calibration Board):标定板上的局部坐标系。

二、数学建模与方程推导
1. 坐标变换的齐次矩阵表示
  • 齐次变换矩阵 ( T ) 包含旋转矩阵 ( R ) 和平移向量 ( t ):

T = [ R t 0 1 ] ∈ R 4 × 4 T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \in \mathbb{R}^{4 \times 4} T=[R0t1]R4×4

  • 变换链示例(Eye-in-Hand):
    基座 → 末端 → 相机 → 标定板,对应的变换关系为:

T base board = T base tool ⋅ X ⋅ T cam board T_{\text{base}}^{\text{board}} = T_{\text{base}}^{\text{tool}} \cdot X \cdot T_{\text{cam}}^{\text{board}} Tbaseboard=TbasetoolXTcamboard

2. 手眼标定方程推导
  • 数据采集过程
    机械臂移动到两个不同位姿 ( i ) 和 ( j ),分别记录:

    • 末端到基座的变换:

    T base tool , i 和 T base tool , j T_{\text{base}}^{\text{tool},i} 和 T_{\text{base}}^{\text{tool},j} Tbasetool,iTbasetool,j

    标定板到相机的变换:
    T cam board , i 和 T cam board , j T_{\text{cam}}^{\text{board},i} 和 T_{\text{cam}}^{\text{board},j} Tcamboard,iTcamboard,j

  • 相对运动关系
    机械臂末端从位姿 ( i ) 到 ( j ) 的相对运动为:

A = ( T base tool , i ) − 1 ⋅ T base tool , j A = (T_{\text{base}}^{\text{tool},i})^{-1} \cdot T_{\text{base}}^{\text{tool},j} A=(Tbasetool,i)1Tbasetool,j

标定板从位姿 ( i ) 到 ( j ) 的相对运动为:
B = ( T cam board , i ) − 1 ⋅ T cam board , j B = (T_{\text{cam}}^{\text{board},i})^{-1} \cdot T_{\text{cam}}^{\text{board},j} B=(Tcamboard,i)1Tcamboard,j

  • 手眼方程
    由于基座到标定板的变换应一致,可得:

T base tool , i ⋅ X ⋅ T cam board , i = T base tool , j ⋅ X ⋅ T cam board , j T_{\text{base}}^{\text{tool},i} \cdot X \cdot T_{\text{cam}}^{\text{board},i} = T_{\text{base}}^{\text{tool},j} \cdot X \cdot T_{\text{cam}}^{\text{board},j} Tbasetool,iXTcamboard,i=Tbasetool,jXTcamboard,j

化简后得到核心方程:
A X = X B (Eye-in-Hand) A X = X B \quad \text{(Eye-in-Hand)} AX=XB(Eye-in-Hand)


三、方程求解方法
1. 分离旋转与平移

将齐次矩阵分解为旋转矩阵 ( R ) 和平移向量 ( t ),方程拆分为:
{ R A R X = R X R B ( R A − I ) t X = R X t B − t A \begin{cases} R_A R_X = R_X R_B \\ (R_A - I) t_X = R_X t_B - t_A \end{cases} {RARX=RXRB(RAI)tX=RXtBtA

  • 旋转部分:求解 ( R_A R_X = R_X R_B )。
  • 平移部分:在已知 ( R_X ) 后,通过线性方程求解 ( t_X )。
2. 旋转矩阵求解
  • 四元数法:将旋转矩阵转换为四元数,利用四元数乘法性质求解。
  • 轴角法:假设旋转轴 ω 和角度θ,通过特征值分解求解。
  • SVD分解:对旋转方程构造矩阵,通过奇异值分解求最小二乘解。

示例(Tsai算法)

  1. 对每对
    ( A i , B i ) (A_i, B_i) (Ai,Bi)

    构造方程
    R A R X − R X R B = 0 R_A R_X - R_X R_B = 0 RARXRXRB=0

  2. 将所有方程堆叠成超定方程组,通过SVD求解
    R X R_X RX

3. 平移向量求解
  • 将已知

R X R_X RX

  • 代入平移方程,构造线性方程组:

( R A − I ) t X = R X t B − t A (R_A - I) t_X = R_X t_B - t_A (RAI)tX=RXtBtA

  • 使用最小二乘法求解
    t X t_X tX

四、解的存在性与唯一性
1. 理论条件
  • 旋转部分:至少需2组非共轴旋转数据(即绕不同轴的旋转)。
  • 平移部分:平移方向需与旋转轴不共线,避免方程秩不足。
2. 实际应用
  • 数据量要求:推荐至少10组不同位姿数据,覆盖机械臂工作空间。
  • 噪声处理:使用RANSAC或加权最小二乘法抑制异常值影响。

五、算法扩展与优化
1. 多传感器标定
  • LiDAR-相机标定:将点云与图像特征对齐,扩展方程为 ( A X = Y B )。
  • 时间同步:加入时间戳对齐,处理动态场景下的标定。
2. 非线性优化
  • 目标函数:最小化重投影误差或运动一致性误差:

min ⁡ X ∑ i = 1 N ∥ A i X − X B i ∥ F 2 \min_X \sum_{i=1}^{N} \| A_i X - X B_i \|_F^2 Xmini=1NAiXXBiF2

  • 求解器:使用Levenberg-Marquardt算法或李群优化(如Manopt库)。
3. 鲁棒性增强
  • 加权最小二乘:根据数据置信度分配权重。
  • 抗遮挡策略:在部分特征点丢失时,仍能保持标定稳定性。

六、数学推导示例(Eye-in-Hand场景)

步骤1:构造旋转方程
对每对
( A i , B i ) (A_i, B_i) (Ai,Bi)
,提取旋转矩阵
R A , R B R_A, R_B RA,RB
方程写作:
R A R X = R X R B R_A R_X = R_X R_B RARX=RXRB
转换为四元数形式:

https://www.bilibili.com/video/BV1VQ4y1H7F9/?spm_id_from=333.337.search-card.all.click
q A ⊗ q X = q X ⊗ q B q_A \otimes q_X = q_X \otimes q_B qAqX=qXqB
展开后可得线性约束,堆叠所有约束形成超定方程组。

步骤2:SVD求解旋转矩阵

构造矩阵
M = ∑ i = 1 N ( R A ( i ) ⊗ R B ( i ) ) M = \sum_{i=1}^{N} (R_A^{(i)} \otimes R_B^{(i)}) M=i=1N(RA(i)RB(i))
,对 M 进行SVD分解:
M = U Σ V T M = U \Sigma V^T M=UΣVT
取 V 的最后一列作为
R X R_X RX
的解。

步骤3:求解平移向量
代入 Rx 至平移方程,构建线性方程组:
[ R A ( 1 ) − I ⋮ R A ( N ) − I ] t X = [ R X t B ( 1 ) − t A ( 1 ) ⋮ R X t B ( N ) − t A ( N ) ] \begin{bmatrix} R_A^{(1)} - I \\ \vdots \\ R_A^{(N)} - I \end{bmatrix} t_X = \begin{bmatrix} R_X t_B^{(1)} - t_A^{(1)} \\ \vdots \\ R_X t_B^{(N)} - t_A^{(N)} \end{bmatrix} RA(1)IRA(N)I tX= RXtB(1)tA(1)RXtB(N)tA(N)

通过伪逆求解
t X = ( A T A ) − 1 A T b t_X = (A^T A)^{-1} A^T b tX=(ATA)1ATb


七、误差分析与验证
1. 重投影误差

将标定板角点通过标定矩阵投影到机械臂坐标系,计算与理论位置的偏差:
Error = 1 N ∑ i = 1 N ∥ P base , i − T base tool , i ⋅ X ⋅ P cam , i ∥ \text{Error} = \frac{1}{N} \sum_{i=1}^{N} \| P_{\text{base},i} - T_{\text{base}}^{\text{tool},i} \cdot X \cdot P_{\text{cam},i} \| Error=N1i=1NPbase,iTbasetool,iXPcam,i

2. 运动一致性验证

检查方程 ( A X = X B ) 的残差范数:
Residual = ∥ A X − X B ∥ F \text{Residual} = \| A X - X B \|_F Residual=AXXBF

三、实施步骤

1. 标定准备

  • 标定块设计

    • 选择高精度标定板(如棋盘格、Charuco板、ArUco标记板)。
    • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    ArUco部分用于插值棋盘角的位置,因此它具有标记板的多功能性,因为它允许遮挡或部分视图。此外,由于插值的角属于棋盘,因此在亚像素精度方面非常准确。
    在需要高精度的情况下,例如在相机校准中,Charuco 棋盘比标准的 Aruco 棋盘更好。

    • 标定块需具有明确几何特征(角点、圆形标记等),且非对称设计(4*4,6*6)以避免误识别。
  • 传感器与机械臂配置

    • Eye-in-Hand:将相机刚性固定在机械臂末端。
    • Eye-to-Hand:将相机固定于工作台顶部,覆盖机械臂工作范围。
    • 确保标定块在相机视野内,且机械臂可达。
  • 数据采集设备

    • 图像:华睿3D相机

    • 点来源:2D找点转成3D,

      每个高度数据的XY是如何获取或者计算的

      举例来说,深度图中第r行c列的像素点,其深度值为d,深度图对应的相机内参为(fx,cx,fy,cy)(如果深度图对齐到彩色图上,则采用彩色图的相机内参),则可通过如下公式计算该像素点对应的三维坐标(x,y,z)

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 机械臂:信源。

2. 数据采集

  • 标定板位姿采集

    1. 机械臂抓取标定块,移动至不同位姿(至少15组),覆盖以下运动:

      • 旋转:绕X/Y/Z轴旋转(俯仰、偏航、横滚)。
      • 平移:沿X/Y/Z轴移动,覆盖工作空间不同区域。
    2. 在每个位姿下:

      • 记录机械臂末端的位姿

      T base tool (通过关节编码器计算)。 T_{\text{base}}^{\text{tool}} (通过关节编码器计算)。 Tbasetool(通过关节编码器计算)。

      • 通过相机拍摄标定板图像,找标定板上的多个位点来计算标定板位姿

        在3D标定中,标定板的位姿(位置和方向)是通过检测其上的多个特征点(如角点、圆心、ArUco标记等)计算得到的。以下是详细的步骤和方法:

        1. 标定板设计与特征点选择

        标定板需设计为具有明确且可重复检测的特征点,常见类型包括:

        • 棋盘格标定板:黑白相间方格,角点为特征点。
        • 圆形标定板:排列规则的圆点,圆心为特征点。
        • ArUco/Charuco标定板:结合棋盘格和二维码标记,提供唯一ID和角点。
        • 自定义标记:非对称几何图案,如L形、T形等。

        关键设计原则

        • 特征点唯一性:确保每个特征点可被唯一识别(如ArUco的ID或非对称布局)。
        • 高对比度:特征点与背景对比明显(如黑白棋盘格)。
        • 已知几何尺寸:标定板的物理尺寸(如方格边长、圆点间距)需预先测量并输入算法。

        2. 特征点检测方法

        (1) 棋盘格标定板
        • 检测原理:通过图像处理寻找黑白方格的交点(角点)。

        • OpenCV实现

          import cv2
          
          # 读取图像并检测角点
          image = cv2.imread("chessboard.png")
          gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
          ret, corners = cv2.findChessboardCorners(gray, (rows, cols), None)
          
          # 亚像素优化
          if ret:
              criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
              cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
          
        (2) 圆形标定板
        • 检测原理:通过霍夫变换检测圆心的亚像素位置。

        • OpenCV实现

          circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20,
                                     param1=50, param2=30, minRadius=10, maxRadius=50)
          
        (3) ArUco/Charuco标定板
        • 检测原理:识别二维码标记并提取角点。

        • OpenCV实现

          aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
          charuco_board = cv2.aruco.CharucoBoard_create(5, 7, 0.04, 0.02, aruco_dict)
          corners, ids, _ = cv2.aruco.detectMarkers(image, aruco_dict)
          

        3. 位姿计算(PnP算法)

        通过检测到的特征点的图像坐标和其对应的3D世界坐标,使用 Perspective-n-Point (PnP) 算法计算标定板的6自由度位姿。

        (1) 输入数据
        • 图像坐标:检测到的特征点像素坐标(2D点)。
        • 世界坐标:标定板上特征点的物理坐标(3D点),需根据标定板设计预先定义(如棋盘格原点在左上角,Z=0)。
        (2) PnP算法选择
        • OpenCV函数cv2.solvePnP
        • 算法类型
          • 迭代法(ITERATIVE):基于Levenberg-Marquardt优化,需初始猜测。
          • EPnP:无需初始值,适合实时应用。
          • RANSAC-based PnP:抗噪声能力强,适用于部分遮挡场景。
        (3) 代码实现
        # 定义标定板的3D世界坐标(假设Z=0)
        obj_pts = np.array([[0,0,0], [0.1,0,0], [0.1,0.1,0], [0,0.1,0]], dtype=np.float32)  # 单位:米
        
        # 检测到的图像坐标(假设已通过特征检测获得)
        img_pts = np.array([[320, 240], [400, 240], [400, 320], [320, 320]], dtype=np.float32)
        
        # 相机内参(需预先标定)
        camera_matrix = np.array([[800, 0, 320], [0, 800, 240], [0, 0, 1]], dtype=np.float32)
        dist_coeffs = np.zeros((5, 1))  # 假设无畸变
        
        # 计算位姿
        ret, rvec, tvec = cv2.solvePnP(obj_pts, img_pts, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)
        
        # 将旋转向量转换为旋转矩阵
        R, _ = cv2.Rodrigues(rvec)
        print("旋转矩阵:\n", R)
        print("平移向量:\n", tvec)
        

        4. 提高位姿估计精度的关键技巧

        (1) 多特征点优化
        • 最少点数:PnP算法至少需要4个非共面点,但更多点可提升精度(推荐≥10个点)。
        • 点分布:特征点应覆盖标定板的不同区域,避免集中在一侧。
        (2) 亚像素优化

        对检测到的角点或圆心进行亚像素级优化,减少图像量化误差:

        cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        
        (3) 畸变校正

        使用预先标定的相机畸变系数(dist_coeffs)校正图像坐标:

        undistorted_corners = cv2.undistortPoints(corners, camera_matrix, dist_coeffs)
        
        (4) 异常值剔除

        使用RANSAC或LMeds算法过滤错误匹配点:

        ret, rvec, tvec, inliers = cv2.solvePnPRansac(obj_pts, img_pts, camera_matrix, dist_coeffs)
        
        (5) 多帧平均

        采集多帧数据计算位姿,取平均值或中位数抑制瞬时噪声。

        5. 验证标定板位姿

        (1) 重投影误差

        将计算出的位姿反投影到图像,计算与检测点的误差:

        projected_pts, _ = cv2.projectPoints(obj_pts, rvec, tvec, camera_matrix, dist_coeffs)
        error = np.linalg.norm(projected_pts - img_pts, axis=2).mean()
        print("重投影误差(像素):", error)  # 应 < 0.5 像素
        
        (2) 物理验证
        • 机械臂触碰验证:控制机械臂末端触碰标定板上的物理点,对比理论坐标与实际坐标。
        • 多视角一致性:在不同视角下计算标定板位姿,检查其空间一致性。

        6. 常见问题与解决

        问题原因解决方案
        重投影误差大相机内参不准/畸变未校正重新校准相机
        位姿估计不稳定特征点检测抖动使用亚像素优化或RANSAC
        Z轴方向误差明显标定板非平面/特征点共面使用非共面点或3D标定板
        部分特征点无法检测遮挡/光照不均优化光照条件或使用抗遮挡算法(如ArUco)
  • 数据格式示例

    // 机械臂末端位姿(X, Y, Z, Rx, Ry, Rz)
    Mat ToolPose = (Mat_<double>(6,1) << 100.0, 200.0, 300.0, 0.1, -0.2, 1.5);
    
    // 标定板在相机中的位姿(X, Y, Z, Rx, Ry, Rz)
    Mat CalPose = (Mat_<double>(6,1) << 50.0, -30.0, 400.0, -0.3, 0.5, 2.0);
    

3. 位姿数据转换

  • 欧拉角/旋转向量 → 旋转矩阵
    将机械臂和标定板的位姿转换为齐次变换矩阵
    T base tool 和 T cam cal T_{\text{base}}^{\text{tool}} 和 T_{\text{cam}}^{\text{cal}} TbasetoolTcamcal

    • 公式

    T = [ R t 0 1 ] , R = e [ ω ] × T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}, \quad R = e^{[\omega]_\times} T=[R0t1],R=e[ω]×

    其中 ω 为旋转向量, [ ω ] × 为反对称矩阵。 其中 ω 为旋转向量,{[\omega]_\times} 为反对称矩阵。 其中ω为旋转向量,[ω]×为反对称矩阵。

    这是一个包含角速度符号 ω 的公式。

  • 代码示例

    // 将位姿向量转换为齐次矩阵
    Mat attitudeVectorToMatrix(Mat& pose) {
        Mat R, T;
        Rodrigues(pose({3,0,3,1}), R); // 旋转向量转旋转矩阵
        T = pose({0,0,3,1}).clone();   // 提取平移向量
        return R_T2RT(R, T);           // 合并为齐次矩阵
    }
    

4. 手眼标定计算

  • 数学模型
    手眼标定方程为 ( A X = X B )(Eye-in-Hand)或 ( A X = Y B )(Eye-to-Hand),其中:

    • ( A ):机械臂末端位姿变化(通过关节编码器计算)。
    • ( B ):标定板位姿变化(通过相机检测)。
    • ( X ):待求的相机到机械臂末端的变换矩阵(Eye-in-Hand)。
  • 标定方法选择

    方法原理适用场景
    CALIB_HAND_EYE_TSAI基于旋转和平移分步求解快速、中等精度
    CALIB_HAND_EYE_PARK最小化旋转和平移联合误差高精度、计算量大
    CALIB_HAND_EYE_HORAUD基于四元数的闭式解抗噪声能力强
  • 代码实现

    // 标定Eye-to-Hand场景(相机固定)
    calibrateHandEye(R_gripper2base, T_gripper2base, 
                     R_target2cam, T_target2cam, 
                     R_cam2gripper, T_cam2gripper, 
                     CALIB_HAND_EYE_TSAI);
    

5. 标定结果验证

  • 重投影误差
    将标定板特征点通过标定矩阵投影到机械臂坐标系,计算误差:

Error = 1 N ∑ i = 1 N ∥ P base , i − T base tool , i ⋅ X ⋅ P cam , i ∥ \text{Error} = \frac{1}{N} \sum_{i=1}^{N} \| P_{\text{base},i} - T_{\text{base}}^{\text{tool},i} \cdot X \cdot P_{\text{cam},i} \| Error=N1i=1NPbase,iTbasetool,iXPcam,i

  • 合格标准:误差 < 1 mm。

  • 物理抓取测试

    1. 机械臂根据标定结果抓取标定块,重复10次。
    2. 统计实际抓取位置与理论位置的偏差。
    • 合格标准:抓取成功率 > 95%(无堆叠场景)。

四、常见问题与解决

问题原因解决方案
标定误差 > 2 mm标定板特征点检测不准使用高精度标定板,优化视觉算法
抓取点Z轴偏差大深度相机标定误差重新校准深度相机,加入Z轴补偿
旋转矩阵非正交机械臂欧拉角定义错误检查欧拉角顺序(内旋/外旋、XYZ/ZYX)
标定结果不稳定数据量不足或位姿单一增加数据量,确保覆盖全工作空间

1.标定时找到的3D点是如何找的?
(1)是利用原有的3D原始数据图有对应的算法搜索出的3D点,
(2)还是相机输出的2D图通过2D算法搜索特征点最终转换计算得到的3D点,
(3)还是有什么其他的什么找点方式

标定时采用棋盘格标定板,通过彩色相机拍摄标定板,提取标定板角点进行标定,标定算法完成找点,不需要其他工具参与。目前本司软件找点可能需要依赖其他工具,按照上述的第二种方式

2.进行3D手眼标定时,标定板不动,移动机械臂,拍摄15+张图片,覆盖多个位姿,并记录每张图片拍摄时机械臂的位姿,位姿数据包括3D点坐标(位置)与姿态(方向),3D点可以通过搜索得出X,Y,Z。但是姿态以什么表示,欧拉角还是四元数还是其他什么格式。
根据相机安装方式不同存在有两种情况
眼在手上:
相机安装在机械臂末端。标定板放置在固定位置,控制机械臂移动相机拍照
眼在手外:
相机安装在机械臂外的固定位置。标定板固定在机械臂末端,控制机械臂移动标定板拍照
机械臂的位姿通常由6个量表示(x,y,z,rx,ry,rz),前3个为平移量,后3个为旋转量,旋转量一般为欧拉角(也有采用旋转向量、四元数,具体以机械臂厂家为准)

3.机械臂抓取标定块进行标定,搜索的3D点与抓取点不一致标定得出的转换矩阵,进行抓取坐标转换时如何保证搜索到的3D点与抓取点一致
眼在手上:标定的是相机坐标系和机械臂末端坐标系的旋转平移关系
眼在手外:标定的是相机坐标系和机械臂基底坐标系的旋转平移关系
机械臂出厂默认的末端坐标系原点在法兰盘中心,需要根据使用的夹具,按照实际使用需求在机械臂上设置好工具坐标系。标定完成后,得到一个特定的转换矩阵

4.关于坐标转换工具的输入与输出为坐标与位姿角度,坐标为3D坐标,位姿需要相应转换

代码示例

// 输入时将位姿向量转换为齐次矩阵
Mat attitudeVectorToMatrix(Mat& pose) {
    Mat R, T;
    Rodrigues(pose({3,0,3,1}), R); // 旋转向量转旋转矩阵
    T = pose({0,0,3,1}).clone();   // 提取平移向量
    return R_T2RT(R, T);           // 合并为齐次矩阵
}

输出时需要将在通过转换矩阵得到的结果,转换成需要的位姿向量(欧拉角,四元数等)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog:SCCB控制器

目录 一、SCCB协议 &#xff08;1&#xff09;SCCB时序 &#xff08;2&#xff09;与I2C的区别 二、Verilog 实现 &#xff08;1&#xff09;设计要求 &#xff08;2&#xff09;设计要点 &#xff08;3&#xff09;模块完整代码 三、功能验证 &#xff08;1&#xff09;写…

与中国联通技术共建:通过obdiag分析OceanBase DDL中的报错场景

中国联通软件研究院&#xff08;简称联通软研院&#xff09;在全面评估与广泛调研后&#xff0c;在 2021年底决定采用OceanBase 作为基础&#xff0c;自研分布式数据库产品CUDB&#xff08;即China Unicom Database&#xff0c;中国联通数据库&#xff09;。目前&#xff0c;该…

大数据与网络安全讲座

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大数据的价值为大家公认。业界通常以4个“V”来概括大数据的基本特征——Volume(数据体量巨大)、Variety(数据类型繁多)、Value(价值密度低)、Velocity(处理速度快…

张驰咨询:用六西格玛重构动力电池行业的BOM成本逻辑

在动力电池行业&#xff0c;BOM&#xff08;物料清单&#xff09;成本每降低1%&#xff0c;都可能改写企业的利润曲线。某头部企业的三元锂电池BOM成本曾较行业标杆高出11%&#xff0c;单电芯利润率被压缩至3%的生死线。然而&#xff0c;通过张驰咨询的六西格玛方法论&#xff…

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…

《深度学习实战》第10集:联邦学习与隐私保护

第10集&#xff1a;联邦学习与隐私保护 2025年3月4日更新了代码&#xff0c;补充了实例程序运行截图 和 如何提高模型准确率的方法 系统梳理 集集精彩 代码验证 保证实战 随着数据隐私问题日益受到关注&#xff0c;联邦学习&#xff08;Federated Learning&#xff09; 作为一…

【数据结构】二叉树总结篇

遍历 递归 递归三部曲&#xff1a; 1.参数和返回值 2.终止条件 3.单层逻辑&#xff08;遍历顺序&#xff09; var preorderTraversal function(root) { // 第一种let res[];const dfsfunction(root){if(rootnull)return ;//先序遍历所以从父节点开始res.push(root.val);//递归…

软考-数据库开发工程师-3.1-数据结构-线性结构

第3章内容比较多&#xff0c;内容考试分数占比较大&#xff0c;6分左右 线性表 1、线性表的定义 一个线性表是n个元素的有限序列(n≥0)&#xff0c;通常表示为(a1&#xff0c;a2, a3,…an). 2、线性表的顺序存储(顺序表) 是指用一组地址连续的存储单元依次存储线性表中的数据元…

【五.LangChain技术与应用】【2.LangChain虚拟环境搭建(下):环境优化与调试】

一、Docker化部署:别让你的环境成为薛定谔的猫 经历过"在我机器上能跑"惨案的老铁都懂,传统虚拟环境就像个黑盒子。去年我帮客户部署LangChain应用,因为glibc版本差了0.1,整个服务直接崩成烟花。从那天起,我所有项目都强制上Docker! Dockerfile生存指南: #…

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值

文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…

解码未来!安徽艾德未来智能科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中&#xff0c;安徽艾德未来智能科技有限公司提交的“讯飞AI会议耳机iFLYBUDS Pro 2”&#xff0c;在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可&#xff0c;荣获“产品创新奖”。 这一殊荣不仅…

力扣hot100刷题——栈

文章目录 69.有效的括号题目描述思路&#xff1a;栈code 70.最小栈题目描述思路&#xff1a;双栈法code优化&#xff1a;单栈法code 71.字符串解码题目描述思路&#xff1a;栈code 73.每日温度题目描述思路&#xff1a;单调栈code 74.柱状图中最大的矩形题目描述思路&#xff1…

TMS320F28P550SJ9学习笔记2:Sysconfig 配置与点亮LED

今日学习使用Sysconfig 对引脚进行配置&#xff0c;并点亮开发板上的LED4 与LED5 我的单片机开发板平台是 LAUNCHXL_F28P55x 我是在上文描述的驱动库C2000ware官方例程example的工程基础之上进行添加功能的 该例程路径如下&#xff1a;D:\C2000Ware_5_04_00_00\driverlib\f28p…

健康养生:开启活力人生的钥匙

在快节奏的现代生活中&#xff0c;健康养生已成为我们追求美好生活的关键。它不仅关乎身体的强健&#xff0c;更与心灵的宁静息息相关。 合理饮食是健康养生的基石。多吃蔬菜、水果&#xff0c;它们富含维生素与矿物质&#xff0c;为身体提供充足养分。全谷物食品也是不错的选…

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…

mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…

布隆过滤器(附带位图讲解)

提到位图&#xff0c;我们首先想到的应该是它的两面定义&#xff1a; 位图图像&#xff08;bitmap&#xff09;&#xff0c;亦称为点阵图或栅格图像&#xff0c;是由称作像素&#xff08;图片元素&#xff09;的单个点组成的。位图是指内存中连续的二进制位&#xff0c;用于对…

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈&#xff1a;存有非静态局部变量、函数参数、返回…