当前位置: 首页 > article >正文

传感器数据分发CollatedTrajectoryBuilder

一、前言首先对前面的知识做一个回顾从 node_main.cc 文件中开始;//根据配置文件命令行参数与话题重映射订阅默认话题开始一条轨迹 node.StartTrajectoryWithDefaultTopics(trajectory_options); ---------------------- 在node.cc里面 // 使用默认topic名字开始一条轨迹,也就是开始slam void Node::StartTrajectoryWithDefaultTopics(const TrajectoryOptions options) { absl::MutexLock lock(mutex_); // 检查TrajectoryOptions是否存在2d或者3d轨迹的配置信息 CHECK(ValidateTrajectoryOptions(options)); // 添加一条轨迹 AddTrajectory(options); } -------------------------- 在node.cc int Node::AddTrajectory(const TrajectoryOptions options) { const std::setcartographer::mapping::TrajectoryBuilderInterface::SensorId expected_sensor_ids ComputeExpectedSensorIds(options); // 调用map_builder_bridge的AddTrajectory, 添加一个轨迹 const int trajectory_id map_builder_bridge_.AddTrajectory(expected_sensor_ids, options); // 新增一个位姿估计器 AddExtrapolator(trajectory_id, options); ................................. // 订阅话题与注册回调函数 LaunchSubscribers(options, trajectory_id);其上的 map_builder_bridge_.AddTrajectory 与 LaunchSubscribers() 是十分重要的两个函数1map_builder_bridge_.AddTrajectory 函数主要的核心就是构建CollatedTrajectoryBuilder对象存储于 node::map_builder_bridge_::map_builder_::trajectory_builders_变量之中然后返回一个 trajectory_id再根据 trajectory_id 构建一个 SensorBridge对象创建该对象时代码如下// 在src\cartographer_ros\cartographer_ros\cartographer_ros\map_builder_bridge.cc // 的int MapBuilderBridge::AddTrajectory函数里 // Step: 2 为这个新轨迹 添加一个SensorBridge sensor_bridges_[trajectory_id] absl::make_uniqueSensorBridge( trajectory_options.num_subdivisions_per_laser_scan, trajectory_options.tracking_frame, node_options_.lookup_transform_timeout_sec, tf_buffer_, map_builder_-GetTrajectoryBuilder(trajectory_id)); // CollatedTrajectoryBuilder注意 其上的 GetTrajectoryBuilder(trajectory_id) 就是获取 trajectory_builders_ 中的 CollatedTrajectoryBuilder 对象。然后作为参数传送给 SensorBridge 的构造函数2) LaunchSubscribers() 会根据 trajectory_id 与其对应的配置 TrajectoryOptions options进行话题的订阅同时注册回调函数。所有的回调函数实现在src\cartographer_ros\cartographer_ros\cartographer_ros\sensor_bridge.cc根据查询的tf对数据完成进行坐标系变换(变换到tracking_frame)之后最终都会调用类似如下的一段代码或: trajectory_builder_-AddSensorData(sensor_id,carto::sensor::OdometryData{odometry_data-time, odometry_data-pose}); 或: trajectory_builder_-AddSensorData(sensor_id,carto::sensor::FixedFramePoseData{time, absl::optionalRigid3d()}); 或: trajectory_builder_-AddSensorData(sensor_id, carto::sensor::FixedFramePoseData{time, absl::optionalRigid3d(Rigid3d::Translation(ecef_to_local_frame_.value() *LatLongAltToEcef(msg-latitude, msg-longitude, msg-altitude)))}); 或: trajectory_builder_-AddSensorData(sensor_id, landmark_data); ......上面只列举了一部分从上面可以看出trajectory_builder_-AddSensorData() 函数接收了各种各样的数据类型那么其定然存在很多重载函数。其上的 trajectory_builder_ 就是 CollatedTrajectoryBuilder 的实例对象指针每个 trajectory_id 都有一个与之对应的 CollatedTrajectoryBuilder 实例对象指针。二、构造时的传参根据上面的介绍可以知道 trajectory_builder_ 就是类CollatedTrajectoryBuilder的实例指针是在 src/cartographer/cartographer/mapping/map_builder.cc 文件的 MapBuilder::AddTrajectoryBuilder() 函数中实例化通过上一篇博客了解到其2D轨迹与3D轨迹的构建过程如下// CollatedTrajectoryBuilder初始化 trajectory_builders_.push_back(absl::make_uniqueCollatedTrajectoryBuilder( trajectory_options, sensor_collator_.get(), trajectory_id, expected_sensor_ids, // 将3D前端与3D位姿图打包在一起, 传入CollatedTrajectoryBuilder CreateGlobalTrajectoryBuilder3D( std::move(local_trajectory_builder), trajectory_id, static_castPoseGraph3D*(pose_graph_.get()), local_slam_result_callback, pose_graph_odometry_motion_filter))); // CollatedTrajectoryBuilder初始化 trajectory_builders_.push_back(absl::make_uniqueCollatedTrajectoryBuilder( trajectory_options, sensor_collator_.get(), trajectory_id, expected_sensor_ids, // 将2D前端与2D位姿图打包在一起, 传入CollatedTrajectoryBuilder CreateGlobalTrajectoryBuilder2D( std::move(local_trajectory_builder), trajectory_id, static_castPoseGraph2D*(pose_graph_.get()), local_slam_result_callback, pose_graph_odometry_motion_filter)));三、C多态CollatedTrajectoryBuilder 类是在 src/cartographer/cartographer/mapping/internal/collated_trajectory_builder.cc 文件中定义。这里涉及到一个多态的知识点创建的实例类型为 CollatedTrajectoryBuilder*但是在构建 SensorBridge 时 SensorBridge 构造函数需要的类型为 carto::mapping::TrajectoryBuilderInterface*从 collated_trajectory_builder.h 文件中可以看到class CollatedTrajectoryBuilder : public TrajectoryBuilderInterface故 CollatedTrajectoryBuilder 是 TrajectoryBuilderInterface 的派生类。TrajectoryBuilderInterface 在 src/cartographer/cartographer/mapping/trajectory_builder_interface.h 文件中被声明。从类名以及代码可以很明显的看出其是一个接口类定义了很多的纯虚函数。一个接口类可以派生出很多类型的子类。构建 SensorBridge 构造函数需要的参数为基类 TrajectoryBuilderInterface这样有个好处也就是由 TrajectoryBuilderInterface 派生出来子类都可以用于 SensorBridge 的构造函数。CollatedTrajectoryBuilder类的主要作用就是使用 sensor::CollatorInterface 整理传感器数据, 然后将其传递到2D和3D通用的 mapping::TrajectoryBuilderInterface。另外再介绍一下 c11中的std::function 与 using 的模板部分具体化c11: std::function 通用多态函数封装器 std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标: 如函数、 lambda表达式、 bind表达式或其他函数对象, 还有指向成员函数指针和指向数据成员指针. 它也是对 C 中现有的可调用实体的一种类型安全的包裹相对来说, 函数指针的调用不是类型安全的在 trajectory_builder_interface.h 中可以看到如下一段代码// A callback which is called after local SLAM processes an accumulated // sensor::RangeData. If the data was inserted into a submap, reports the // assigned NodeId, otherwise nullptr if the data was filtered out. using LocalSlamResultCallback std::functionvoid(int /* trajectory ID */, common::Time, transform::Rigid3d /* local pose estimate */, sensor::RangeData /* in local frame */, std::unique_ptrconst InsertionResult);其上表示用 LocalSlamResultCallback 表示一个回调函数该回调函数无返回值需要传入五个参数。四、CollatedTrajectoryBuilder.h现在再来看类 CollatedTrajectoryBuilder在 collated_trajectory_builder.h 文件中可以看到 很多函数参数列表后买你都带了 override 关键字这里的 override 表示重写也就是说该函数就是重写父类函数而不是其他自身构建的函数如果该函数传入的参数或者返回值与父类不一致则会报错。那么现在就正式开始讲解首先在该类中共存在五个 void AddSensorData() 重载函数 如下所示// 处理雷达点云数据 void AddSensorData(const std::string sensor_id,const sensor::TimedPointCloudData timed_point_cloud_data) override {AddData(sensor::MakeDispatchable(sensor_id, timed_point_cloud_data));} // 处理IMU数据 void AddSensorData(const std::string sensor_id,const sensor::ImuData imu_data) override {AddData(sensor::MakeDispatchable(sensor_id, imu_data));} // 处理里程计数据 void AddSensorData(const std::string sensor_id,const sensor::OdometryData odometry_data) override {AddData(sensor::MakeDispatchable(sensor_id, odometry_data));} // 根据参数决定gps数据是否需要排序 // AddData与wrapped_trajectory_builder_-AddSensorData只能选一种 // 因为AddData最终调用的就是wrapped_trajectory_builder_-AddSensorData void AddSensorData(const std::string sensor_id,const sensor::FixedFramePoseData fixed_frame_pose_data) override {if (collate_fixed_frame_) { AddData(sensor::MakeDispatchable(sensor_id, fixed_frame_pose_data)); return; } wrapped_trajectory_builder_-AddSensorData(sensor_id,fixed_frame_pose_data); } // 根据参数决定Landmark数据是否需要排序 void AddSensorData(const std::string sensor_id,const sensor::LandmarkData landmark_data) override { if (collate_landmarks_) { AddData(sensor::MakeDispatchable(sensor_id, landmark_data)); return; } wrapped_trajectory_builder_-AddSensorData(sensor_id, landmark_data); }从上面的代码中可以看到一个共同调用的函数 AddData(sensor::MakeDispatchable(xxx))。处理GPS和Landmark数据时会对 collate_fixed_frame_ 与 collate_landmarks_ 参数进行判断然后再决定是否调用 AddData() 函数。这两个参数都是再 src/cartographer/configuration_files/trajectory_builder.lua 中设置。另外其上还可以看到wrapped_trajectory_builder_-AddSensorData(xxx)该部分类容后面进行讲解。同时在 collated_trajectory_builder.h 文件中还存在一个如下函数也是比较重要的的// 将local slam 的结果也作为一种传感器数据进行处理 void AddLocalSlamResultData(std::unique_ptrmapping::LocalSlamResultData local_slam_result_data) override { AddData(std::move(local_slam_result_data)); } private: void AddData(std::unique_ptrsensor::Data data); void HandleCollatedSensorData(const std::string sensor_id, std::unique_ptrsensor::Data data);后续会对他们进行详细的分析。五、CollatedTrajectoryBuilder.cc在大致了解了头文件之后在来看看 CollatedTrajectoryBuilder 的构造函数。首先要了解的就是该类实例化时传入的参数。这里回到前面的讲解的二、构造传参在src\cartographer\cartographer\mapping\map_builder.cc可以看到如下类似代码:trajectory_builders_.push_back(absl::make_uniqueCollatedTrajectoryBuilder( trajectory_options, sensor_collator_.get(), trajectory_id, expected_sensor_ids, // 第五个参数 将3D前端与3D位姿图打包在一起, 传入CollatedTrajectoryBuilder CreateGlobalTrajectoryBuilder3D( std::move(local_trajectory_builder), trajectory_id, static_castPoseGraph3D*(pose_graph_.get()), local_slam_result_callback, pose_graph_odometry_motion_filter)));可以看到构建 CollatedTrajectoryBuilder 对象时需要传入五个参数。特别是第五个参数时比较复杂的其返回为 GlobalTrajectoryBuilder 类对象// 第一部分3D 全局轨迹构建器创建函数 // 3d的完整的slam // 工厂函数专门创建 3D 版本的全局轨迹构建器把3D 前端和3D 后端绑定在一起 std::unique_ptrTrajectoryBuilderInterface CreateGlobalTrajectoryBuilder3D( // 参数1 3D局部SLAM前端负责实时算位姿、建子图 std::unique_ptrLocalTrajectoryBuilder3D local_trajectory_builder, // 参数2 轨迹id const int trajectory_id, // 参数3 3D 后端位姿图负责全局优化、回环闭合 mapping::PoseGraph3D* const pose_graph, // 参数4 局部SLAM结果回调 const TrajectoryBuilderInterface::LocalSlamResultCallback local_slam_result_callback, // 参数5 运动滤波器 const absl::optionalMotionFilter pose_graph_odometry_motion_filter) { // 创建并返回3D全局轨迹构建器 return absl::make_unique GlobalTrajectoryBuilderLocalTrajectoryBuilder3D, mapping::PoseGraph3D( std::move(local_trajectory_builder), trajectory_id, pose_graph, local_slam_result_callback, pose_graph_odometry_motion_filter); }注意该类继承于 TrajectoryBuilderInterface 接口。class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface {CollatedTrajectoryBuilder其构造函数及其初始化列表如下src\cartographer\cartographer\mapping\internal\collated_trajectory_builder.cc/** * brief Construct a new Collated Trajectory Builder:: Collated Trajectory Builder object * * param[in] trajectory_options 轨迹的参数配置 * param[in] sensor_collator 传入的整理传感器的类,有2种类型 * param[in] trajectory_id 新生成的轨迹的id * param[in] expected_sensor_ids 所有需要的topic的名字的集合 * param[in] wrapped_trajectory_builder 完整的slam GlobalTrajectoryBuilder */ CollatedTrajectoryBuilder::CollatedTrajectoryBuilder( const proto::TrajectoryBuilderOptions trajectory_options, sensor::CollatorInterface* const sensor_collator, const int trajectory_id, const std::setSensorId expected_sensor_ids, std::unique_ptrTrajectoryBuilderInterface wrapped_trajectory_builder) : sensor_collator_(sensor_collator), // 以下两个参数在 configuration_files/trajectory_builder.lua 中 // collate_landmarks 为 false, 不要将landmark数据放入到阻塞队列中 collate_landmarks_(trajectory_options.collate_landmarks()), // collate_fixed_frame 为 true, 将gps数据放入阻塞队列中 collate_fixed_frame_(trajectory_options.collate_fixed_frame()), trajectory_id_(trajectory_id), wrapped_trajectory_builder_(std::move(wrapped_trajectory_builder)), last_logging_time_(std::chrono::steady_clock::now()) { // 获取topic的名字, 并根据参数配置决定是否加入LANDMARK与gps的topic absl::flat_hash_setstd::string expected_sensor_id_strings; for (const auto sensor_id : expected_sensor_ids) { // collate_landmarks 为 false, sensor_collator_不处理LANDMARK数据 if (sensor_id.type SensorId::SensorType::LANDMARK !collate_landmarks_) { continue; } // collate_fixed_frame 为 true, sensor_collator_处理gps数据 if (sensor_id.type SensorId::SensorType::FIXED_FRAME_POSE !collate_fixed_frame_) { continue; } expected_sensor_id_strings.insert(sensor_id.id); } // sensor::Collator的初始化 sensor_collator_-AddTrajectory( trajectory_id, expected_sensor_id_strings, [this](const std::string sensor_id, std::unique_ptrsensor::Data data) { HandleCollatedSensorData(sensor_id, std::move(data)); }); } // 将数据传入sensor_collator_的AddSensorData进行排序 void CollatedTrajectoryBuilder::AddData(std::unique_ptrsensor::Data data) { sensor_collator_-AddSensorData(trajectory_id_, std::move(data)); }初步看起来还是挺复杂的先看看其简单的部分在初始化列表中从 trajectory_options 中获取 collate_landmarks 与 collate_fixed_frame 的配置信息然后赋值给 collate_landmarks_ 与 collate_fixed_frame_。trajectory_id 赋值给成员变量 trajectory_id_。同时还把传入的 CollatedTrajectoryBuilder 实例赋值给了 成员变量 wrapped_trajectory_builder_另外使用 last_logging_time_ 记录了初始化列表完成的时间。继续接着往下分析(1):其首先对参数 expected_sensor_ids(简单理解订阅的话题) 进行遍历用所有话题的名字构建一个集合 expected_sensor_id_strings。需要注意的是如果 collate_landmarks_ 与 collate_fixed_frame_ 设置为 false则 landmark 与 GPS 的话题不会添加到该集合之中。(2):传入的参数sensor::CollatorInterface* const sensor_collator调用 sensor_collator_-AddTrajectory() 函数实际就是对 sensor::Collator 实例对象的初始化。sensor_collator_-AddTrajectory() 函数 需要传入3个参数分别为 trajectory_id, expected_sensor_id_strings 以及一个 lambda 格式的函数指针。该 lambda 函数体比较简单实际就是调用了 CollatedTrajectoryBuilder::HandleCollatedSensorData() 函数。这个在下面讲解成员函数会有六、成员函数1、AddData()分了 CollatedTrajectoryBuilder 构造函数之后在来分析一下其他的成员函数// 将数据传入sensor_collator_的AddSensorData进行排序 void CollatedTrajectoryBuilder::AddData(std::unique_ptrsensor::Data data) { sensor_collator_-AddSensorData(trajectory_id_, std::move(data)); }该成员函数就是前面提到被多个重载 CollatedTrajectoryBuilder::AddSensorData() 函数调用的 AddData 函数。该函数比较简单就是调用 sensor::Collator 实例对象 sensor_collator_ 的 AddSensorData() 函数。关于 sensor::Collator 的相关内容后续为大家进行详细的讲解。2、HandleCollatedSensorData()该函数前面的内容暂时忽略在下一篇博客中会对 std::mapstd::string, common::RateTimer rate_timers_; 进行详细的讲解该函数最后就是将排序好的数据送入 GlobalTrajectoryBuilder中的AddSensorData()函数中进行使用执行如下代码// 将排序好的数据送入 GlobalTrajectoryBuilder中的AddSensorData()函数中进行使用 >// 调用传入的trajectory_builder的AddSensorData() void AddToTrajectoryBuilder( mapping::TrajectoryBuilderInterface *const trajectory_builder) override { trajectory_builder-AddSensorData(sensor_id_, data_); }七、结语如果大家觉得比较懵逼也没有关系后续了解了其他相关类之后到时候再进行复盘一下就比较比较简单了先来对该篇博客做个总结把。1):首先在开启一条新轨迹的时候会调用 src/cartographer/cartographer/mapping/map_builder.cc 中的 MapBuilder::AddTrajectoryBuilder() 函数该函数中会构建一个 CollatedTrajectoryBuilder 对象存储于 trajectory_builders_ 之中。2): src/cartographer_ros/cartographer_ros/cartographer_ros/map_builder_bridge.cc 文件中的MapBuilderBridge::AddTrajectory() 函数会把 SensorBridge 的实例与 CollatedTrajectoryBuilder 对象绑定在一起。3):src/cartographer_ros/cartographer_ros/cartographer_ros/node.cc 的 Node::LaunchSubscribers() 函数会订阅话题然后注册回调函数所有的回调函数都会执行一句类似 trajectory_builder_-AddSensorData() 的代码。4): 实际上 trajectory_builder_-AddSensorData() 就是调用的就是 CollatedTrajectoryBuilder::AddSensorData() 函数。CollatedTrajectoryBuilder::AddSensorData()又会调用 CollatedTrajectoryBuilder::AddData() 函数。5):CollatedTrajectoryBuilder::AddData() 实际上会调用到CollatedTrajectoryBuilder初始化时传入的 sensor::Collator sensor_collator_ 变量的 sensor_collator_-AddTrajectory() 函数。最终把数据传送给了 GlobalTrajectoryBuilder绕了一大堆总的来说初始注册的回调函数整理数据之后最终都会调用到 sensor::Collator::AddTrajectory()把数据传送给了 GlobalTrajectoryBuilder

