
笔记
文章平均质量分 59
強云
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多激光雷达定位
ICP是点云配准中的经典算法,通过最小化两个点云之间的欧式距离来实现对齐。算法流程从两个点云中选取最近邻点对。使用最小二乘法计算变换矩阵(旋转矩阵和位移矩阵)。根据变换矩阵更新点云位置,重复迭代,直至收敛。优点精度较高,适用于小范围点云的对齐。算法实现简单。缺点对初始对齐依赖较强。计算量大,不适合大规模数据。多激光雷达系统架构雷达布置:在车辆或机器人四周布置若干激光雷达,覆盖360度视角。每个激光雷达分配不同的扫描区域,以减少数据重叠和干扰。同步与时序管理。原创 2024-10-28 11:03:24 · 780 阅读 · 0 评论 -
C++ 原子操作为什么使用 .load() 和 .store()
使用 load() 和 store() 而不是 = 的原因主要在于它们能清楚地表达出原子操作的意图,使代码在多线程环境下更安全、更可读,并提供了跨平台一致性和更丰富的内存序选项。如果代码涉及到多线程,并希望确保线程安全性,那么尽量使用 .load() 和 .store(),即使 = 操作符在很多情况下也能工作。原创 2024-08-28 11:30:57 · 1052 阅读 · 0 评论 -
工业软件架构4:(QT和C++实现)
定义任务类,任务在执行前需要先检查依赖管理器,以决定是否可以开始执行。public:// 模拟任务A的耗时操作private:public:// 等待任务A完成// 模拟任务B的耗时操作private:public:// 等待任务A完成// 等待任务B完成// 模拟任务C的耗时操作private:通过引入 TaskDependencyManager 来管理任务之间的依赖关系和状态,可以确保任务按照预期的顺序执行,并防止在不适当的情况下启动某些任务。原创 2024-08-28 09:48:24 · 599 阅读 · 0 评论 -
工业软件架构1:(QT和C++实现)
这个架构充分考虑了实时性、模块化、和可扩展性,适应了复杂硬件环境下的多功能需求。模块化设计:各个功能通过模块化设计进行管理,减少耦合度,增加系统的灵活性。事件驱动:事件总线在各模块间传递事件,实现模块间的松耦合和实时通信。实时响应:传感器数据、硬件状态和按键操作均通过事件总线实时更新,确保系统的及时响应。界面管理:使用 QStackedWidget 管理多个页面,并通过事件总线实现页面的动态切换和更新。参数管理:文件系统与应用程序参数保持同步,确保参数的一致性和持久性。原创 2024-08-26 16:32:52 · 1801 阅读 · 0 评论 -
使用 QThread 而不是 std::thread
对于绝大多数基于 Qt 的应用程序开发,特别是涉及到 UI 和信号槽机制的场景,QThread 提供了更好的集成、简化的线程管理以及丰富的功能支持。因此,使用 QThread 通常是更好的选择。原创 2024-08-26 15:40:29 · 755 阅读 · 0 评论 -
事件驱动架构
事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,它通过事件来驱动系统的运行。事件是一种状态变化的通知,例如用户的操作、传感器的数据变化或系统内部的消息。事件驱动架构的核心思想是,当某个事件发生时,系统能够自动触发相应的处理程序(事件处理器)来响应该事件。在工业自动化中,事件驱动架构特别适合处理实时数据、传感器输入、设备控制等场景,能够实现对外部事件的快速响应。原创 2024-08-26 15:35:29 · 474 阅读 · 0 评论 -
Qt动态调用 - QMetaObject::invokeMethod
动态调用是 Qt 的元对象系统的一项强大功能,它允许在运行时通过名称调用槽函数、信号和普通成员函数。这种能力对于构建灵活和可扩展的应用程序非常有用,比如插件系统或脚本接口。原创 2024-08-08 15:05:29 · 1308 阅读 · 0 评论 -
QString
概述QString是Qt框架中的一个类,提供了处理和操作字符串的便捷接口。它是任何处理文本的应用程序中必不可少的类,提供了广泛的功能来高效地管理Unicode字符串。原创 2024-07-10 10:56:37 · 404 阅读 · 0 评论 -
Qt连接所有同类部件到同一个槽函数
【代码】Qt连接所有同类部件到同一个槽函数。原创 2024-03-08 15:27:11 · 772 阅读 · 0 评论 -
C++ : std::is_same和std::is_same_v
std::is_same和std::is_same_v是C++标准库中的类型特性,用于在编译时检查两个类型是否相同。它们都属于<type_traits>头文件。这两个工具非常有用,特别是在模板编程和编译时类型检查中,它们可以帮助实现基于类型的条件编译和编译时决策。原创 2024-03-08 14:36:08 · 5339 阅读 · 0 评论 -
c++ 17 std::optional
是C++17引入的一个模板类,旨在表示一个值可能存在或可能不存在,而不是使用特定的标记值或指针(例如nullptr)来表示值的缺失。以下是。原创 2023-09-18 14:34:23 · 292 阅读 · 0 评论 -
c++ 17 std::optional
是C++17引入的一个模板类,旨在表示一个值可能存在或可能不存在,而不是使用特定的标记值或指针(例如nullptr)来表示值的缺失。以下是。原创 2023-08-25 15:51:47 · 292 阅读 · 0 评论 -
c++ inline
关键字在C++中提供了一种优化机会,但应该谨慎使用,避免过度使用。关键字有几个主要用途和含义。原创 2023-08-24 11:09:50 · 196 阅读 · 0 评论 -
异常分布设计
异常处理是软件设计中的一个重要方面,正确的策略可以使代码更具可读性、可维护性和健壮性。这种策略的好处是结合了集中和分散两种策略的优点,使得代码既具有模块化的优点,又能保持一致性和可维护性。原创 2023-08-24 11:04:26 · 140 阅读 · 0 评论 -
什么时候写入日志
总的来说,日志的目标是为开发者、运维人员或其他关心应用行为的人提供足够的上下文信息,以便他们可以理解应用的行为、诊断问题或进行审计。不过,也要注意不要记录过多的日志,以避免对性能的影响,也要避免记录敏感信息,以保护用户隐私和应用安全。记录日志的决策通常取决于日志的目的和你希望从日志中获得的信息。原创 2023-08-24 10:51:56 · 154 阅读 · 0 评论 -
C++命名规范
这只是一个基本的命名规范。在实际开发中,根据项目和团队的具体情况,可能需要调整或扩展这些规则。最重要的是,团队中的每个成员都应遵循同一套规则,并确保代码在整个项目中保持一致性。原创 2023-08-23 17:19:59 · 806 阅读 · 1 评论 -
C++注释风格
每个文件都应该开始于一个注释块,描述文件的目的、作者、创建日期和版权信息。原创 2023-08-23 17:18:37 · 290 阅读 · 0 评论 -
c++ 异常规范
在C++中,可以在函数声明后指明可能会抛出的异常类型。但是,异常规范的使用是有争议的,而且在某些情况下可能会引发不预期的问题。:当函数实现变更时,异常规范可能需要重新评估和更新,这可能会导致维护问题。:异常规范限制了函数可能抛出的异常类型。如果函数抛出了异常规范外的异常,:在某些编译器和平台上,异常规范可能导致额外的运行时开销。对性能的影响更为正面,并且在现代C++编码中更为推荐。这可能导致程序意外地终止。规范,它表示函数不会抛出异常。:从C++11开始,引入了。原创 2023-08-23 17:14:50 · 235 阅读 · 0 评论 -
c++ hpp文件
但是,有些社区和项目有明确的约定。如果你正在创建一个库或框架供其他开发者使用,可能还需要考虑目标受众的期望和习惯。例如,如果目标用户主要是C开发者,那么使用。,最重要的是保持项目中的一致性。当决定为新项目选择哪种格式时,最好考虑项目团队的偏好、已有的代码库、所使用的工具链等因素。扩展名明确表示该文件是C++头文件,而不是C头文件。这可以减少混淆,尤其是在同时涉及C和C++的项目中。最终,选择哪种扩展名并不是一个硬性的规定,关键是确保你的代码清晰、一致和易于维护。不过,在实践中,无论使用。原创 2023-08-22 14:40:37 · 646 阅读 · 0 评论 -
c++函数参数太多,如何指定参数
当一个函数有很多参数,特别是当某些参数有默认值时,调用该函数并为特定参数提供值可能会变得混乱和易错。从上述选项中选择最适合你应用程序的方法。如果参数是固定且经常一起使用的,第一种方法可能是最佳选择。如果参数经常变化或有许多可选的参数,第二或第三种方法可能更合适。请注意,这只是一个想法,实际上C++20之前的标准并不支持此语法。将相关参数组合到一个结构体或类中,并传递该结构体或类的实例。,但这通常适用于动态参数列表,可能会稍微牺牲一些性能。这通常在类的构造函数或某些配置函数中使用。原创 2023-08-22 14:37:17 · 1895 阅读 · 0 评论 -
c++命名空间
使用namespace。原创 2023-08-22 14:36:43 · 221 阅读 · 0 评论 -
c++命名空间
使用namespace。原创 2023-08-22 14:34:20 · 194 阅读 · 0 评论 -
const 和 constexpr
使用const和constexpr可以增强代码的可读性和安全性。const确保值或对象不被修改,而constexpr则确保值或函数在编译时被评估,这在某些情况下可以提供性能优势。原创 2023-08-22 14:31:16 · 130 阅读 · 0 评论 -
c++使用回调函数
如果你的类有多个实例,必须确保只有一个实例修改和使用这个静态指针。否则,你可能会遇到意料之外的行为。确保在不需要它的时候适当地管理这个静态指针,例如,避免在对象被销毁后访问它。:应用是多线程的,这种策略可能不是线程安全的。当在C++中使用回调时,非静态成员函数与静态成员函数(或全局函数)之间有明显的差异,这些差异决定了各自的优劣。但如果项目中需要更多的灵活性,或预见到未来可能需要对回调进行更复杂的管理和配置,那么。总的来说,不同的策略有其各自的优点和缺点,选择哪一种取决于具体的应用场景和优先级。原创 2023-08-22 14:24:26 · 420 阅读 · 0 评论 -
std::function与 std::bind
是一个模板类,可以存储任意类型的可调用对象(如函数、lambda表达式、函数对象、成员函数指针等)。其最大的优势是提供了一种通用、多态的方式来存储、复制和调用这些可调用对象。它通常与std::bind或 lambda 一起使用来存储已绑定参数的函数调用。原创 2023-08-22 14:23:40 · 129 阅读 · 0 评论 -
TDI(Time Delay Integration)
TDI(Time Delay Integration)是一种特殊的图像采集技术,常用于线阵CCD(Charge-Coupled Device)相机。TDI技术可以在保持高分辨率的同时增强图像的信噪比(Signal-to-Noise Ratio, SNR),从而在低光条件下获取更清晰、更明亮的图像。这种技术主要应用于需要高速、高灵敏度和高分辨率的场合,例如卫星遥感、工业检测和科学研究等。原创 2023-08-18 09:50:38 · 6961 阅读 · 0 评论 -
Camera Link 接口
Camera Link是一个标准的接口协议,用于高速的图像数据传输,常被用在工业相机和图像处理系统之间。需要注意的是,尽管Camera Link接口具有许多优势,但其较高的成本和有时需要专业知识的安装和配置,使得它可能不适用于所有的应用场景。随着新的接口标准,如USB3 Vision和GigE Vision的出现,一些应用已经开始向这些更灵活和经济的解决方案转移。它可以支持从20兆字节/秒(MBps)到850兆字节/秒(MBps)的数据传输速率,这使得它适用于高分辨率和高帧率的图像采集应用。原创 2023-08-18 09:47:41 · 4092 阅读 · 0 评论 -
组合模式(Composite Pattern)
组合模式使得客户端可以以统一的方式处理单个对象和组合对象。组合模式的主要思想是将对象组织成树状结构,使得单个对象和组合对象具有一致的接口。这样一来,客户端可以透明地操作单个对象或组合对象,无需关心具体是处理的是单个对象还是组合对象。)定义了组合对象和叶节点对象的公共接口。组合节点对象是部门对象,它可以包含多个子节点(即员工对象),并实现了组件接口。组合模式可以使得对象的组织结构更加灵活,支持递归组合,以及统一处理整体和部分。通过组合模式,我们可以透明地处理部门和员工,客户端可以以统一的方式调用它们的接口。原创 2023-07-11 10:58:14 · 341 阅读 · 0 评论 -
桥接模式(Bridge Pattern)
桥接模式可以提高系统的灵活性和可扩展性,使得抽象部分和实现部分能够独立演化。它适用于需要多个维度变化的场景,例如图形和颜色之间的关系,可以灵活地添加新的图形或颜色而不需要修改现有代码。通过桥接模式,我们可以独立地扩展图形类和颜色类,它们可以独立变化而不相互影响。在示例中,我们创建了一个红色的圆和一个蓝色的正方形,并调用它们的绘制方法,分别输出对应的颜色和图形信息。通过桥接模式,抽象部分和实现部分可以独立地扩展,而不会相互影响。图形类包含对实现部分的引用(颜色),并定义了绘制图形的方法。)和它的具体实现类(原创 2023-07-11 10:49:08 · 393 阅读 · 0 评论 -
单例模式(Singleton Pattern)
单例模式(Singleton Pattern)是一种创建型设计模式,用于确保一个类只有一个实例,并提供全局访问点来获取该实例。单例模式可用于需要全局访问一个共享资源或提供统一的服务实例的场景。它确保只有一个实例存在,并提供了一种简单的方式来获取该实例。类的构造函数、拷贝构造函数和赋值运算符都被设为私有,以防止外部代码直接创建多个实例或复制实例。方法中,首先检查是否已经创建了实例,如果尚未创建,则创建一个新的实例并将其赋值给静态成员变量。获取单例对象,并使用该对象调用。方法来展示单例对象的功能。原创 2023-07-11 10:24:45 · 856 阅读 · 0 评论 -
原型模式(Prototype Pattern)
原型模式(Prototype Pattern)是一种创建型设计模式,它用于通过复制现有对象来创建新对象,而无需依赖显式的构造函数。在原型模式中,我们创建一个原型对象,并通过复制该原型对象来创建新的对象。这样做的好处是,我们可以避免创建对象时的复杂实例化过程,而是通过复制现有对象的状态来创建新对象。原型模式可以非常有效地创建对象,尤其是当对象的创建过程较为昂贵或复杂时。在原型模式中,原型对象通常实现一个克隆方法(clone()),该方法用于复制对象并返回一个新的副本。原创 2023-07-11 10:14:01 · 674 阅读 · 0 评论 -
工厂模式和抽象工厂模式的异同
作用范围:工厂模式关注的是创建单个对象,它通过一个具体工厂类来创建一个具体产品类的实例。抽象工厂模式关注的是创建一系列相关的产品对象,它通过一个抽象工厂类来创建一组具有相同主题的产品对象。它们有一些相似之处,但也有一些重要的区别。可扩展性:工厂模式在需要添加新的具体产品时,只需扩展具体工厂类和具体产品类。抽象工厂模式在需要添加新的产品族时,需要扩展抽象工厂类和所有相关的具体工厂类和具体产品类。封装变化:两者都通过封装对象的创建过程,使得客户端代码与具体对象的创建细节分离,从而提高代码的可维护性和扩展性。原创 2023-07-10 14:08:37 · 1411 阅读 · 0 评论 -
工厂模式(Factory Method)
工厂方法模式的核心思想是通过将对象的创建委托给具体的工厂类,使得客户端代码不直接与具体产品类进行耦合,而是通过工厂类来创建产品。在主函数中,我们使用具体的工厂来创建具体的产品对象。抽象工厂(Abstract Factory):定义了创建产品的接口,包含一个工厂方法,用于创建产品对象。具体产品(Concrete Product):实现了抽象产品定义的接口,具体产品是工厂方法所创建的对象。具体工厂(Concrete Factory):实现了抽象工厂定义的接口,具体工厂负责创建具体产品的对象。原创 2023-07-10 14:07:58 · 469 阅读 · 0 评论 -
键造者模式(Builder)
建造者模式的核心思想是通过将复杂对象的构建过程委派给具体的建造者,以便于创建不同的表示。建造者模式将对象的构建过程和表示分离,使得同样的构建过程可以创建不同的表示。通过建造者模式,我们将复杂对象的构建过程和表示分离开来,使得同样的构建过程可以创建不同的表示。每个具体建造者类都可以定义自己的构建过程和步骤,以及构建的具体细节。在主函数中,我们首先使用奔驰汽车建造者创建了一个奔驰汽车对象,然后使用宝马汽车建造者创建了一个宝马汽车对象。指导者根据具体的构建步骤和顺序,通过调用建造者的方法来构建产品。原创 2023-07-10 13:55:51 · 104 阅读 · 0 评论 -
抽象工厂(Abstarct Factory)
抽象工厂类(AbstractFactory)定义了创建产品的接口,具体工厂类(ConcreteFactory1 和 ConcreteFactory2)实现了抽象工厂接口,并根据需要创建具体的产品对象。每个具体工厂实现了抽象工厂定义的方法,根据需要创建具体的产品对象。通过抽象工厂模式,我们可以在客户端代码中使用抽象工厂和抽象产品,而不需要直接与具体工厂和具体产品进行交互,从而实现了解耦和灵活的对象创建。具体产品(Concrete Product):实现了抽象产品定义的接口,具体产品是抽象产品的实际实现。原创 2023-07-10 13:53:41 · 663 阅读 · 0 评论 -
三层架构与MVC架构的区别与结合
三层架构(Three-Tier Architecture)和MVC(Model-View-Controller)架构是两种不同的软件架构模式,它们有一些区别,但也可以结合在一起使用。下面是它们的区别和结合方式:通过结合三层架构和MVC架构,可以实现更灵活、可维护和可扩展的应用程序架构。三层架构提供了数据层和业务逻辑层的分离,使得数据访问和处理更加独立。而MVC架构提供了用户界面和用户交互的分离,使得视图和控制器可以灵活地处理用户输入和展示数据。原创 2023-07-10 13:51:56 · 498 阅读 · 0 评论 -
三层架构(Three-Tier Architecture)
三层架构(Three-Tier Architecture)是一种常见的软件架构模式,将应用程序划分为三个主要的层级,以实现代码的组织、可维护性和可扩展性。这三个层级分别是表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。下面详述三层架构中各个层级的职责和交互:通过三层架构的划分,应用程序的不同职责得到了明确的划分,使得每个层级都可以独立开发、测试和维护。原创 2023-07-10 13:51:00 · 1549 阅读 · 0 评论 -
界面架构 - MVC (Qt)
MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序的不同方面分离开来,以提高代码的可维护性、可扩展性和可重用性。MVC将应用程序划分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),每个组件负责不同的职责。下面详述MVC架构中各个组件的职责和交互:通过MVC的分离,模型、视图和控制器之间的依赖关系降低,使得每个组件都可以独立进行修改和测试,而不会对其他组件造成太大的影响。原创 2023-07-10 13:49:27 · 625 阅读 · 0 评论 -
工业自动化
反馈机制基于系统输出的实际值与期望值之间的差异,通过持续的比较和调整,使系统能够自动校正误差并保持稳定性和精确性。反馈机制通常包括以下关键组成部分:传感器(用于测量输出值)、比较器(将实际值与期望值进行比较)、控制器(根据比较结果生成控制信号)和执行器(根据控制信号进行操作)。Profibus是由国际电工委员会(IEC)标准化的一种通信协议和总线系统,用于工业自动化领域的设备之间的通信和数据交换。它提供了高性能、实时性和可靠性,并支持各种工业现场设备的连接,如传感器、执行器、PLC等。原创 2023-07-04 10:59:29 · 947 阅读 · 0 评论 -
pyTorch - 笔记
pyTorch 学习原创 2022-09-26 11:21:39 · 829 阅读 · 0 评论