手眼标定实战:AX=XB原理、ROS流程与数据采集避坑指南
简介面向机器人开发与计算机相关专业学生这套基于ROS的手眼标定程序包可解决“眼在手上”的标定问题输入机械臂末端位姿与相机识别到的标定板位姿即可计算末端与相机间的坐标变换矩阵支持JAKA、AUBO机械臂已在ROS Kinetic/Melodic平台验证通过。压缩包共158个文件约10.44MB以Python源码、launch启动文件、CSV/TXT位姿数据配置及CSV结果文件为主并含AUBO机械臂相关动态库和编译配置便于直接编译运行与二次开发。包内提供详细程序使用说明包含基础标定流程、launch文件参数修改方法和多组测试数据运行后还能输出不同算法下的计算结果及标准差、方差方便对比与参考。作为毕业设计、课程设计或入门项目均有较高借鉴价值。目前已有413人学习下载适合ROS与机器人领域学习者使用。1. 手眼标定的本质先接受一个反直觉结论标定质量八成在数据不在算法机械臂加视觉的第一步几乎都是手眼标定。不管你是在做视觉引导抓取、装配对位还是移动底盘上的机械臂作业都要先解决同一个问题相机坐标系里的点在机械臂坐标系里到底在哪。这个变换矩阵求不准后面所有视觉定位、轨迹规划全是空中楼阁。很多人拿到 ROS 手眼标定程序包以为跑一遍拿到一个矩阵就完事了实际上数据采集、中间验证和误差排查才是真正花时间的环节。这里先说一个反直觉的结论手眼标定用的算法早就成熟了Tsai-Lenz 和 Park-Martin 在 OpenCV 里一个函数就能调真正让标定结果翻车的十有八九是数据采集姿势不对。标定板只在一个姿态附近活动、采样帧数太少、TF 链路没接对任何一个都能让最终矩阵偏得离谱。这篇文章按我实际做过的流程来讲标定的数学本质是什么、ROS 程序包怎么跑通、数据怎么采才有效以及几个能让你少熬夜的避坑经验。适合正在做机械臂视觉抓取、ROS 机器人开发或者刚接触手眼标定但被结果稳定性折磨过的从业者。2. 眼在手上还是眼在手外AXXB 方程的两种配置与解法选型2.1 眼在手外配置相机固定、标定板贴在机械臂末端眼在手外eye-to-hand是工位自动化里最常见的布局相机装在支架上俯拍工作区机械臂在相机视野里干活。这时候求的是相机坐标系到机械臂基座坐标系的固定变换。标定时把标定板固定在机械臂末端法兰上让机械臂带着标定板在相机视野里变换姿态程序同时记录机械臂末端位姿和相机观测到的标定板位姿。方程用 AXXB 来写。设 A 是机械臂末端在基座坐标系下的位姿变换B 是标定板在相机坐标系下的位姿变换X 就是待求的手眼矩阵。同一个标定板在空间中有一个不变的真实位置两次采样之间能消掉这个不变量最后整理成 A₁X XB₁ 的形式。这个方程的意思是通过两次不同姿态的观测把手眼矩阵从等式两边夹逼出来。眼在手外的标定板装夹很关键标定板平面要和末端法兰轴线基本垂直而且装上去之后整个标定过程中不能再动。我之前见过有人用胶带临时贴标定板标到一半板子歪了结果解出来的矩阵看起来合理实际抓取偏了 3 厘米排查了两天才发现是机械端的问题。2.2 眼在手上配置相机装在末端、标定板钉在桌面上眼在手上eye-in-hand是移动机械臂和复合机器人更常用的方案相机直接装在机械臂末端跟着机械臂一起动标定板固定在工作台或地面上。这种配置的好处是视野随末端移动近距离作业精度更高缺点是相机跟着运动图像容易模糊对曝光时间要求高。方程形式上仍然是 AXXB但 X 的含义变成了相机坐标系到机械臂末端坐标系的变换。这里 A 是机械臂末端位姿B 是标定板在相机坐标系下的位姿两个变量都存在 tf 树里。注意一个最常踩的坑眼在手外求的是相机到基座的变换眼在手上求的是相机到末端的变换两者物理意义完全不同你要是把配置选错了标定程序不会报错但结果在验证阶段一定会露馅。判断该用哪种配置没有绝对标准我的习惯是工作区固定、机械臂底座不动优先眼在手外标定一次管很久机械臂要移动、或者目标物体在多个工位之间流转用眼在手上标定结果跟随末端换底座位置不用重标。2.3 求解算法选型Tsai-Lenz、Park-Martin 与 OpenCV 封装AXXB 的解法主要分两类。Tsai-Lenz 是两步法先求旋转再求平移计算效率高对旋转噪声相对鲁棒适合数据质量一般、有抖动的工程现场。Park-Martin 基于李群和李代数把旋转和平移放在一个框架里同时求解理论上更精确但数据里如果有离群点结果反而容易飘。实际工程里我一般直接用 OpenCV 的cv2.calibrateHandEye()它内部实现了 Tsai-Lenz、Park-Martin、Horaud 等多种方法通过method参数切换。如果你采集的数据姿态差异大、质量稳定用 Park-Martin 效果更细如果标定板检测有抖动、末端姿态精度一般Tsai-Lenz 更稳。calibrateHandEye的输入是两组 4x4 齐次变换矩阵机械臂末端位姿和标定板位姿输出就是手眼矩阵 X。用 OpenCV 封装还有个好处它能顺便给出重投影误差的中间结果方便你在数据采集阶段就筛掉坏帧而不必等到最后验证才发现问题。下一步就是把它接到 ROS 程序包里跑通整个流程。3. ROS 程序包跑通全流程目录结构、编译命令与 launch 配置3.1 程序包目录结构先看懂三个目录再动手拿到一个基于 ROS 的手眼标定程序包解压之后先不要急着编译花五分钟把目录结构看明白后面能省很多排查时间。常见布局是src/下放功能包功能包里分launch/、nodes/或scripts/、config/、data/几个目录。launch/放标定主流程的启动文件config/放相机参数、标定板尺寸、检测器参数data/存采集到的位姿数据。标题里提到的详细程序使用说明一般会单独放在doc/或 README 里我拿到包之后的习惯是先把使用说明扫一遍重点看它写的是 ROS1 还是 ROS2、依赖了哪些包、标定板是什么规格。这三件事没搞清楚就编译大概率会在中途卡住。hand_eye_calib_ws/ ├── src/ │ └── hand_eye_calib/ │ ├── launch/ # 标定主流程 launch 文件 │ ├── nodes/ # Python/C 标定节点 │ ├── config/ # 相机内参、标定板参数 │ ├── data/ # 采集的位姿数据落盘目录 │ └── doc/ # 程序使用说明这个结构很典型data/目录存在感不高但如果你标定完发现结果不理想想复盘它能帮你保留现场。我一般会在每轮标定前清空data/避免上一轮的数据混进来污染结果。3.2 编译与依赖检查catkin_make 之前先确认这四样编译之前先确认环境。手眼标定程序包依赖四样东西ROS 核心以 ROS1 Noetic 为例ROS2 同理、OpenCV、tf2 相关库、以及你相机型号对应的驱动。如果环境还没装好用鱼香ROS的一键安装脚本是最省时间的路径安装完之后记得source /opt/ros/noetic/setup.bash。检查顺序有一套固化的命令# 1. 检查 ROS 环境是否正常输出包含 version 才算就绪 roscore --version # 2. 检查 OpenCV 版本低于 3.4 建议升级 pkg-config --modversion opencv4 # 3. 检查依赖包是否装上 rospack find tf2_ros rospack find cv_bridge # 4. 创建并编译工作空间 mkdir -p ~/hand_eye_calib_ws/src cd ~/hand_eye_calib_ws catkin_make source devel/setup.bash逻辑说明前三条命令分别验证 ROS 主框架、视觉库和 TF 通信库rospack find找不到包说明依赖没装全这时候编译会报 package not found。catkin_make编译整个工作空间如果源码里有编译错误通常集中在 OpenCV 头文件路径和 Eigen 库冲突这两类后面避坑章节再细说。参数说明catkin_make -j2可以限制编译并行数机器内存小的时候能避免 OOM。另外如果你装的是 ROS2对应的命令是colcon build程序包若只写了 ROS1 接口需要先用ros1_bridge或者改源码适配不建议硬编。3.3 第一轮标定怎么跑launch 文件逐行拆解编译通过之后运行标定主流程靠 launch 文件。一个标准的手眼标定 launch 要启动三部分相机驱动、标定板检测节点、标定主节点。以眼在手上的配置为例launch 文件的核心结构如下launch !-- 相机驱动按你的相机型号替换这里以 USB 相机为例 -- node namecamera_driver pkgusb_cam typeusb_cam_node outputscreen param namevideo_device value/dev/video0 / param namecamera_frame valuecamera_link / /node !-- 标定板检测aruco 检测节点发布 marker 的 tf -- node namearuco_detector pkgaruco_ros typesingle param namemarker_size value0.04 / param namecamera_frame valuecamera_link / param namemarker_frame valueboard_frame / /node !-- 手眼标定主节点 -- node namehand_eye_calib pkghand_eye_calib typecalib_node outputscreen param namesamples_max value30 / param namemin_rotation_deg value15 / param nameoutput_file value$(find hand_eye_calib)/data/hand_eye.yaml / /node /launch逻辑说明launch 文件里camera_frame和marker_frame两个参数决定了 tf 树的结构。相机驱动发布camera_link到图像帧的变换aruco 节点发布board_frame相对于相机的变换标定主节点从 tf 树里读取这两组数据。如果你用的是 RealSense 或海康相机驱动节点名和参数不同但原理一样。参数说明marker_size是标定板格子实际物理边长单位米这个值必须精确测量差 1mm 最终平移误差可能放大 10 倍samples_max是最多采样多少组数据min_rotation_deg是相邻两次采样之间末端姿态至少旋转多少度才入队低于这个值的数据高度相关对求解是负贡献。首轮标定建议把这些参数调保守先跑通再谈精度。4. 采样姿势决定标定精度数据采集脚本、数量策略与筛选逻辑4.1 采样数量与姿态分布15 组是底线30 组才稳手眼标定最反直觉的地方在这里不是采集几百组数据就能更准真正有效的是姿态的多样性。假设你的机械臂末端只在同一个位置附近前后移动姿态固定那么 100 组数据等价于 1 组数据因为 AXXB 方程在这些数据下是线性相关的解不唯一。理论上至少需要 3 组非平行的位姿才能求解工程上我一般按下面这个经验表来采配置最低样本数推荐样本数姿态要求眼在手外1020-30绕末端 X/Y/Z 轴都有 30° 的旋转眼在手上1025-30标定板在视野中心、边缘、角落都有分布采样策略分三点。第一机械臂末端要同时做旋转和平移不能只平移不旋转min_rotation_deg至少设 15 度30 度更稳。第二采样点要分散在相机视野的不同区域不要集中在视野中心边缘畸变区域能提供额外的约束信息。第三每两个采样点之间让机械臂走一个大回环打破数据的相关性我见过有人用连续低速轨迹采样数据一个挨一个最后解出来的矩阵验证精度很差。另外强调一点采样时机。必须在机械臂完全停止、振动消除之后再记录数据运动过程中采的帧位姿是模糊的检测到的标定板角点位置会偏移。4.2 数据采集脚本订阅 tf、把位姿落盘程序包一般会自带采样节点但自己写一个采集脚本能完全控制采样时机。下面这段 Python 脚本做了三件事监听 tf、在机械臂静止时采样、把位姿矩阵保存成文件。#!/usr/bin/env python3 import rospy import tf2_ros import yaml class HandEyeSampler: def __init__(self): self.tf_buffer tf2_ros.Buffer() self.listener tf2_ros.TransformListener(self.tf_buffer) self.samples [] def collect(self, base_frame, tool_frame, cam_frame, board_frame): # 用 tf 时间戳对齐保证同一时刻的位姿配对 try: tool self.tf_buffer.lookup_transform( base_frame, tool_frame, rospy.Time(0), rospy.Duration(1.0)) board self.tf_buffer.lookup_transform( cam_frame, board_frame, rospy.Time(0), rospy.Duration(1.0)) except (tf2_ros.LookupException, tf2_ros.ExtrapolationException) as e: rospy.logwarn(tf 获取失败跳过当前采样: %s, e) return False # 转成 4x4 齐次矩阵后入队 tool_mat self._to_matrix(tool.transform) board_mat self._to_matrix(board.transform) self.samples.append({tool: tool_mat, board: board_mat}) return True def save(self, path): with open(path, w) as f: yaml.dump(self.samples, f) rospy.loginfo(已保存 %d 组采样到 %s, len(self.samples), path) staticmethod def _to_matrix(t): import tf.transformations as tf_t return tf_t.translation_matrix([ t.translation.x, t.translation.y, t.translation.z ]).dot(tf_t.quaternion_matrix([ t.rotation.x, t.rotation.y, t.rotation.z, t.rotation.w ]))逻辑说明lookup_transform用rospy.Time(0)拿到当前最新的 tf并用Duration(1.0)做超时保护防止 tf 延迟导致位姿配对出错。保存成 YAML 格式是为了后续直接喂给cv2.calibrateHandEye这也是程序包数据目录最常见的落盘格式。参数说明base_frame、tool_frame要从你的机械臂 URDF 里确认常见的写法是base_link和tool0/ee_link。如果你用的机械臂有多个工具坐标系务必确认标定板装在哪个tool下采样的tool_frame要和实际装夹一致这是后面避坑章节还会提到的重点。4.3 数据筛选逻辑重投影误差与一致性检查采集完之后不要急着丢给求解器先做一轮筛选。手眼标定的筛选逻辑和视觉里程计类似核心是看重投影误差。把机械臂末端位姿和手眼矩阵的乘积投影到图像平面上和实际检测到的标定板角点做比较偏差超过阈值的帧直接剔除。import cv2 import numpy as np def compute_reprojection_error(hand_eye, tool_mats, board_mats, camera_matrix, dist_coeffs): errors [] for tool, board in zip(tool_mats, board_mats): # 标定板中心从相机坐标系变换到机械臂基座坐标系 board_in_base tool.dot(hand_eye).dot(board) # 把 3D 点投影到二维图像计算和检测角点的像素偏差 projected, _ cv2.projectPoints( board_in_base[:3, 3], np.zeros(3), np.zeros(3), camera_matrix, dist_coeffs) detected extract_corner_pixels(board) # 实际检测到的角点像素 errors.append(np.linalg.norm(projected - detected)) return np.array(errors) # 筛选剔除误差大于 2 像素的采样帧重新求解 valid errors 2.0 hand_eye_refined cv2.calibrateHandEye( tool_mats[valid], board_mats[valid], methodcv2.CALIB_HAND_EYE_PARK)逻辑说明这段代码先把标定板中心投影到图像平面和实际检测的角点像素坐标做差。误差大于 2 像素的帧说明检测或者 tf 有异常剔除后重跑calibrateHandEye结果通常会更稳定。注意extract_corner_pixels需要从你的检测节点里取不同检测器接口不同但思路一致。参数说明2 像素这个阈值不是死的视野大、相机分辨率低的场景可以放宽到 3 像素高分辨率近距作业可以收紧到 1 像素。筛完如果发现剔除了超过三分之一的帧说明采集阶段有问题不要靠筛选硬撑重采更划算。5. 手眼标定避坑指南实测翻车现场与排查路径5.1 视觉端翻车现场内参不准、TF 链路缺失、标定板检测失败现象一标定结果在验证时抓取偏差 2 厘米以上且偏差方向不固定。原因相机内参用的出厂默认值没有针对当前分辨率和对焦距离重新标定。内参不准标定板位姿 B 本身就是错的AXXB 解出来的手眼矩阵当然跟着错。解决先用棋盘格跑一遍相机内参标定得到camera_matrix和dist_coeffs把结果写进config/camera.yaml再回来做手眼标定。这一步别省内参影响重投影误差是全局性的。现象二标定节点启动后一直在等 tf控制台刷 LookupException。原因TF 树链路不完整。最常见的是camera_link到camera_color_optical_frame之间缺少静态变换或者机械臂的base_link到tool0的 URDF 没加载。解决用rosrun tf2_ros tf2_echo camera_link board_frame检查链路缺哪段补哪段静态变换。特别是用 RealSense 相机时camera_link和光学帧之间经常需要手动加static_transform_publisher。现象三aruco 标定板偶尔检测不到角点跳变导致标定结果方差大。原因光照不均匀、标定板反光、曝光时间过长导致运动模糊。解决换成哑光材质的标定板用外部光源补光把相机曝光时间调低手眼标定是静态采集不需要长时间曝光。min_rotation_deg调高也能减少抖动帧入队。5.2 机械臂端翻车现场数据退化、tool 关系错误、launch 顺序问题现象四每次标定结果都不一样同一组数据解出来的 X 矩阵差异很大。原因数据退化采样姿态太集中。机械臂末端只在一个姿态附近微调AXXB 方程组的奇异性高解不稳定。解决检查采样数据里旋转矩阵的分布绕 X/Y/Z 三个轴都要有 30 度以上的变化。另一个隐藏原因是机械臂关节角在奇异点附近末端位姿噪声被放大采样时尽量避开腕部奇异区域。现象五标定程序能跑结果也稳定但抓取目标时固定偏移 5 毫米。原因标定板相对末端法兰的变换tool-to-board没设准或者标定板装夹位置和程序里写的不一致。眼在手外配置下标定板是装在机械臂末端的这个变换被当作已知量代入方程错了就是固定偏移。解决用示教器把标定板中心在工具坐标系下的坐标精确测出来写进配置。如果是眼在手上配置反过来要确认标定板在工作台上的固定位置没有在标定过程中被挪动。现象六roslaunch 启动顺序不对标定节点比相机驱动先启动导致反复报错。原因ROS 节点之间没有启动顺序依赖标定节点启动时 tf 还没开始广播。解决在 launch 文件里用respawntrue让检测节点崩溃后自动重启或者把标定主节点做成收到第一帧有效 tf 再开始计时而非启动即开始采集。6. 标定完必须做的闭环验证一个棋盘格检验全部成果很多程序包标定完直接输出一个hand_eye.yaml你以为结束了实际上验证才是真正检验成果的时刻。我的验证方法很简单拿一块 A4 大小的棋盘格放在机械臂工作范围内任意位置先用相机识别它中心角点在相机坐标系下的坐标再用手眼矩阵变换到机械臂基座坐标系然后让机械臂末端移动到那个坐标看末端夹爪和棋盘格中心的重合偏差。# 验证把相机检测到的点变换到机械臂基座坐标系 import tf.transformations as tf_t # p_cam 是相机识别到的目标点齐次坐标 [x, y, z, 1] p_cam np.array([0.12, -0.05, 0.30, 1.0]) # 眼在手外p_base camera_to_base * p_cam p_base hand_eye.dot(p_cam) # 眼在手上p_base tool_to_base * hand_eye * p_cam # 需要额外取当前末端位姿 tool_to_base p_base current_tool_to_base.dot(hand_eye).dot(p_cam) # 机械臂运动到 p_base用示教器或激光测距确认偏差 move_to(p_base[:3])逻辑说明变换链把相机坐标系逐步映射到机械臂基座任何一环错了最终位置都会偏移。误差在 5 毫米内说明标定可用10 毫米以上需要回到数据采集阶段排查。验证流程要走三遍分别放在工作区左上角、中心、右下角偏差一致才算标定真正完成。如果三个点偏差方向一致怀疑 tool-to-board 设置有固定误差如果偏差随机优先怀疑数据退化或内参不准。另外我养成一个习惯每轮标定的数据先备份到带时间戳的目录里标定板挪过位置就强制重标一次不做任何假设。这个习惯帮我避掉过很多次返工希望也能帮到你。本文还有配套的精品资源点击获取