相关文章:

传感器数据分发CollatedTrajectoryBuilder

一、前言首先对前面的知识做一个回顾,从 node_main.cc 文件中开始;//根据配置文件,命令行参数与话题重映射,订阅默认话题开始一条轨迹 node.StartTrajectoryWithDefaultTopics(trajectory_options);---------------------- 在node.cc里面 // …...

玩转 OpenClaw:带你吃透 OpenAI API 密钥与 Codex 订阅两种玩法

作为 AI 界的领头羊,OpenAI 的 GPT 系列(哪怕是未来的 gpt-5.4)一直都是大伙儿做智能应用的首选。OpenClaw 这个 AI 代理系统做得挺地道,它不仅能让你用传统的 API Key 接入,还搞了个独门绝技:支持直接通过…...

从原理图到DTS:详解RK平台USB-PHY的配置与调试

1. 从原理图到DTS:RK平台USB-PHY配置全流程 刚拿到一块RK3399开发板时,我发现USB接口死活识别不了U盘。作为嵌入式老鸟,我第一反应就是检查DTS配置。USB问题排查就像破案,得从硬件原理图这个"案发现场"开始,…...

Qwen3-VL:30B企业级部署:Clawdbot配置多租户隔离、模型访问权限分级、审计日志留存

Qwen3-VL:30B企业级部署:Clawdbot配置多租户隔离、模型访问权限分级、审计日志留存 本文将深入讲解如何在企业环境中部署Qwen3-VL:30B多模态大模型,并通过Clawdbot实现专业级的企业管理功能,包括多租户隔离、细粒度权限控制和完整的审计日志系…...

