视觉完整形态文档二

视觉完整形态文档二

机器人
2026-06-28 · 1 分钟 · 9 字 · 本机 0 · 机器人视觉 · dong · 

视觉组招新

视觉组招新 自瞄: 1 (懂自瞄原理) 能量机关: 1(要求会调自瞄) 导航: 2(新导航 + 仿真) 两个人都要求会调导航 雷达+神经网络: 1(要求会调自瞄) 覃焕懿:× 翟清宇:× 代龙涵: 雷桐富: 何嘉琦:× 张瑄晴:× 覃富滔:× 范宴榕:

机器人
2026-06-28 · 1 分钟 · 106 字 · 本机 0 · 机器人视觉 · dong · 

rust仿真环境配置_ wsl + ros2 + rust

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 复制文件到根目录 ...

ROS

自瞄赛季汇报

自瞄赛季汇报 自瞄技术历经人员流失与两年断续迭代,今年虽终得稳定落地,但7v7实战效果未达预期。当前流水火控仅适配爆发模式与高弹频哨兵,面对前哨站及冷却模式步兵命中效果大幅下滑,底层PID控制滞后严重,视觉组已开发的MPC先进火控受限于目前pid控制算法的落后难以落地,亟需为前哨站设计专用火控逻辑。 ...

机器人 复盘

三维点云测试方法

三维点云测试方法 概述 安装PCL 安装Open3D 安装CloudCompare 激光三角测距: 线激光器向物体表面投射一条激光线,当物体表面有高低起伏时,激光线会发生弯曲和位移,相机(与激光器成固定角度)捕捉到这条变形激光线的二维图像,通过三角测量法计算出每个点亮度的中心点,最终拼接成完整的三维点云

机器人
2026-06-06 · 1 分钟 · 146 字 · 本机 0 · 机器人视觉 · dong · 

完整形态文档_ 自瞄开源引用

完整形态文档: 自瞄开源引用 西工大自瞄: https://github.com/SnocrashWang/WMJAimer/wiki/WMJAimer-Project-Report 结合卡尔曼滤波器和熵权法匹配多运动模型的整车建模 上交自瞄: https://github.com/julyfun/rm.cv.fans?tab=readme-ov-file 三分法降自由度的yaw角优化 弹道重现的可视化调参 坐标变换器 同济自瞄: ...

机器人
2026-06-06 · 1 分钟 · 142 字 · 本机 0 · 机器人视觉 · dong · 

rust仿真环境配置: wsl + ros2 + rust

rust仿真环境配置: wsl + ros2 + rust 1.以管理员身份打开PowerShell或CMD 2.执行安装命令 wsl –install -d Ubuntu-24.04 3.设置用户名和密码 列出所有的ubantu版本 wsl -l -v 进入想要的版本 ...

ROS Python

三维重建

三维重建 第一章: 摄像机几何 三维世界是怎么通过摄像机几何映射成二维的? 针孔模型 & 透镜 针孔摄像机 image.png 针孔摄像机 image.png image.png 随着光圈减小,成像效果如何变化? 越来越清晰,越来越暗 如何应对到达胶片的光线变少? 增加透镜: 透镜将多余光线聚焦到胶片上,增加了照片的亮度 image.png ...

机器人
1970-01-21 · 2 分钟 · 602 字 · 本机 0 · 机器人视觉 · dong · 

自瞄赛季总结

自瞄赛季总结 给老师的汇报 自瞄技术历经人员流失与两年断续迭代,今年虽终得稳定落地,但7v7实战效果未达预期。当前流水火控仅适配爆发模式与高弹频哨兵,面对前哨站及冷却模式步兵命中效果大幅下滑,底层PID控制滞后严重,视觉组已开发的MPC先进火控受限于目前pid控制算法的落后难以落地,亟需为前哨站设计专用火控逻辑。 硬件层面,pitch轴6020电机小角度控制超调,轴承磨损与电机老化引入回差;微机平台老化严重,内存接口脱落导致帧率骤降,串口与相机掉线重连长达4和14秒,关键对局直接断供,013相机清晰度与主流016系列存在代差。传统底盘地形适应性差,复杂地形下车身剧烈晃动,自瞄难以持续锁定,算法能力无从发挥。 必须同步推进轮腿机器人研发以提升瞄准平台稳定性,并将p轴更换为4310电机、更新微机与相机,为MPC火控及专用击打逻辑扫清部署障碍,方能将已有识别跟踪能力转化为赛场实打实的命中效果。 ...