相关新闻

Windows 11无线网卡驱动下载安装全指南:从识别型号到稳定上网

Windows 11无线网卡驱动下载安装全指南:从识别型号到稳定上网

最近接到好几个朋友的求助:笔记本升级到 Windows 11 之后,Wi-Fi 图标直接消失,或者一直转圈连不上网,再要么就是频繁断连。一查原因,十有八九是无线网卡驱动出了问题。对这个话题我确实有不少实战经验,今天…

2026/10/10 3:15:13 阅读更多 →
本地部署27B大模型:一张显卡跑出生产力,TaoToken统一Key告别服务器焦虑

本地部署27B大模型:一张显卡跑出生产力,TaoToken统一Key告别服务器焦虑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:14:13 阅读更多 →
职场自动化工具 OpenClaw v2.7.9 办公类 Skill 实操教程:从 ClawHub 安装包到可复用配置

职场自动化工具 OpenClaw v2.7.9 办公类 Skill 实操教程:从 ClawHub 安装包到可复用配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:14:13 阅读更多 →

最新新闻

SolidWorks干涉检查排除隐藏实体,彻底解决幽灵干涉

SolidWorks干涉检查排除隐藏实体,彻底解决幽灵干涉

做SolidWorks装配体干涉检查时,最恼人的不是真查出干涉,而是查出一堆“看不见摸不着”的干涉。结果列表里明明列了好几条,你一条条点过去,模型却没有任何高亮,或者高亮一闪而过,怎么都找不到干涉位置&#…