丹青识画部署案例:海外孔子学院中文教学AI工具箱中的文化理解模块

丹青识画部署案例:海外孔子学院中文教学AI工具箱中的文化理解模块 1. 项目背景与价值 在全球中文教育快速发展的今天,海外孔子学院面临着如何将传统文化与现代技术相结合的教学挑战。丹青识画系统作为AI工具箱中的文化理解模块,为中文教学提…...

嵌入式通信协议设计原则与实现技巧

PC机与嵌入式设备通信协议设计原则与实践1. 通信协议设计基础1.1 嵌入式通信特点嵌入式设备通常具有有限的内存和运算能力,这使得通信协议设计必须考虑资源约束。固定二进制协议因其高效性成为嵌入式通信的首选方案。1.2 协议基本结构典型通信协议应包含以下基本域&…...

hadoop+spark+hive链家租房租房推荐系统 租房可视化 K-means聚类算法 线性回归预测算法 机器学习

1、项目 介绍 该项目是一款面向毕业设计的租房数据分析 可视化系统,基于Python生态构建,整合爬虫、Web开发、机器学习与数据可视化技术,以链家租房网为数据源,打造了从数据获取到分析预测的全流程解决方案。系统核心流程始于数据采…...

Anything V5效果展示:一键生成高质量二次元角色肖像图

