K230 部署 YOLOv8

介绍 部署 YOLOv8 目标检测算法到 K230 开发板上运行,本文记录完整的部署流程。 环境准备 软件依赖 CanMV IDE 已训练好的 YOLOv8 模型(best.pt) Python 环境(建议使用 conda) 硬件要求 K230 开发板(已刷好固件) 摄像头 模型转换 PyTorch → ONNX 将训练好的模型导出为 ONNX 格式,支持模型量化优化。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from ultralytics import YOLO if __name__ == "__main__": # 1. 加载训练好的 YOLO 模型 model = YOLO(r"..\best.pt") # 2. 调用 YOLO 模型实例的 export 方法 # 注意:这里不需要重新赋值 model,export 方法会直接生成 ONNX 文件 model.export( format="onnx", # 指定导出格式为 ONNX simplify=True, # 简化 ONNX 模型 imgsz=640, # 输入图像尺寸 opset=12 # ONNX 算子集版本 ) print("ONNX 模型导出成功!文件会保存在 best.pt 同目录下") ONNX → KModel 在 Windows 环境下完成模型转换。 ...

April 13, 2026 · 5 min · Zero-Kq

点云配准

点云配准方法介绍 常见的有 ICP、GICP、NDT 等,快捷实现基本基于 PCL 库中自带的点云处理实现。 GICP 原理 Generalized Iterative Closest Point (GICP) 是一种改进的 ICP 算法,通过协方差矩阵优化对应点匹配,提升配准精度。 头文件 1 2 3 4 5 6 7 #include <pcl/point_types.h> // 点类型定义 #include <pcl/point_cloud.h> // 点云容器 #include <pcl/registration/gicp.h> // GICP 算法核心 #include <pcl/registration/icp.h> // ICP 基类(部分功能依赖) #include <pcl/features/normal_3d.h> // 法向量估计(GICP 需要) #include <pcl/filters/voxel_grid.h> // 下采样(可选) #include <pcl/io/pcd_io.h> // PCD 文件读写 参数配置 参数 值 说明 setMaximumIterations 500 最大迭代次数,达到后停止配准 setTransformationEpsilon 1e-10 变换矩阵变化的收敛阈值,小于此值认为已收敛 setEuclideanFitnessEpsilon 0.0001 点到点欧氏距离误差的收敛阈值 setMaxCorrespondenceDistance 50.0 对应点搜索半径上限,超过则不考虑 setCorrespondenceRandomness 20 每次迭代随机采样对应点数量,影响计算效率和精度 setRANSACOutlierRejectionThreshold 0.05 RANSAC 离群点阈值,超过此距离的点被标记为异常值 setRANSACIterations 1000 RANSAC 迭代次数 setTransformationRotationEpsilon 1e-10 旋转矩阵变化的收敛阈值 setUseReciprocalCorrespondences false 是否使用互对应关系(source-target双向匹配) 测试结果 通过将目标点云变换作为原始点云进行测试,实际变换为 T=[10, 10, 10]m, R=[90, 0, 0]deg。 ...

April 1, 2026 · 3 min · Zero-Kq

Gtsam 学习笔记