机器人 复盘
1970-01-21 · 11 分钟 · 5173 字 · 本机 0 · 机器人视觉 · dong · 

自瞄网页调试器开发日志

自瞄网页调试器开发日志 开发日志 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 ...

机器人
1970-01-21 · 2 分钟 · 520 字 · 本机 0 · 机器人视觉 · dong · 

AI辅助解决弹道复现BUG

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 机器人
1970-01-21 · 220 分钟 · 109727 字 · 本机 0 · 机器人视觉 · dong · 

rm第四阶段学习---自瞄

rm第四阶段学习—自瞄 image.png image.png image.png opencv书 第八章检测兴趣点 这个概念的原理是,从图像中选取某些特征点并对 图像进行局部分析(即提取局部特征),而非观察整幅图像(即提取全局特征)。 视觉不变性 目前略 ...

机器人
1970-01-21 · 2 分钟 · 621 字 · 本机 0 · 机器人视觉 · dong · 

ROS1

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文件,这个文件是自动生成的,后来意识到这个问题,但是改的时候一直没有意识到权限不够,我以为我改了实际上我没有更改成功,最后知道新开了一个工作空间重新编译才发现这个报了一摸一样的错误,才发现,之前一直以为是路径错误. ...

ROS
1970-01-21 · 14 分钟 · 6776 字 · 本机 0 · 机器人视觉 · dong ·  更新于 2026年6月29日 @197fd12

ROS2

ROS2 第一章ROS2介绍 暂无 第二章准备环境与安装ROS2 暂无 第三章动手学ROS2基础 工作空间 工作空间是一个存放项目开发类相关文件的文件夹,是开发过程的大本营 src 代码空间 Install 安装空间 build 编译空间 Log 日志空间 创建工作空间: mkdir -p ~/dev-ws/src 节点:机器人的工作细胞 执行具体任务的进程 独立运行的可执行文件 可使用不同的编程语言 可分布式运行在不同主机 通过节点名称进行管理 节点操作 ros2 node list //当前正在运行的节点信息 ros2 node info //查看该节点信息 ros2 topic //话题 ros2 bag //录制 ...

ROS
1970-01-21 · 16 分钟 · 7844 字 · 本机 0 · 机器人视觉 · dong ·  更新于 2026年6月29日 @197fd12

SLAM

SLAM 第一讲:预备知识 Simultaneous Localization and Mapping(同时定位与地图构建) 解决: 定位和建图 常见的库: Eigen:线性代数,Opencv:视觉处理,PCL:点云处理,g2o:slam框架,Ceres:非线性关系求解 ...

ROS
1970-01-21 · 7 分钟 · 3298 字 · 本机 0 · 机器人视觉 · dong ·  更新于 2026年6月29日 @197fd12

stm32

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 ...

机器人
1970-01-21 · 28 分钟 · 13538 字 · 本机 0 · 机器人视觉 · dong ·  更新于 2026年6月29日 @197fd12

单目视觉

单目视觉 单目视觉系统一般由一个相机或者一个相机与一个陀螺仪组成。 相机 完成图像识别任务 完成定位任务(一般基于PNP) 将目标定位在相机坐标系内 陀螺仪 将相机坐标系内的坐标转换到世界坐标系 深度信息 装甲板深度信息是指装甲板相对于机器人摄像头的距离信息,通常以深度图像或点云的形式表示。 ...