Anything V5效果展示:一键生成高质量二次元角色肖像图 如果你对二次元文化感兴趣,或者想快速创作属于自己的动漫风格角色,那么今天要介绍的Anything V5绝对会让你眼前一亮。这是一个基于Stable Diffusion技术的高质量二次元图像生成模型&…...

Ubuntu20常用操作(包含nginx,docker,tcpdump)

ubuntu配置下载源: https://comate.baidu.com/zh/page/gcw9tf7u8qi https://cloud.tencent.com/developer/article/2602348 ubuntu配置网卡: https://blog.csdn.net/weixin_44569100/article/details/146369847 ubuntu下载指南: https:…...

2025年全国地铁线路与站点矢量数据(高德地图源)|线路+站点分离|SHP格式|覆盖所有开通城市

🔍 数据简介 本数据集基于高德地图2025年1月最新公开数据提取,完整覆盖中国大陆所有已开通城市轨道交通的城市包含: 地铁/轻轨/市域铁路/有轨电车等所有轨道交通车型运营中、试运行线路 数据严格按线路(Line) 与 站点&…...

多显示器DPI精准调节:效率倍增的显示一致性解决方案

多显示器DPI精准调节:效率倍增的显示一致性解决方案 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 在当今多屏办公环境中,你是否曾经历过这样的尴尬:主显示器文字清晰锐利,副显示器却模糊…...