2026/10/10 4:01:33 阅读更多 →
OpenClaw爆火背后暗藏四大高危漏洞,企业部署安全防线如何搭建?

OpenClaw爆火背后暗藏四大高危漏洞,企业部署安全防线如何搭建?

最近GitHub上最热闹的事,莫过于那个被戏称为“龙虾”的OpenClaw,一口气冲到几十万星标。连我一个平时只埋头写业务代码的朋友,都专门跑来问我这玩意到底能不能用在公司内部。我的回答是:能,但先别急着部署。星标数只能…

2026/10/10 4:01:33 阅读更多 →
SolidWorks干涉检查异常?隐藏零件仍参与计算的原因与解决

SolidWorks干涉检查异常?隐藏零件仍参与计算的原因与解决

“干涉检查异常”这六个字,SolidWorks 用户应该都不陌生。做装配体设计时,经常一跑干涉检查就弹出一大堆红色条目,里面赫然都是些已经被隐藏掉的实体和零件名字。于是上网搜“sw 干涉检查异常”,发现大量帖子都在说同一件事&#…

2026/10/10 4:01:33 阅读更多 →
iMessage恶意附件捕获实录:从“干净”样本到后门与辅助模块

iMessage恶意附件捕获实录:从“干净”样本到后门与辅助模块