介绍Gtsam Gtsam(General and Tunable Structure-from-Motion)是一个用于结构化从运动学(SFM)的优化库。Gtsam提供了一种基于图优化的算法,用于解决各种类型的结构化从运动学问题。Gtsam支持多种优化算法,如Levenberg-Marquardt、Gauss-Newton、Dogleg、Gauss-Newton-Dogleg等,以及多种优化目标,如最小二乘、最小 Trust Region等。Gtsam提供了多种数据结构,如变量、因子、 优化问题等,以及多种工具函数,如线性方程求解、矩阵运算、向量运算等。(AI生成) Gtsam库 https://github.com/borglab/gtsam Gtsam的使用 快速使用 引入头文件 1 2 3 4 5 6 #include <gtsam/slam/PriorFactor.h> // 先验因子,为Pose提供绝对约束(如首帧初始位姿) #include <gtsam/nonlinear/ISAM2.h> // 增量平滑与建图优化器,支持增量式求解因子图 #include <gtsam/nonlinear/Values.h> // 优化变量值的容器,存储键值对形式 #include <gtsam/slam/BetweenFactor.h> // 里程计/回环约束因子,表示两Pose间相对变换 #include <gtsam/inference/Symbol.h> // GTSAM符号系统,用于生成因子图变量唯一键 ,当直接用帧创建key时无需引入 #include <gtsam/geometry/Pose3.h> // 3D位姿(Rot3旋转+Point3位置),表示机器人姿态 创建变量(Values) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // 使用 Symbol 创建唯一键:'x' + 0 = 键 "x0" gtsam::Key key1 = gtsam::symbol('x', 0); gtsam::Key key2 = gtsam::symbol('x', 1); //直接用帧数也可以 gtsam::Key key1 = 0; // 直接用整数 // 创建 Pose3 位姿(旋转 + 平移) gtsam::Rot3 rotation = gtsam::Rot3::Ypr(0.0, 0.0, 0.0); // yaw, pitch, roll gtsam::Point3 translation(0.0, 0.0, 0.0); // x, y, z gtsam::Pose3 pose1(rotation, translation); // 存入 Values 容器 gtsam::Values initial_values; initial_values.insert(key1, pose1); // 初始值 initial_values.insert(key2, pose1); // 第二帧初始值 创建噪声模型(NoiseModel) 1 2 3 4 5 6 7 8 9 // 高斯噪声模型(6维:旋转3维 + 平移3维) gtsam::Vector6 variance = (gtsam::Vector6() << 0.01, 0.01, 0.01, 0.1, 0.1, 0.1).finished(); gtsam::SharedNoiseModel noise = gtsam::noiseModel::Gaussian::Covariance( gtsam::Matrix6::Identity() * variance.asDiagonal()); // 或使用对角噪声模型 auto odometryNoise = gtsam::noiseModel::Diagonal::Sigmas( (gtsam::Vector6() << 0.05, 0.05, 0.05, 0.1, 0.1, 0.1).finished()); auto priorNoise = gtsam::noiseModel::Isotropic::Sigma(6, 0.01); 创建因子(Factor) 1 2 3 4 5 6 7 8 gtsam::NonlinearFactorGraph graph; // 先验因子(为第一帧提供绝对约束) graph.add(gtsam::PriorFactor<gtsam::Pose3>(key1, pose1, priorNoise)); // 里程计因子(两帧之间的相对变换) gtsam::Pose3 odom_delta = pose1.between(pose2); // 计算相对变换 graph.add(gtsam::BetweenFactor<gtsam::Pose3>(key1, key2, odom_delta, odometryNoise)); 创建 ISAM2 优化器 1 2 3 4 5 gtsam::ISAM2Params params; params.relinearizeThreshold = 0.01; // 重新线性化阈值 params.relinearizeSkip = 10; // 跳帧数 gtsam::ISAM2 isam(params); isam.update(graph, initial_values); // 首次更新 增量优化 1 2 3 4 5 6 7 8 9 10 11 12 13 // 添加新帧时 gtsam::Key key3 = gtsam::symbol('x', 2); initial_values.clear(); initial_values.insert(key3, pose_guess); // 新帧初始值 // 更新优化器(增量式,只优化新节点) isam.update(graph, initial_values); // 获取优化结果 gtsam::Values result = isam.calculateEstimate(); // 读取特定节点 gtsam::Pose3 optimized_pose = result.at<gtsam::Pose3>(key3); 完整示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include <gtsam/slam/PriorFactor.h> #include <gtsam/nonlinear/ISAM2.h> #include <gtsam/nonlinear/Values.h> #include <gtsam/slam/BetweenFactor.h> #include <gtsam/inference/Symbol.h> #include <gtsam/geometry/Pose3.h> int main() { // 1. 创建变量 gtsam::Key key1 = gtsam::symbol('x', 0); gtsam::Key key2 = gtsam::symbol('x', 1); gtsam::Pose3 pose1; // 单位位姿 gtsam::Pose3 pose2(gtsam::Rot3::Ypr(0.1, 0, 0), gtsam::Point3(1, 0, 0)); // 2. 创建噪声模型 auto priorNoise = gtsam::noiseModel::Isotropic::Sigma(6, 0.01); auto odomNoise = gtsam::noiseModel::Isotropic::Sigma(6, 0.05); // 3. 创建因子图 gtsam::NonlinearFactorGraph graph; graph.add(gtsam::PriorFactor<gtsam::Pose3>(key1, pose1, priorNoise)); // 先验 graph.add(gtsam::BetweenFactor<gtsam::Pose3>(key1, key2, pose1.between(pose2), odomNoise)); // 里程计 // 4. 创建初始值 gtsam::Values initial_values; initial_values.insert(key1, pose1); initial_values.insert(key2, pose2); // 5. ISAM2 优化 gtsam::ISAM2 isam; isam.update(graph, initial_values); gtsam::Values result = isam.calculateEstimate(); // 6. 读取结果 gtsam::Pose3 optimized_pose2 = result.at<gtsam::Pose3>(key2); std::cout << "Optimized pose: " << optimized_pose2 << std::endl; return 0; } 注意事项 每一个Key必须有初始值 一个图必须创建先验约束 不能有孤立节点,必须与其他节点建立约束 优化效果 原始x轴位移 ...

March 19, 2026 · 3 min · Zero-Kq

我的第一篇学习笔记