【开源】专业的 Seedance 2.0 分镜提示词生成专家

前几天发布的seedance 2.0 提示语分镜工具,帮佬做剧本搞分镜,不少人喜欢,有佬要求能不能开源,好的!那么就开源: 这是一个专业的 Seedance 2.0 分镜提示词生成专家,帮助用户将想法转化为专业的 A…...

6502继电电路的故障模拟与定位仿真设计

本设计将包含: 底层继电器/逻辑门模拟:模拟继电器的“吸合”与“释放”(高阻/导通)。 6502核心功能单元:ALU(算术逻辑单元)、寄存器、指令译码器、总线。 故障注入系统:模拟“继电器触点粘连”、“线圈断路”、“短路”等常见硬件故障。 故障定位算法:基于“半分割法”…...

Java DDD分层架构实战:从理论到代码落地

1. DDD分层架构的本质与价值 第一次接触DDD分层架构时,我盯着那个四层结构图看了整整半小时。当时刚做完一个电商促销系统,Service层堆了2000多行代码,各种if-else嵌套看得人头皮发麻。直到把业务逻辑按照DDD分层重新梳理后,才真正…...

Chandra+GitHub自动化代码审查系统搭建指南

ChandraGitHub自动化代码审查系统搭建指南 1. 引言 你是不是经常遇到这样的困扰:代码提交后才发现有低级错误,或者团队成员之间的代码风格不统一,导致合并时冲突不断?传统的代码审查往往依赖人工,效率低下且容易遗漏…...