做安全分析这么多年,有一个感受越来越深:真正难的不是漏洞利用本身,而是当恶意样本被伪装成一颗“无害的糖”送到你面前时,你有没有能力把它从海量的正常流量里捞出来。三角测量系列我们已经复盘到第7篇了,前几篇一直在…

2026/10/10 4:01:33 阅读更多 →
电动汽车充电负荷随机性下的蓄电池容量优化:建模与MATLAB实现

电动汽车充电负荷随机性下的蓄电池容量优化:建模与MATLAB实现

1. 负荷侧的真实世界:随机性来自哪,又该怎么量化先说一句题外话:如果你去翻早期储能容量配置的论文或报告,会发现大量方案都把电动汽车充电负荷当成一条“已知曲线”来算,给定一个峰值、一个总电量,然后配电…

2026/10/10 4:01:33 阅读更多 →
Python与PyMySQL操作MySQL全攻略:从增删改查到连接池与排错

Python与PyMySQL操作MySQL全攻略:从增删改查到连接池与排错

如果你做过几年 Python 后端,早晚会碰到一个场景:程序里得连一次 MySQL,读点数据,再写回去。我这些年写业务接口、做数据分析脚本、处理自动化任务,最常用的方案就是一估pymysql起步。它不是什么新东西,却是…

2026/10/10 4:00:33 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →