程序设计实习报告
程序设计实习报告 桂林理工大学 GUILIN UNIVERSITY OF TECHNOLOGY 程序设计实践课程 实习报告 学 院: 计算机科学与工程学院 # 班 级: ## 组 长: 组 员: 组 员: 组 员: 指导教师: 评 分/价: 1.基础实践部分 ...
程序设计实习报告 桂林理工大学 GUILIN UNIVERSITY OF TECHNOLOGY 程序设计实践课程 实习报告 学 院: 计算机科学与工程学院 # 班 级: ## 组 长: 组 员: 组 员: 组 员: 指导教师: 评 分/价: 1.基础实践部分 ...
视觉完整形态文档二
视觉组招新 自瞄: 1 (懂自瞄原理) 能量机关: 1(要求会调自瞄) 导航: 2(新导航 + 仿真) 两个人都要求会调导航 雷达+神经网络: 1(要求会调自瞄) 覃焕懿:× 翟清宇:× 代龙涵: 雷桐富: 何嘉琦:× 张瑄晴:× 覃富滔:× 范宴榕:
tmux简明速查手册(WSL/Linux通用) 1.安装 1 sudo apt update && sudo apt install tmux 2.启动与退出 启动tmux 1 tmux 退出当前窗格 1 exit 或 Ctrl+d 3.会话管理 1 2 3 4 5 分离会话(后台运行) Ctrl+b 然后按 d 重新连接(回到上次现场) tmux attach 列出所有会话 tmux ls 连接到指定会话 tmux attach -t 会话名 新建命名会话 tmux new -s 会话名 4.窗格管理 按键(先按Ctrl+b,再按下下一个键) ...
rust仿真环境配置: wsl + ros2 + rust 1.以管理员身份打开PowerShell或CMD 2.执行安装命令 1 wsl --install -d Ubuntu-24.04 3.设置用户名和密码 列出所有的ubantu版本 1 wsl -l -v 进入想要的版本 1 wsl -d Ubuntu-24.04 复制文件到根目录 ...
自瞄赛季汇报 自瞄技术历经人员流失与两年断续迭代,今年虽终得稳定落地,但7v7实战效果未达预期。当前流水火控仅适配爆发模式与高弹频哨兵,面对前哨站及冷却模式步兵命中效果大幅下滑,底层PID控制滞后严重,视觉组已开发的MPC先进火控受限于目前pid控制算法的落后难以落地,亟需为前哨站设计专用火控逻辑。 ...
三维点云测试方法 概述 安装PCL 安装Open3D 安装CloudCompare 激光三角测距: 线激光器向物体表面投射一条激光线,当物体表面有高低起伏时,激光线会发生弯曲和位移,相机(与激光器成固定角度)捕捉到这条变形激光线的二维图像,通过三角测量法计算出每个点亮度的中心点,最终拼接成完整的三维点云
完整形态文档: 自瞄开源引用 西工大自瞄: https://github.com/SnocrashWang/WMJAimer/wiki/WMJAimer-Project-Report 结合卡尔曼滤波器和熵权法匹配多运动模型的整车建模 上交自瞄: https://github.com/julyfun/rm.cv.fans?tab=readme-ov-file 三分法降自由度的yaw角优化 弹道重现的可视化调参 坐标变换器 同济自瞄: ...
Kalman filter
opencv知识库---整理 基本概念 预处理 按我的话来说,所谓预处理,就是在图像还未真正进行识别处理前,对图像进行简易、全局的处理。这一块通常在产生图片时进行操作,不属于我们视觉识别的重点(但是预处理真的很重要)。这里仅简单介绍我们使用的两个预处理过程。 降低曝光度 ...
leetcode //to_string()//数字转字符串 //stoi()字符串转数字 //string(1,char)字符转数字//string构造函数 1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转回int类型。 ...
测试笔记
Claude Code CLI: cli是一种通过输入文本指令来与电脑操作系统或软件进行交互的方式及 斜杠命令: 核心命令 /help 显示所有可用命令、快捷键和帮助信息,是入门和遗忘时的好帮手。 /init 在项目根目录生成 CLAUDE.md 文件。Claude 会在每次会话中读取此文件,用于存储项目规范、技术栈等持久化信息 ...
jakac5机械臂日志 开发日志: 6月9日 配置moveit_resources-ros2的官方例程 跑通单臂的rviz 6月10日 跑通双臂的rviz 6月11日 & 6月12日 准备考试 暂时搁置 6月13日 熟悉整个代码框架 ...
lab_plant
lab技术栈 三维重建: MVS(多视图立体) SfM(运动恢复结构) LIDAR SLAM 机器学习: 传统机器学习:随机森林、支持向量机(SVM)、岭回归(BLUP) 深度学习:基于多层神经网络的端到端学习方法 ...
QT QT控件: QPushBotton 作用: 可点击的按钮 QLabel 作用: 显示文字或图片 QSlider 作用: 滑块 QTextEdit 作用: 带边框的分组框 QProgress 作用: 进度条 QWeight QWeight是Qt中所有用户界面对象的基类: 它提供最基本的窗口/控件功能: 尺寸,位置,鼠标键盘事件, 绘图,样式表,父子关系 ...
rust仿真环境配置: wsl + ros2 + rust 1.以管理员身份打开PowerShell或CMD 2.执行安装命令 wsl –install -d Ubuntu-24.04 3.设置用户名和密码 列出所有的ubantu版本 wsl -l -v 进入想要的版本 ...
SSH
tmux简明速查手册(WSL/Linux通用) 1.安装 sudo apt update && sudo apt install tmux 2.启动与退出 启动tmux tmux 退出当前窗格 exit 或 Ctrl+d 3.会话管理 分离会话(后台运行) Ctrl+b 然后按 d 重新连接(回到上次现场) tmux attach 列出所有会话 tmux ls 连接到指定会话 tmux attach -t 会话名 新建命名会话 tmux new -s 会话名 ...
vision-lab开发日志 开发日志: lab_huofu: 5月28日 & 5月29日 % 5月30日 完成霍夫圆识别水质圆圈的程序 使用pca 分析试剂的色值 并做线性回归 lab_water: 6月7日: 拷贝程序 6月8日: 测试水质分析仪的摄像头 6月13日: 浏览项目框架 阅读项目qt程序 ...
吊车防碰撞开发日志
吊车物料单 激光雷达 livox - mid360 价格:4400 https://e.tb.cn/h.RrpiTHWhtCLfNLI?tk=yAT9ghmzX5k 深度相机 oak D - Lite 价格:1490 【京东】https://3.cn/2T3-w43E 「SmartFLY【OAK中国】[OAK-D-Lite] 人工智能双目深度相机 OpenCV AI Kit FF版本【定焦款】」
滤波器 卡尔曼滤波 互补滤波
三维重建 第一章: 摄像机几何 三维世界是怎么通过摄像机几何映射成二维的? 针孔模型 & 透镜 针孔摄像机 image.png 针孔摄像机 image.png image.png 随着光圈减小,成像效果如何变化? 越来越清晰,越来越暗 如何应对到达胶片的光线变少? 增加透镜: 透镜将多余光线聚焦到胶片上,增加了照片的亮度 image.png ...
数据库作业 第一章 1.6 什么是数据模型?数据模型的基本要素有哪些?为什么需要数据模型? (1). 数据模型定义 数据模型是对现实世界数据特征的抽象,用来描述数据、组织数据和对数据进行操作,是数据库中用来对现实世界进行抽象的工具,是数据库系统的核心和基础。 (2). 三大基本要素 数据结构:描述数据库的组成对象以及对象之间的联系,是对系统静态特性的描述。 数据操作:指对数据库中各种对象允许执行的操作集合,包含查询、增删改,是系统动态特性描述。 完整性约束条件:一组完整性规则,限定数据及数据间联系,保证数据正确、有效、相容。 (3). 需要数据模型的原因 现实世界信息复杂,计算机无法直接识别,数据模型完成现实世界→信息世界→机器世界的逐级抽象转换; 统一规范数据的组织、存储与操作方式,方便用户、开发人员、计算机理解数据; 作为数据库设计依据,支撑数据库存储、查询、维护等全部管理功能; 屏蔽底层硬件存储细节,实现数据独立,降低数据管理复杂度。 ...
自瞄赛季总结 给老师的汇报 自瞄技术历经人员流失与两年断续迭代,今年虽终得稳定落地,但7v7实战效果未达预期。当前流水火控仅适配爆发模式与高弹频哨兵,面对前哨站及冷却模式步兵命中效果大幅下滑,底层PID控制滞后严重,视觉组已开发的MPC先进火控受限于目前pid控制算法的落后难以落地,亟需为前哨站设计专用火控逻辑。 硬件层面,pitch轴6020电机小角度控制超调,轴承磨损与电机老化引入回差;微机平台老化严重,内存接口脱落导致帧率骤降,串口与相机掉线重连长达4和14秒,关键对局直接断供,013相机清晰度与主流016系列存在代差。传统底盘地形适应性差,复杂地形下车身剧烈晃动,自瞄难以持续锁定,算法能力无从发挥。 必须同步推进轮腿机器人研发以提升瞄准平台稳定性,并将p轴更换为4310电机、更新微机与相机,为MPC火控及专用击打逻辑扫清部署障碍,方能将已有识别跟踪能力转化为赛场实打实的命中效果。 ...
自瞄网页调试器开发日志 开发日志 6月3日 Init commit 自瞄网页调试器demo版本 网页初步跑通 但是还是不能显示摄像头数据 6月4日 修复图像无法显示的问题 原因 bug fix: rosbridge 对 uint8[] 类型字段会自动 Base64 编码 数据路径: Python list(jpg_bytes) → rosbridge Base64 编码 → 浏览器收到 Base64 字符串 如果用 new Uint8Array(string) 直接处理 Base64 字符串会得到无效数据 正确做法: atob() 解码 → 逐字符 charCodeAt() → Uint8Array ...
3v3复盘文档 1.哨兵记得装单发限位 -> 第一发弹丸的发弹延时比较大,低头的时候会漏弹 2.自瞄普遍很近处看不到,即使是6mm相机装甲板在近处已经很大了,pitch轴的俯角不够 -> 目前没有比较好的解决方案 3.全向的弹频等不如麦轮 -> 后续跟进 4.怀疑英雄炸超电后微机出现欠压,可能出现降压没有供电 -> 后续询问硬件组,考虑使用坏掉的超电测试 5.英雄发弹延时严重不稳定 -> 小陀螺转得很慢都打不中 6.所有车的自瞄的发弹延时普遍比较大将近200ms,严重不合理,严查电控拨弹盘代码 -> 尤其是英雄,导致英雄慢速小陀螺的火控都打不中,步兵泼水勉强打得中 7.视觉为什么电控延时普遍给了将近200ms,不合理,严查电控代码,哪里给了延时,跟随稳态误差有点不太对 电控时延给0后,火控期望线和当前云台角差距过大很不合理,严查电控代码 8.重点研究电控云台pid前馈技术,两点原因: (1) 小陀螺高速旋转后,由于中心不在云台yaw轴上,小陀螺后,出现离心力矩,且随着速度的增加,力矩越来越大 偏差方向和云台旋转方向相同 (2)mpc需要视觉计算的速度和加速度作为前馈 -> 计算力矩pid控制算法 9.考虑和贵州师范的人交流自瞄(重点交流英雄自瞄火控和mpc技术) 10.曝光调参困难,且严苛,(适应性训练调不出来可能就祭了i),考虑使用pid算法控制曝光 -> 明年新技术 11.考虑视觉仿真验证模拟器 12.摩擦轮可能存在稳定性问题,高强度比赛后,全向(疑似)和哨兵皆出现问题 -> 影响视觉落点和自瞄散布 13.全向自瞄比赛开始后给微机断电 -> 已解决电控降压接到射击模块 14.全向比赛过程中偶尔出现掉自瞄 -> 更换最新串口线 -> 目前效果还行,后续测试 15.记得备份比赛过程中的代码 16.导航时如果甩头甩得过分可能会出现走偏的问题 17.全向哨兵自瞄存在优先级的问题,经常是先看到谁就瞄谁 ,尤其是全向自瞄经常出现瞄准的不是操作手想要的目标 18.哨兵存在被别人偷屁股的情况 -> 跟进全向感知技术 19.3v3比赛后将重心放在推前哨战的技术上
3v3交流赛复盘文档 红色为优先级高的问题 1.全向相机焦距比赛后发现已经模糊,怀疑比赛过程中焦距发生了变化 -> 安装时不要动到相机的那两颗螺丝,安装后需要检查 ✔(已督促) 2.经实测发现比赛场地二值化阈值给160 曝光给2300 识别较为合适 (还未有严谨的论证) 3.哨兵使用的是12mm的镜头视野太窄,且进入导航后pitch轴晃动幅度太小,导致近距离都很难锁到敌人 -> 更换8mm镜头,提高pitch轴晃动幅度,yaw轴的转动幅度可以更改回去 ✔ 4.比赛时备场区没法调弹道的硬补偿,只能比赛场地外打弹调好,需要经常调试,每隔几小时变化一次,备场区只能使用激光笔调试, 调试前记得关闭重力补偿,调试完后记得打开重力补偿 ✔(确实需要调落点,但是还未查明原因) 5.微机散热存在问题,微机过热存在cpu降频问题,导致自瞄帧率严重下降 -> 已证明微机温度会显著影响自瞄帧率 √ 6.全向后面的C口和USB口坏了,哨兵的C口坏了,哨兵的usb口接触不良,为什么哨兵的C口还没有修好上学期就在催了,usb口接触不良,导致哨兵频繁出现掉自瞄掉导航的情况 还未解决 7.串口线和C口过于脆弱,经常出现掉串口的情况(包括视觉收不到电控数据,电控收不到视觉数据,usb没有反应) ✔(硬件加焊串口线) 8.目前实测打表硬补偿效果还好 调参不是很好调需要花较多时间,但是效果较好 ✔ 9.C口不够赛场上很难调试 -> 购买了HDMI便携屏(催促硬件修好c口和usb口) ✔ (全向后面的usb口修不好) 10.存在自瞄瞄歪的情况 -> 怀疑pid和坐标系的问题(过颠簸后测试自瞄如若出现该现象,打开rviz查看坐标系,如果坐标系错误,电控查找bug) -> 已找到是掉串口的问题 ✔ 偏移的大致距离: Image_856571903378208.jpg ...
7v7备赛计划 调前哨战的卡尔曼滤波器 降低发弹延时 , 稳定发弹延时 -> 调英雄自瞄 微机检修 -> 坏掉的口该修就修 靶车
AI辅助解决弹道复现BUG #pragma once #include // ROS相关头文件 #include “ros/ros.h” #include “rm_msgs/Armor.h” #include “rm_msgs/ArmorArray.h” #include “rm_msgs/RmSerial.h” #include <std_msgs/Float64.h> #include <angles/angles.h> #include <tf2/LinearMath/Transform.h> #include <tf2/LinearMath/Vector3.h> #include <tf2/LinearMath/Quaternion.h> // OpenCV相关头文件 #include <opencv2/opencv.hpp> #include <cv_bridge/cv_bridge.h> // 标准库头文件 #include #include // 时间相关头文件 #include #include #include #include <yaml-cpp/yaml.h> // 自定义头文件 #include “Calculater.hpp” #include “GimbalPos.hpp” #include “TargetModel.hpp” #include “visual.hpp” #include “CoorConverter.hpp” #include “math.hpp” #include “MPC.hpp” #include “trajectory_visualizer.hpp” using namespace std; using namespace cv; /* 自瞄文档 标准模型状态向量 X(0) -> 机器人中心的x坐标 X(1) -> 机器人中心x方向速度 X(2) -> 机器人中心的y坐标 X(3) -> 机器人中心y方向速度 X(4) -> 左侧装甲板的固定高度 X(5) -> 右侧装甲板的固定高度 X(6) -> 小装甲板旋转半径(左侧) X(7) -> 大装甲板旋转半径(右侧) X(8) -> 机器人整体偏航角yaw X(9) -> 偏航角速度palstance 前哨站状态向量 X(0): 机器人中心的x坐标 X(1): 机器人中心的y坐标 X(2): 第一块装甲板高度h1 X(3): 第二块装甲板高度h2 X(4): 第三块装甲板高度h3 X(5): 偏航角yaw X(6): 偏航角速度palstance / /* @brief 将弧度约束在[-pi, pi]范围内,大于n,减去2n;小于-n,加上2n @param angle 角度 / #ifndef _std_radian #define std_radian(angle) ((angle) + round((0 - (angle)) / (2 * PI)) * (2 * PI)) #endif //追踪类 template class Tracker{ private: double COMMAND_TIMESPAN; //电控延迟 double local_gravity; //重力加速度 double eTime; //曝光时间 / ======================== 系统参数 ======================== / //ROS相关 ros::NodeHandle nh; //ROS节点句柄 ros::Publisher debugpub; //debug发布者 ros::Publisher debugpub1; //debug1发布者 std_msgs::Float64 debugdate; //debug数据 std_msgs::Float64 debugdate1; //debug1数据 rm_msgs::RmSerial RmSerialData; //接收串口数据 tf2_ros::Buffer tfBuffer_; // TF 缓冲区 tf2_ros::TransformListener tfListener; // 声明一个tf2_ros::TransformListener对象,并传入tfBuffer rm_msgs::ArmorArrayConstPtr m_armors; // 接收装甲板数据 //图像处理相关 cv::Mat frame; //接收的原始图像 cv::Mat frame_; //被处理的图像副本(保护原图像) cv::Mat camera_matrix_; //相机内参(构造函数中) cv::Mat dist_coeffs_; //畸变系数(构造函数中) Image img; //图像工具 //坐标变换工具 CAL::Calculater cal; //计算工具 CoordinateTransformer* coorConverter; //装甲板评分参数 std::vector col; // 数列中的每个数代表矩阵的每一列 std::vector row; // 数列中的每个数代表矩阵的每一行 std::vector tmp_v; // 存储C(n,k)的中间结果 std::vector<std::vector> result; // 存储C(n,k)的结果 std::vector<std::vector> nAfour; // 存储A(n,4)的结果 std::vector<std::vector> fourAfour; // 存储A(4,4)的结果 std::map<int, int> row_col; // 存储最终结果,row_col[i]=j表示矩阵的第i行第j列是要选取的数 //数据关联参数 double min = 0, tmp = 0; /* ======================== 跟踪控制参数 ======================== / //基本跟踪参数 char TrackingID; //跟踪中的装甲板ID bool Switch_Armor; //装甲板切换标识符 double trackTime; //目标丢失判定时间(秒) //角度补偿参数 double pitch_compensation; //pitch补偿 double yaw_compensation; //yaw补偿 //火力控制参数 bool all_fire = false; //完全火力模式(不停止射击) / ======================== 装甲板预测参数 ======================== / //空间参考点参数 Eigen::Vector3d pegPos; //空间标准点(用于装甲板跳变判断) double peg_point_pixel_now; //当前装甲板在像素坐标系的位置 double peg_point_pixel_last; //位于像素标准坐标系的上一个装甲板位置 //子弹参数 double BulletVector = 22; //子弹速度(初值给24m/s) / ======================== 时间戳管理 ======================== / //装甲板跟踪时间 long long Now_Time_armor = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//当前时间戳(用于计算丢失时间) long long Track_Time_armor = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//丢失时间戳(用于计算丢失时间) //帧率计算 long long begin_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//首时间 long long end_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//尾时间 // C++工具时间戳 long long tool_begin_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//首时间 long long tool_end_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count();//尾时间 // ros工具时间戳 ros::Time tool_begin_Time_ros = ros::Time::now(); ros::Time tool_end_Time_ros = ros::Time::now(); // 获取装甲板tf时间(判断是否是相同帧) ros::Time last_tf_time = ros::Time::now(); / ======================== 标志位 ======================== / bool functional = true; // 射击模式 int m_center_tracked; // 锁中心状态标志位 bool m_track_center; // 是否跟随中心 bool m_fix_on; // 重力补偿开关 std::string config_path_; // 存储配置路径 unique_ptr targetModel; // 目标模型 ros::Publisher AngPub; // 角度话题发布者 std::shared_ptr m_MPC; // 模型预测控制器 // =========================== 阈值 ==================================== double m_score_tolerance; //装甲板匹配得分最大值 double m_switch_threshold; // 更新装甲板切换的角度阈值,角度制 double m_force_aim_palstance_threshold; // 强制允许发射的目标旋转速度最大值,弧度制 double m_aim_angle_tolerance; // 自动击发时目标装甲板相对偏角最大值,角度制 double m_aim_pose_tolerance; // 自动击发位姿偏差最大值,弧度制 double m_aim_center_angle_tolerance; // 跟随圆心自动击发目标偏角判断,角度制 double m_switch_trackmode_threshold; // 更换锁中心模式角速度阈值,弧度制 double m_aim_center_palstance_threshold;// 跟随圆心转跟随装甲板的目标旋转速度最大值,弧度制 // =========================== 可视化 =================================== std::vector<std::vectorEigen::Vector3d> visual_armor_position_pose_temp; // 用于可视化存储观测装甲板的全局变量 GimbalPose m_cur_pose; // 当前位姿 GimbalPose m_target_pose; // 目标位姿 GimbalPose m_target_pose_debug; // 用于debug,比较mpc和传统模式 // =========================== 串口补偿 ======================================= double m_rollOffset = 0; double m_pitchOffset = 0; double m_yawOffset = 0; public: Tracker(ros::NodeHandle& nh,const std::string& config_path) : config_path_(config_path), tfListener(tfBuffer_) { this->nh = nh; AngPub = nh.advertise<geometry_msgs::Vector3>("/auto_angle", 1000); debugpub = nh.advertise<std_msgs::Float64>("/debugpub", 1000); debugpub1 = nh.advertise<std_msgs::Float64>("/debugpub1", 1000); cal = new CAL::Calculater(this->nh,this->img); tfBuffer_.setUsingDedicatedThread(true); m_armors.reset(); // 显式初始化为空 // 初始化时创建 TargetModel targetModel = std::make_unique(config_path_); coorConverter = new CoordinateTransformer(config_path_); m_MPC = std::make_shared(config_path_); // 控制器初始化 // 检查配置文件路径是否有效 if (!config_path_.empty()) { try { setParam(config_path_); ROS_INFO(“Successfully loaded parameters from: %s”, config_path_.c_str()); } catch (const std::exception& e) { ROS_ERROR(“Failed to load parameters: %s”, e.what()); } } else { ROS_WARN(“No configuration file path provided. Using default parameters.”); } } ~Tracker() { delete cal; delete coorConverter; } /*************** * @brief 回调函数: 接受串口信息,并更新内部变量、TF、坐标系 * @param serial ROS 消息的智能指针,包含子弹速度、射击标志、补偿角度等 / void SetSerial(const rm_msgs::RmSerialConstPtr _serial){ if (_serial) { RmSerialData = _serial; // 目前注释掉了(到时候测试一下) // if(_serial->BulletVec > 10){ // BulletVector = _serial->BulletVec; // } if(_serial->ShootFlag == ‘f’){ functional = true; }else if(_serial->ShootFlag == ‘a’){ functional = true; }else{ functional = true; } // 从串口获取当前装甲板的姿态 m_cur_pose.roll = RmSerialData.Roll; m_cur_pose.pitch = RmSerialData.Pitch; m_cur_pose.yaw = RmSerialData.Yaw; // debug // ROS_INFO(“cur: pitch: %lf” , RmSerialData.Pitch); // ROS_INFO(“BulletVector: %lf” , BulletVector); // std::vectorEigen::Vector3d imuabsPos = cal->GetPos(“map”,“imu”,1); // cal->TFUpdata(“map”,“imuabs”,{0.0, 0.0, 0.0},{0.0, 0.0, imuabsPos[1].z()},0); // ROS_WARN(“have serial 3333333333333333333333333333”); } } /*************** * @brief 回调函数: 接收相机节点发送的图像,用于debug * @param img 图像信息 * @param frame 供算法线程直接使用的原始图 * @param frame_ 额外再 clone 一份,用于可视化 / void doimage(const sensor_msgs::ImageConstPtr img_) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(img_, sensor_msgs::image_encodings::BGR8); } catch(cv_bridge::Exception& e) { ROS_ERROR(“cv_bridge exception: %s”, e.what()); return; } frame = cv_ptr->image.clone(); frame_ = frame.clone(); // ROS_WARN(“have image 111111111111111111”); } // 回调函数: 接收识别发送的装甲板序列 void doArmors(rm_msgs::ArmorArrayConstPtr armors) { m_armors = armors; // ROS_WARN(“have armor 222222222222222222”); } /* * @brief 主跟踪循环:每帧调用一次,完成“决策 → 预测 → 补偿 → 发布”全链路 / void Track() { if (!m_armors) { cout « “消息队列为空” « endl; return; } try { //begin_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count(); if(!functional){ return; } TargetModel targetModel_temp = nullptr; targetModel_temp = armorUpdate(m_armors); if(targetModel_temp != nullptr){ cv::Point2d finAngle = {0.0, 0.0}; GimbalPose target_pose_temp = reconstruction_choose_compensation(); // 调试输出(打印云台需要转动到的角度) // cout « “pitch: " « target_pose_temp.pitch « " " « “yaw: " « target_pose_temp.yaw « endl; // 打印需要移动的相对角 // finAngle.x = target_pose_temp.pitch - m_cur_pose.pitch; // 计算需要移动的pitch角度 // finAngle.y = target_pose_temp.yaw - m_cur_pose.yaw; // 计算需要移动的yaw角度 // // // 陀螺仪的绝对角 finAngle.x = target_pose_temp.pitch; // 计算需要移动到的pitch角度 finAngle.y = target_pose_temp.yaw; // 计算需要移动到的yaw角度 // debug: 云台跟随效果rqt_plot打印 // yaw角 // debugdate.data = m_cur_pose.yaw; // 当前云台yaw角度 // debugdate1.data = target_pose_temp.yaw; // 计算出云台需要转动的yaw角度 // // pitch角 // debugdate.data = m_cur_pose.pitch; // 当前云台pitch角度 // debugdate1.data = target_pose_temp.pitch; // 计算出云台需要转动的pitch角度 // debug: 自动打弹打印 // cout « “finAngle.x: " « finAngle.x « " " « “finAngle.y: " « finAngle.y « endl; // cout « “是否允许打弹: " « targetModel_temp->auto_fire « endl; // if (targetModel_temp->auto_fire) { // debugdate.data = 1; // } // else { // debugdate.data = 0; // } Pub_Aangle(true, targetModel_temp->auto_fire, finAngle); }else{ Pub_Aangle(false); } // 帧率控制 // double time_line = 30.0; // end_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count(); // double frame_time = (end_Time - begin_Time)/1000.0; // if ((end_Time - begin_Time) - time_line < 0.0)// 帧率控制 // { // int sleep_time_ms = static_cast(time_line - (end_Time - begin_Time)); // std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time_ms)); // //frame_time = 0.03; // end_Time = chrono::time_point_castchrono::milliseconds(chrono::system_clock::now()).time_since_epoch().count(); // frame_time = (end_Time - begin_Time)/1000.0; // // cout « “sleep_time_ms:” « sleep_time_ms « “ms” « endl; // // cout « “frame_time:” « frame_time 1000 « “ms” « endl; // } // begin_Time = end_Time; // debugdate1.data = frame_time 1000; debugpub.publish(debugdate); debugpub1.publish(debugdate1); } catch (const std::exception& e) { ROS_ERROR("[Exception] In Track function: %s”, e.what()); } } // 重构选板 GimbalPose reconstruction_choose_compensation() { // 目标装甲板 Armor abs_facing_armor; Armor abs_target_armor; double hit_time = 0; double center_hit_time = 0; double m_time_off = COMMAND_TIMESPAN + eTime + 0.025; /** * 严格意义上来说,如果要准确预测击中时刻的装甲板位置的话,需要解一个非线性方程。此处采用一种近似的解法 * 根据当前最近装甲板距离计算击中时间,用于预测目标装甲板出现的位置 * 事实上相当于一步牛顿迭代法,或者说一阶的线性化 ...
ai使用指南 Deepseek 一,推理模型与指令模型 指令模型v1,豆包… 你需要使用结构化的指令 推理模型o1,r1…. 你只需要清晰明确的表达你的需求 二,理解大语言模型的本质 特点1:大模型在训练时是将内容token化的,大模型看到和理解的世界与你不一样 特点2:大模型知识是存在截止时间的 r1的截止时间大概在2023年的10月到12月 问题: 行业认知断代问题 解决方法:打开联网搜索,或者上传文档 特点3:大模型缺乏自我认知/自我意识 多数模型都不知道自己是什么模型,除非在部署的时候在系统提示词做了对应设定 特点4: 大模型有记忆限制(64k/128k) 中文字大概最多3到4万字 对话轮数过多,可能会遗忘最初的聊天问题 特点5: 输出长度有限2000-4000 ...
C/C++代码中积累的语法 C/C++中的数据类型转换 数据类型自动转换 当不同类型的变量同时运算时就会发生数据类型的自动转换,以常见的 char、short、int、long、float、double 这些类型为例,如果 char 和 int 两个类型的变量相加时,就会把 char 先转换成 int 再进行加法运算,如果是 int 和 double 类型的变量相乘就会把 int 转换成 double 再进行运算。 ...
Debug segmentation fault 段错误
docker
Git分布式版本控制工具 1.基本命令行 ls/ll 查看当前目录 cat 查看文件内容 touch 创建文件 vi vi编辑器 2.创建.bashrc文件 打开用户目录,创建.bashrc文件 在.bashrc文件中输入 用于输出git提交日志 alias git-log=‘git log –pretty=oneline –all –graph –abbrev-commit’ 用于输出当前目录所有文件及其基本信息 alias ll=‘ls -al’ 3.解决GitBash乱码问题 1.打开GitBash执行下面指令 Git config –global core.quotepath false ...
labelme https://blog.csdn.net/Natsuago/article/details/143815956
lab相关文献阅读 阅读方法: image.png 笔记归档 image.png 文献一: 人工智能驱动的作物表型解析: 进展与挑战 这是一篇综述文章,本身不提出新算法,而是系统梳理了AI在六个表型维度上的已有技术方案和应用进展: image.png ...
leetcode //to_string()//数字转字符串 //stoi()字符串转数字 //string(1,char)字符转数字//string构造函数 1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转回int类型。 ...
Leetcode和蓝桥算法思路整理 数据结构 链表 双向链表 循环链表 链表栈 堆链表 栈 堆 队列 二叉树 平衡二叉树 二叉搜索树 平衡二叉搜索树 哈夫曼树 堆—优先队列 最小堆 最大堆 B树 B+树 并查集 红黑树 线段树 邻接表 邻接矩阵 集合 哈希表 有序集合 字典树 数组 二分查找 移除元素 双指针 快慢指针 双向指针 前后指针 区间和 滑动窗口 链表 ...
Linux操作系统 linux常用命令行 一.文件与目录操作 二.文本处理 三.权限管理 四.进程管理 五.系统信息与资源 六.网络相关 七.压缩与解压 八.快捷键与作业控制 九.包管理(不同发行版本) 十.实用技巧 管道 |: 将一个命令的输出作为另一个命令的输入 重定向: 覆盖写入文件, » 追加写入 2> 重定向错误输出, &> 重定向所有输出 通配符: * 匹配任一字符,? 匹配单个字符, [abc]匹配集合内字符 命令替换: &(command) 或反引号 ‘command’ ,例如 echo “今天十&(date)” ...
MPC MPC的核心思想是: 预测:使用系统模型预测未来一段时间内的状态 优化:求解一个有限时域的最优控制问题 反馈:只实施第一个控制量,然后重新计算
opencv知识库—整理 基本概念 预处理 按我的话来说,所谓预处理,就是在图像还未真正进行识别处理前,对图像进行简易、全局的处理。这一块通常在产生图片时进行操作,不属于我们视觉识别的重点(但是预处理真的很重要)。这里仅简单介绍我们使用的两个预处理过程。 降低曝光度 通过相机,我们能够源源不断地获取到当前的画面,也就是一帧帧的图像。自瞄算法处理的对象,就是这每一张图像。 在实战中,由于环境光的干扰,如果直接对图片进行算法处理,会错误的提取多余的特征,导致算法的准确度和速度大大降低。由于灯条自己会发光,可以有效和将灯条与环境光很好的区分开来。为了便于分离灯条与其他光线,一般将曝光设置得很低,如下图为相机获取到的画面:(RoboMaster视觉教程(1)摄像头) ...
OpenVINO OpenVINO 是做什么的? OpenVINO 是英特尔(Intel)开源的一套工具包,专门用于加速 AI 模型的推理(Inference)。 它的核心职责: 它不负责训练模型(那是 PyTorch 或 TensorFlow 的工作),它只负责使用模型。它能把你训练好的模型进行底层指令集的优化,让它在 Intel 的硬件(比如 CPU、集成显卡 iGPU、或者最新的 NPU)上跑得飞快。 为什么用 C++: 虽然 Python 开发快,但在工业落地(如自动驾驶、安防监控、医疗设备)中,通常要求极低的延迟和极高的性能,这时候 C++ + OpenVINO 就是黄金搭档。 ...
Prompt Engineering 提示工程 1.什么是提示词工程 当前是AGI时代 AGI Artificial General Intelligence 通用人工智能 我们在提示工程上的优势 我们懂原理,所以知道 为什么有的指令有效,有的指令无效 为什么同样的指令有时有效,有时无效 怎么提升指令的有效的概率 ...
rm第四阶段学习—自瞄 image.png image.png image.png opencv书 第八章检测兴趣点 这个概念的原理是,从图像中选取某些特征点并对 图像进行局部分析(即提取局部特征),而非观察整幅图像(即提取全局特征)。 视觉不变性 目前略 ...
ROS1 学习网址 https://bluesnie.github.io/Learning-notes/ROS2/%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%AD%A6%E7%AF%87/%E7%AC%AC7%E7%AB%A0-ROS2%E8%BF%90%E5%8A%A8%E5%AD%A6/001-TF2%E4%BB%8B%E7%BB%8D%E5%8F%8ARVIZ-TF%E7%BB%84%E4%BB%B6.html 创建工作空间功能包流程 遇到的bug: 最开始改CMakeLists.txt文件时改错文件了,而且居然改的时候有使用超级用户权限,应该改的文件是功能包的CMakeLists.txt文件,而不是工作空间的CMakeLists.txt文件,这个文件是自动生成的,后来意识到这个问题,但是改的时候一直没有意识到权限不够,我以为我改了实际上我没有更改成功,最后知道新开了一个工作空间重新编译才发现这个报了一摸一样的错误,才发现,之前一直以为是路径错误. ...
ROS2 第一章ROS2介绍 暂无 第二章准备环境与安装ROS2 暂无 第三章动手学ROS2基础 工作空间 工作空间是一个存放项目开发类相关文件的文件夹,是开发过程的大本营 src 代码空间 Install 安装空间 build 编译空间 Log 日志空间 创建工作空间: mkdir -p ~/dev-ws/src 节点:机器人的工作细胞 执行具体任务的进程 独立运行的可执行文件 可使用不同的编程语言 可分布式运行在不同主机 通过节点名称进行管理 节点操作 ros2 node list //当前正在运行的节点信息 ros2 node info //查看该节点信息 ros2 topic //话题 ros2 bag //录制 ...
SLAM 第一讲:预备知识 Simultaneous Localization and Mapping(同时定位与地图构建) 解决: 定位和建图 常见的库: Eigen:线性代数,Opencv:视觉处理,PCL:点云处理,g2o:slam框架,Ceres:非线性关系求解 ...
SQL
stm32 stm32基础知识 stm32开发方式 基于寄存器的方式 基于标准库 和基于HAL库的方式 新建工程 .建立工程文件夹,Keil中新建工程,选择型号 .工程文件夹中建立Start,Library,User等文件夹,复制固件库里面的文件到工程文件夹 .工程里对应建立Start,Library,User等同名称的分组,然后文件夹内的文件添加到工程分组里 .工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹 .工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER .工程选项,Debug,下拉列表选择对应调试器,Settings,Flash,Download里勾选Reset and Run ...
Vscode命令行 单文件编译 g++ -o 输出文件名 源文件.cpp 指定输出可执行文件名为…: 要编译的源文件名 或者 g++ 源文件.cpp -o 输出文件名 将要编译的源文件: 指定输出可执行文件名 ...
xv6 for RISC-V jyy xv6导读 基础知识 应用视角的操作系统: 对象 + API 把操作系统当提供服务的黑盒子 xv6:Unix v6的现代"克隆" 文件关系 源文件 (.c/.cpp) → 编译 → 目标文件 (.o) → 链接 → 可执行文件 ↓ 依赖文件 (.d) → 告诉构建系统何时需要重新编译 ...
安装ch343的驱动 解压并进入驱动目录 unzip ch343ser_linux-main.zip cd ch343ser_linux-main/driver 安装编译依赖(如果未安装) 驱动需要内核头文件和编译工具 image.png 编译驱动模块 在driver目录下执行 sudo make install 加载驱动并测试 先卸载可能已经自动加载的老驱动 ...
安装库遇到的问题 1.requests模块已经安装,vscode下无法导入requests模块 原因:python安装了多个版本,一个版本安装了库,另一个没有,而vscode调用的是另一个, 解决方法:1.ctrl + shift + p 快捷键 2.输入python select intepreter切换版本
操作系统 中山OS 复杂系统 多种内核架构 宏内核 微内核 外核 多内核 重要设计原则 策略与机制的分离 读写锁: 读-读共享: 只要没有人再写,多少个读者可以同时读取数据(不互斥) 读-写共享: 有人在写的时候,别人不能读; 有人在读的时候别人不能写 写-写互斥: 一个人在写的时候,别人也不能写 ...
常用快捷键 vs2022打开视图ctrl + shift + L 某些电脑Fn + win会禁用win功能 Vscode Ctrl + F搜索 Alt 拖动鼠标可以使用 方框框选
程序的并发 进程和线程和协程的区别 进程 线程 协程 线程池 线程安全队列 重排序队列 1.期望序列号: 下一个该输出的序号 2.暂存缓冲区(Buffer): 通常是一个Priority Queue(最小堆) 或Map/Hash 3.水位线/超时(Watermark/Timeout): 如果某个包一直不来,队列不能永远卡死,需要有跳过或触发重传的机制
单目视觉 单目视觉系统一般由一个相机或者一个相机与一个陀螺仪组成。 相机 完成图像识别任务 完成定位任务(一般基于PNP) 将目标定位在相机坐标系内 陀螺仪 将相机坐标系内的坐标转换到世界坐标系 深度信息 装甲板深度信息是指装甲板相对于机器人摄像头的距离信息,通常以深度图像或点云的形式表示。 ...
导航 感知: PCL pcl(Point Cloud Library,点云库) 是一个 大型,跨平台,开源,免费的 C++库,专门用来处理2D/3D图像和点云数据 image.png Bin Bin是点云地面分割算法中的网络容器,负责存储极坐标网格内的所有点,并实时维护该区域内Z值(高度)最小的点,因为该点最可能是地面点 ...
工程知识 编译: 预编译: 预编译头文件是一种编译器优化技术,用于大幅加速C/C++项目的编译速度 把常用的,不常变化的头文件预先编译成二进制形式,这样每个源文件编译时就不需要重新解析这些头文件 ...
桂工自瞄文档 开发记录: 1.双装甲板通信逻辑 2.帧率控制器,插值法 补偿ros时间(陈君提出) -> (前提解决相机装配误差) 3.卡尔曼滤波器,熵权法,整车建模(最难),多运动模型观测 4.选板逻辑 5.重力补偿弹道解算(西工大(采纳),同济(未采纳),上交四阶龙格库塔(中科大)) 上交线性空气阻力模型(采纳)(存在问题目前猜测由于pnp测距不准,在较远距离空气阻力击打倾斜效果很差) 无空气阻力的模型,它的角度和距离是线性,但是在远距离的时候,它的速度是随距离指数衰减的,在距离较远的时候,一点点测距误差就会导致比较大的角度偏差 6.三层前哨战卡尔曼修改(卡尔曼参数还需调试) 7.手写脱ros坐标变换器(重点: 角点变换) -> 待整理(目前矩阵命名是相反的) -> 已整理 8.上交三分法降自由度优化yaw角(最后采用这个方案) 9.同济暴力搜索降自由度优化yaw角 (近距离存在问题) 10.识别角点优化(fitLine最小二乘法获得灯条角点 -> 优化后降自由度产生良好优化效果,0度范围角度不再跳变) 11.西工大mpc轨迹规划器(半成品) 12.约束平面求相机装配误差和完整误差补偿 -> 考虑使用RANSAC算法重构 13.弹道重现 -> 考虑后续实现弹道闭环 14.手眼标定(半成品) -> (传统手眼标定, 先进手眼标定(版本不够)) 15.火控流水打弹(500血 30转 3m 9s 70%命中率) 16.空气阻力弹道模型(存在bug未查明) 17.视觉弹频控制(旋转移动命中率到38%~50%) -> 效果不太好会影响dps -> 被废弃 18.同济mpc(未落地) -> 规划存在提前减速的效果 -> 电控和机械跟不上 但是由于: 开火时延是同济的十倍(200ms),20个时间片后的规划和预测云台做火控效果很差,双环pid跟随存在稳态误差需要添加电控时延但是20个时间片的预测效果就很差了,目前旋转移动目标,小弹丸命中率只有传统方法的一半(25%) 未来: 电控机械尽量减少开火延时 mpc规划的速度和加速度作为前馈发送给双环pid作为前馈或者考虑计算力矩控制算法(提升云台的跟随能力) 19.参考BA优化的思想优化pnp算法的测距(失败) 20.PCA主成分分析法(Principal Component Analysis, PCA)方法优化角点(哨兵没部署) 21.识别和相机采集多线程(初步编写) 22.全向感知(多相机采集调度)(仅初步学习线程池) 放弃多线程方案 -> 多进程方案已初步启动两个相机 -> 初步实现等待部署 23.ssh+自瞄网页调试 初步实现 24.修降自由度bug,修流水火控bug(调的参数好的情况下,火控有大的提升,英雄低速目标颗秒,高速静止目标100w麦轮50%命中率) -> 但是参数敏感每隔几个小时参数就会变,而且实战环境复杂,命中困难 25.迭代法求子弹飞行时间(无空气阻力) -> 有空气阻力曾经实现过未通过测试 26.多段测距的弹道硬补偿(弹道标定) 已测试 效果不错 但调参成本大 27.自瞄网页调试器 初步实现 28.自瞄Python单测(计划实现) 29.自瞄ros2重构(计划实现) 30.全向感知技术(半成品) -> (计划实现) 31.针对前哨和远距离目标的新火控(计划实现) -> 远距离(单点) 前哨(跟随上再击打) 32.给自瞄接入gazebo仿真 初步实现 ...
牛客面经 1.环境变量的作用? 2.编译器和解释器的区别? 3.b树和b+树的区别?
前后端 React https://react.dev/learn JavaWeb HTML 基础教程 https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML CSS 基础教程 https://developer.mozilla.org/zh-CN/docs/Learn/CSS/First_steps 标签 image.png image.png DIV 是一个块级容器,就像一个无形的盒子,用来把页面内容分成不同的部分,方便用CSS控制样式和布局 你可以把页头,导航栏,内容区,页脚分别放进不同的里,然后用CSS去控制每个盒子的位置,大小,背景等 ...
嵌入式自学指南 书籍推荐 C primer plus 大话数据结构 电子元器件 51单片机 stm32 —- 野火 — 基于stm32开发板实战指南 标准库 寄存器 cc2530 RT-THread freeRTOS 学到这里就可以找实习 方向1 硬件 画板子 qt ...
深入理解计算机系统 第一章:计算机系统漫游 1.1信息就是位+上下文 基本思想:系统中所有的信息————包括磁盘文件,内存中的程序,内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象的上下文。 C语言的起源: C语言最开始作为一种用于Unix系统的程序语言开发出来的。 ...
视觉完整形态文档 战术定位,核心研发功能点,规划调整 核心研发功能点中的“自瞄预测与控制”的规划有所修改,针对追踪与开火逻辑进行了修改,从原来的EKF预测加双环PID控制,改为运动学模型结合MPC优化,并剥离开火逻辑的方案。 ...
视觉中期文档 634bebc64df5b4279a6577b9cf918ff.jpg 今年,我们视觉方案的核心是构建一个能在复杂比赛环境下稳定命中的高帧率自瞄系统。针对去年小陀螺跟踪不稳、远距离命中率低的问题,我们从预测模型、弹道解算到系统延时进行了全链路升级。 ...
视觉组培训计划 第一阶段: 电控视觉硬件C语言联培 推荐时间: 10.1~11.15 学习内容: 与电控,硬件联合进行C语言培训,每周布置一次作业并进行评分 推荐学习资料: C primer plus 翁恺C语言 考核方式: 月底 进行C语言线下考核 ...
数学建模 image.png
数学建模 - matlab matlab 1.matlab界面及基本操作 clc — 清空命令行 clear — 清空工作区 按上方向键 — 调用历史命令 % 后面写的都是注释 命令行敲回车执行 脚本文件 函数文件结尾尾缀.m 实时脚本文件尾缀.mlx 分节符 ...
完整形态文档: 自瞄开源引用 西工大自瞄: https://github.com/SnocrashWang/WMJAimer/wiki/WMJAimer-Project-Report 结合卡尔曼滤波器和熵权法匹配多运动模型的整车建模 上交自瞄: https://github.com/julyfun/rm.cv.fans?tab=readme-ov-file 三分法降自由度的yaw角优化 弹道重现的可视化调参 坐标变换器 同济自瞄: https://github.com/TongjiSuperPower/sp_vision_25/ 暴力搜索法降自由度的yaw角优化 MPC轨迹规划器 ...
相机标定 相机标定基本概念 OpenCV中的相机标定是计算机视觉中的一个重要任务,它用于确定相机的内部参数(如焦距、主点位置等)和外部参数(如相机相对于世界坐标系的旋转和平移)。 确定内部参数和外部参数 ...
自瞄赛前代码检查+备忘录 赛前检查代码+调参: 1.硬补偿(瞄准yaml) 调落点 2.识别阈值(曝光: 识别yaml + 二值化阈值new_detector.hpp文件中): 基地识别参数: 160 2300 3v3比赛参数: 220 2300(当时英雄给了220 1000 不知道220 2300怎么样没试) 7v7比赛参数: 待定 ...
自瞄使用说明书 长按鼠标右键进入自瞄,松开鼠标右键退出自瞄 右键后按住q键自动开火,松开右键取消自瞄和自动开火,(考虑到英雄弹频过低,且大弹丸触发严格,英雄火控阈值较为严格,如果q键没有打弹说明自瞄认为当前开火时机不够好不适合打弹(也有可能是卡弹了)) 建议如果使用自瞄击打目标请使用q键开火 左键手动开火 请在装甲板数字和灯条未遮挡时使用自瞄,否则视觉无法识别敌方装甲板 如若不确定自瞄是否识别敌方装甲板到请使用q键开火 目前自瞄合适的射击距离在4.5m以内,超过4.5m后命中率会显著下降,但还是可以尝试击打 温馨提示: 如若自瞄瞄歪或者掉自瞄,请果断在该场比赛放弃自瞄,并在赛后马上寻找视觉组紧急处理问题