CVPR2023图像处理前沿技术精选:63篇论文亮点解析

1. CVPR2023图像处理技术全景概览 CVPR作为计算机视觉领域的顶级会议,每年都会涌现大量突破性研究成果。2023年的会议论文在图像处理领域呈现出几个明显趋势:自监督学习从理论走向成熟应用、跨模态生成技术实现质的飞跃、低光照增强进入实用化阶段。不同…...

OpenCode:终端环境下的AI编程助手全面解决方案

OpenCode:终端环境下的AI编程助手全面解决方案 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在当今快速迭代的开发环境中&…...

k8s工作负载-DaemonSet案例

一、基于DaemonSet控制器实现各节点的Fluent日志采集 fluentd-ds.yaml配置文件 apiVersion: apps/v1 kind: DaemonSet metadata:name: fluentd spec:selector: #DaemonSet类型的资源,必须要加这个属性,否则不让创建matchLabels:app: loggingtempla…...

Burp Suite实战:文件上传漏洞双写绕过技巧详解(附完整Payload)

Burp Suite实战:文件上传漏洞双写绕过技巧详解(附完整Payload) 在Web安全测试中,文件上传功能往往是攻击者最青睐的攻击入口之一。许多开发者会通过黑名单过滤、后缀名检查等方式来防御恶意文件上传,但这些防护措施往往…...