我的第一篇学习笔记 今天开始使用 Hugo 搭建我的学习笔记网站。 为什么选择 Hugo? Hugo 是一个静态网站生成器,具有以下优点: 构建速度快 主题丰富 易于部署到 GitHub Pages 下一步计划 学习更多 Hugo 知识 定制 PaperMod 主题 写更多学习笔记 持续更新中… Mermaid 图表示例 Hugo PaperMod 主题内置支持 Mermaid.js,可以直接使用。 流程图 flowchart TD A[开始] --> B{是否有问题?} B -->|是| C[分析问题] B -->|否| D[继续学习] C --> E[查找资料] E --> F[解决问题] F --> G[总结经验] G --> D D --> H[结束] 函数调用关系图 graph LR A[main 函数] --> B[init] A --> C[processData] C --> D[validateInput] C --> E[transformData] E --> F[saveResult] D --> F 类图/模块关系 classDiagram class App { +main() +init() } class DataProcessor { +processData() +validate() } class Storage { +save() +load() } App --> DataProcessor DataProcessor --> Storage 时序图 sequenceDiagram participant U as 用户 participant H as Hugo participant P as PaperMod participant G as GitHub Pages U->>H: 编写 Markdown H->>P: 生成静态页面 P->>G: 推送到仓库 G->>G: 自动部署 G-->>U: 网站上线

March 16, 2026 · 1 min · Zero-Kq

Ubuntu ROS 环境安装与配置指南

介绍 本文介绍在 Ubuntu 系统上安装与配置 ROS 环境的完整流程,包括系统编码与软件源检查、ROS2 Foxy 安装、ROS1 与 ROS2 环境切换、编译命令差异及常用终端指令对照。 1. 检查系统设置 1.1 检查编码 UTF-8 终端输入: 1 locale 出现如下输出信息说明编码为 UTF-8: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:en_US:en LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC=zh_CN.UTF-8 LC_TIME=zh_CN.UTF-8 LC_COLLATE="zh_CN.UTF-8" LC_MONETARY=zh_CN.UTF-8 LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL= 1.2 检查是否启用 Ubuntu Universe 存储库 终端输入: 1 apt-cache policy | grep universe 若输出如下则表示已启用: ...

March 12, 2026 · 2 min · Zero-Kq

GitHub 基础使用指南

介绍 本文介绍 GitHub 日常开发中的基础操作,包括使用 Personal Access Token 克隆私人仓库、保存 Git 凭据避免重复输入,以及配置全局与局部的用户名和邮箱。 1. 拉取私人仓库 1.1 创建 Personal Access Token 登录 GitHub,点击右上角头像 → Settings 左侧菜单选择 Developer settings 选择 Personal access tokens → Fine-grained tokens 点击 Generate new token → Generate new token (classic) 设置名称(如:我的开发令牌) 选择过期时间(建议选择较长时间,如 90 天或自定义) 选择仓库范围 All repositories 所有仓库,或者其他选项 勾选权限: 选择对应的权限领域 repositories(仓库)、Account(账户) 仓库中选择 Contents 可读写,其它权限按需设置 点击 Generate token 重要:复制生成的 token(只显示一次,请妥善保存) 1.2 使用 Token 克隆仓库 在命令行中执行: 1 git clone https://github.com/用户名/仓库名.git 当提示输入用户名和密码时: 提示项 填写内容 Username 你的 GitHub 用户名 Password 刚才复制的 Personal Access Token(不是你的 GitHub 密码) 示例: ...

March 11, 2026 · 1 min · Zero-Kq

无人机仿真环境搭建指南

介绍 本文记录无人机仿真开发环境的完整搭建流程,涵盖 ROS 安装、PX4-Autopilot 源码编译、Gazebo 仿真环境配置、MAVROS 通信中间件安装,以及 QGroundControl 地面站部署。 1. 安装 ROS 使用鱼香 ROS 一键安装脚本: 1 wget http://fishros.com/install -O fishros && . fishros 2. 安装 PX4-Autopilot 2.1 下载源码 1 git clone https://github.com/PX4/PX4-Autopilot.git 2.2 安装依赖 解压缩后执行: 1 2 cd ~/Desktop/PX4-Autopilot bash ./Tools/setup/ubuntu.sh 2.3 添加环境路径 编辑 ~/.bashrc 文件,添加以下内容: 1 2 3 4 source ~/桌面/PX4-Autopilot/Tools/setup_gazebo.bash ~/桌面/PX4-Autopilot ~/桌面/PX4-Autopilot/build/px4_sitl_default export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/桌面/PX4-Autopilot export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/桌面/PX4-Autopilot/Tools/sitl_gazebo # 具体路径取决于实际文件环境 使环境变量生效: 1 source ~/.bashrc 此时开启终端会打印以下信息: 1 2 3 GAZEBO_PLUGIN_PATH $GAZEBO_PLUGIN_PATH GAZEBO_MODEL_PATH $GAZEBO_MODEL_PATH LD_LIBRARY_PATH $LD_LIBRARY_PATH 可通过注释 setup_gazebo.bash 最后三句关闭打印。 ...

March 11, 2026 · 1 min · Zero-Kq