机器人
1970-01-21 · 3 分钟 · 1048 字 · 本机 0 · 机器人视觉 · dong · 

桂工自瞄文档置顶

桂工自瞄文档 开发记录: 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仿真 初步实现 ...

机器人
1970-01-21 · 37 分钟 · 18161 字 · 本机 0 · 机器人视觉 · dong · 

视觉完整形态文档

视觉完整形态文档 战术定位,核心研发功能点,规划调整 核心研发功能点中的“自瞄预测与控制”的规划有所修改,针对追踪与开火逻辑进行了修改,从原来的EKF预测加双环PID控制,改为运动学模型结合MPC优化,并剥离开火逻辑的方案。 ...

机器人
1970-01-21 · 12 分钟 · 5854 字 · 本机 0 · 机器人视觉 · dong · 

视觉中期文档

视觉中期文档 634bebc64df5b4279a6577b9cf918ff.jpg 今年,我们视觉方案的核心是构建一个能在复杂比赛环境下稳定命中的高帧率自瞄系统。针对去年小陀螺跟踪不稳、远距离命中率低的问题,我们从预测模型、弹道解算到系统延时进行了全链路升级。 ...

机器人
1970-01-21 · 3 分钟 · 1070 字 · 本机 0 · 机器人视觉 · dong · 

视觉组培训计划

视觉组培训计划 第一阶段: 电控视觉硬件C语言联培 推荐时间: 10.1~11.15 学习内容: 与电控,硬件联合进行C语言培训,每周布置一次作业并进行评分 推荐学习资料: C primer plus 翁恺C语言 考核方式: 月底 进行C语言线下考核 ...

机器人

完整形态文档: 自瞄开源引用

完整形态文档: 自瞄开源引用 西工大自瞄: 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轨迹规划器 ...

机器人
1970-01-21 · 1 分钟 · 142 字 · 本机 0 · 机器人视觉 · dong · 

相机标定

相机标定 相机标定基本概念 OpenCV中的相机标定是计算机视觉中的一个重要任务,它用于确定相机的内部参数(如焦距、主点位置等)和外部参数(如相机相对于世界坐标系的旋转和平移)。 确定内部参数和外部参数 ...

机器人
1970-01-21 · 5 分钟 · 2103 字 · 本机 0 · 机器人视觉 · dong · 

自瞄赛前代码检查+备忘录

自瞄赛前代码检查+备忘录 赛前检查代码+调参: 1.硬补偿(瞄准yaml) 调落点 2.识别阈值(曝光: 识别yaml + 二值化阈值new_detector.hpp文件中): 基地识别参数: 160 2300 3v3比赛参数: 220 2300(当时英雄给了220 1000 不知道220 2300怎么样没试) 7v7比赛参数: 待定 ...

机器人
1970-01-21 · 3 分钟 · 1072 字 · 本机 0 · 机器人视觉 · dong · 

自瞄使用说明书

自瞄使用说明书 长按鼠标右键进入自瞄,松开鼠标右键退出自瞄 右键后按住q键自动开火,松开右键取消自瞄和自动开火,(考虑到英雄弹频过低,且大弹丸触发严格,英雄火控阈值较为严格,如果q键没有打弹说明自瞄认为当前开火时机不够好不适合打弹(也有可能是卡弹了)) 建议如果使用自瞄击打目标请使用q键开火 左键手动开火 请在装甲板数字和灯条未遮挡时使用自瞄,否则视觉无法识别敌方装甲板 如若不确定自瞄是否识别敌方装甲板到请使用q键开火 目前自瞄合适的射击距离在4.5m以内,超过4.5m后命中率会显著下降,但还是可以尝试击打 温馨提示: 如若自瞄瞄歪或者掉自瞄,请果断在该场比赛放弃自瞄,并在赛后马上寻找视觉组紧急处理问题

机器人
1970-01-21 · 1 分钟 · 296 字 · 本机 0 · 机器人视觉 · dong ·