XcodeGen:3步告别Xcode项目配置噩梦的终极解决方案

XcodeGen:3步告别Xcode项目配置噩梦的终极解决方案 【免费下载链接】XcodeGen A Swift command line tool for generating your Xcode project 项目地址: https://gitcode.com/GitHub_Trending/xc/XcodeGen 还在为团队协作中的Xcode项目合并冲突而烦恼吗&…...

拯救小白!用Auto-py-to-exe零代码打包PySide6应用的保姆级教程

零基础玩转PySide6:用Auto-py-to-exe打包图形界面应用全攻略 刚学会用PySide6开发桌面应用的新手们,是否遇到过这样的尴尬——精心编写的程序只能在装了Python的电脑上运行?别担心,今天我要分享的Auto-py-to-exe工具,…...

ollama升级踩坑记:从llama3.1运行失败到手工升级0.3.0全记录

1. 当llama3.1遇上ollama0.2.5:一场版本冲突引发的血案 那天下午我正喝着咖啡刷技术论坛,突然看到llama3.1版本发布的消息。论坛里有人说这个版本在某些任务上表现比GPT-4还要好,作为一个长期关注大模型的技术宅,我立刻坐不住了。…...

【23新算法】基于G-SABO黄金正弦和混沌映射思想的改进减法优化器算法Matlab程序(带参考文献)

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

SEER‘S EYE模型原理入门:图解卷积神经网络与注意力机制

SEERS EYE模型原理入门:图解卷积神经网络与注意力机制 你是不是经常听到“卷积神经网络”、“注意力机制”、“Transformer”这些词,感觉它们很厉害,但又有点云里雾里?特别是当看到像SEERS EYE这类先进的视觉模型时,更…...

像素幻梦应用场景:AR滤镜开发者用AI生成像素风贴纸与动态遮罩

像素幻梦应用场景:AR滤镜开发者用AI生成像素风贴纸与动态遮罩 1. 像素幻梦创意工坊简介 Pixel Dream Workshop(像素幻梦创意工坊)是一款专为数字艺术创作者设计的AI像素艺术生成工具。基于FLUX.1-dev扩散模型构建,这款工具将传统…...

论文合规双检新标杆:paperzz 查重系统,一站式破解本科毕业双重检测焦虑

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 论文查重https://www.paperzz.cc/check 一、毕业季的检测困局:为何查重 AIGC 双检成了本科生的 “通关门槛”? 每到毕业论文定稿阶段,本科生群体都会陷入一场…...

3步掌握神经网络可视化:PlotNeuralNet专业绘图实战指南

3步掌握神经网络可视化:PlotNeuralNet专业绘图实战指南 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 神经网络架构图是论文、技术报告和教学材料中不可或缺的…...

11.2版本:使用Flow3D进行高能量密度下选区激光熔化(SLM)数值模拟与计算流体动力学(...

11.2版本 使用流体力学软件flow3d 增材制造 additive manufacturing 选区激光熔化 SLM 数值模拟 计算流体动力学CFD Flow3d keyhole-induced pore 匙孔孔隙 可模拟单层单道、多道多层 该模型能够模拟高能量密度下产生的匙孔孔隙,与有些不能模拟高能量密度的模型完全…...

基于 Carsim 与 Matlab/Simulink 实现汽车主动避撞和跟车功能联合仿真

基于模型预测控制(自带的mpc模块)和最优控制理论的Carsim与Matlab/simulink联合仿真实现汽车主动避撞和跟车功能(acc自适应巡航),包含simulink模型(其中有车辆逆纵向动力学模型、逆发动机模型、切换控制逻辑…...

老铁们今天带大家盘一个硬核项目——基于西门子S7-1200 PLC的智能停车场系统。这玩意儿不仅会认车牌,还能自动计费生成报表,咱们先从它的核心骚操作说起

案例程序21 基于plc的车牌识别系统,智能停车场,带车牌识别,显示车牌号,只有登记车牌号方可入内,同时带有计费功能,在车辆出去时能够显示停车时长以及收费金额;报表功能,能够显示车辆…...