自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (2)
  • 问答 (1)
  • 收藏
  • 关注

原创 程序崩溃原因分类以及对应的调试方法

程序逻辑有误,导致进入非法状态。子类别与示例类别示例现象断言失败程序中止,打印断言信息未捕获的异常回调中抛出异常,未被捕获。ROS2 节点崩溃,打印异常信息无限递归递归函数缺少基准情形。栈溢出未定义行为有符号整数溢出、类型双关等。结果不确定,可能崩溃调试方法1.利用断言在代码中使用assert或自定义断言宏来捕捉非法状态。");// ...2.捕获所有异常在main函数或关键线程的顶层捕获所有异常。return 0;工具/方法主要目标。

2025-11-04 11:48:33 891

原创 ROS2 程序调试

第一步 (快速定位):使用RCLCPP_* 日志,在关键路径打印信息,确认程序执行到哪一步,关键变量是什么。第二步 (系统检查):使用和rqt_graph检查通信链路是否正常。第三步 (深入代码):如果问题在节点内部(崩溃、死循环、逻辑错误),使用设置断点进行单步调试。第四步 (复杂问题):对于多线程、性能、偶发问题,结合GDB 线程命令分析核心转储和专项工具(如 TSan)。

2025-11-04 10:48:18 931

原创 ROS2 核心通信方式及其典型的应用场景

通信方式模型数据流向同步/异步典型应用场景Topics发布/订阅单向异步传感器数据流、连续状态广播Services请求/响应双向同步触发一次性操作、查询信息(需要立即响应)Actions目标-反馈-结果双向异步执行长时间任务(如导航、抓取),需要进度反馈和取消能力Parameters客户端-服务器双向同步/异步(可监听)动态配置节点参数、切换模式如何选择?数据是否持续产生,且一个生产多个消费?->Topics是否需要调用一个远程函数并立即得到结果?->Services。

2025-11-04 10:15:09 776

原创 ROS1 与 ROS2 的主要区别

ROS1: 是开创者,为机器人研发带来了巨大的便利,但其设计根植于实验室环境,存在一些先天不足。ROS2: 是继承者和革新者,旨在解决ROS1的固有缺陷,以满足现代、商业化、高要求的机器人应用。更高的可靠性、健壮性和可扩展性消除了单点故障的ROS Master,分布式架构使得系统更加稳定,适合构建大型、复杂的机器人系统。完善的实时性能通过DDS的QoS策略,可以实现对通信过程的精细控制,满足工业控制和自动驾驶等领域对确定性和实时性的高要求。

2025-11-04 09:24:31 996

原创 PREEMPT_RT是怎么回事

PREEMPT_RT(全称:PREEMPTive Real-Time)是一个针对 Linux 内核的补丁集。它的核心目标是将标准的、以吞吐量和公平性为优先的 Linux 内核,改造为一个完全可抢占的、确定性高的、适用于硬实时场景的操作系统。它并非一个独立的分支,而是一系列旨在减少内核态延迟的补丁集合。许多这些补丁已经逐步被主线内核接纳,但完整的 PREEMPT_RT 补丁集仍然是获得最佳实时性的关键。PREEMPT_RT 通过一系列深刻的内核改造,系统地解决了标准 Linux 内核中的非确定性问题。

2025-10-30 14:27:56 759

原创 内核级别考虑线程的实时性

调度器:采用基于优先级的、可抢占的实时调度算法(如RM, EDF)。内核本身:必须是完全可抢占的。中断系统:中断必须被线程化,并且其实时优先级可控。同步机制:必须实现优先级继承等协议,防止优先级反转。内存管理:提供内存锁定功能,消除换页带来的不确定性。时间系统:提供高精度定时器。资源分区:通过CPU亲和性和隔离,为实时任务提供专属资源。现实世界的例子:这是一个将标准Linux内核改造成硬实时内核的著名项目。它实现了几乎所有上述技术:完全可抢占内核、线程化中断、优先级继承等。

2025-10-30 14:07:37 907

原创 多线程同步机制

方法核心思想适用场景优点缺点互斥锁独占访问,一次一个线程通用的临界区保护简单、直观可能引起死锁、性能开销读写锁读共享,写独占读多写少的场景提高读并发性能实现复杂,可能写线程饿死条件变量等待/通知机制线程间协作,生产者-消费者高效等待,避免忙等必须与互斥锁配合,使用复杂信号量控制访问资源的线程数量流量控制,资源池功能灵活容易用错,不如锁直观原子操作硬件级不可中断操作简单的计数器、状态标志性能极高,无锁只能用于简单操作,无法保护复杂逻辑屏障线程集合点并行分阶段计算。

2025-10-30 13:53:36 492

原创 CanFestival主站-多电机控制

取消交互式的调试指令(wsdo、rsdo、vset),将这些功能改为库函数调用,并采用顺序执行的方式实现对Kinco FD伺服电机(节点ID范围1-127)的RPDO1、RPDO2和TPDO1映射配置,以及通过PDO控制电机(速度模式或位置模式)。以下解决方案修改CANOpenShell.c,移除交互式命令处理,改为顺序执行的库函数调用,包含初始化、SDO配置(RPDO1、RPDO2、TPDO1)、PDO控制(速度/位置模式)。代码以ID=11为例,支持动态节点ID,保留错误检查和调试输出。

2025-10-10 14:22:53 960

原创 CanFestival主站-SDO配置PDO映射

配置RPDO1映射,确保包含0x6040、0x6060和0x60FF。此时一共是7个字节,符合规范要求。对象0x1400sub1,4字节,COB-ID=0x207+禁用位(0x80000000)。对象0x1600sub0,1字节,设为0(清空映射)。对象0x1600sub0,1字节,设为3(三个映射项)。对象0x1400 sub1,4字节,COB-ID=0x207。

2025-10-10 12:14:25 311

原创 CanFestival 主站-NMT初始化

CanFestival 是开源的 CANopen 协议栈,主站(NMT Master)负责网络管理和从站状态控制。NMT(Network Management)初始化流程主要涉及主站自身的启动、从站 Boot-up 检测以及网络配置。整个过程遵循 CANopen 标准(CiA 301),主站通过 NMT 命令(COB-ID 0x000)控制从站状态切换。提供一段基于CanFestival 中 CANOpenShell.c 修改的一段代码和头文件CANOpenShell.h。

2025-10-10 11:01:40 330

原创 CanFestival 主站安装

Ubuntu 22.04上安装,需要按照以下步骤操作。CanFestival 是一个用于实现 CANopen 协议栈的开源库,安装过程需要下载源代码、安装依赖项、配置并编译。

2025-10-09 17:03:02 390

原创 CanFestival 主站控制-伺服电机完整流程

CanFestival实现CANopen主站控制伺服电机的完整流程需要从硬件准备、软件配置到实际控制的多个步骤。以下是详细的流程说明,涵盖从环境搭建到电机控制的全过程,适用Linux系统。

2025-10-09 16:38:05 729

原创 CanFestival简介与原理

CANopen 是一种基于控制器局域网(Controller Area Network, CAN)的开放式通信协议,广泛应用于工业自动化、汽车电子、机器人和嵌入式系统等领域。它通过标准化的通信机制实现设备间的互操作性和高效数据交换。在CANopen网络中,主站(Master)负责协调和管理从站(Slave)节点,执行网络初始化、状态管理、数据通信等任务。CanFestival 作为一个开源的CANopen协议栈实现,为开发者提供了灵活且高效的工具来构建主站和从站功能。本文将详细介绍 CanFestival

2025-10-09 11:24:57 740

原创 ROS2--新建工作空间与功能包

本教程详细介绍了在ROS2中创建PathTracking工作空间和pure_pursuit功能包的完整流程。主要内容包括:创建工作空间目录结构;创建支持C++和Python开发的功能包并添加必要依赖项(如rclcpp、nav_msgs等);

2025-07-09 19:46:44 858

原创 EtherCAT主站教程6--CONFIG_HZ修改

本文介绍了在PREEMPT_RT实时内核中如何将CONFIG_HZ从250提升到1000以优化系统性能。通过修改defconfig和tegra_prod_defconfig配置文件,并运行generic_rt_build.sh脚本实现配置变更。

2025-07-02 11:13:52 170

原创 EtherCAT主站教程5--解决RT内核无法编译安装IGH

错误提示表明 configure 脚本在尝试查找 Linux 内核源码时无法在 /lib/modules/5.15.148-rt-tegra/build 路径下找到所需的内核源码或配置文件。

2025-07-02 10:41:07 264

原创 EtherCAT主站教程3--适配伺服驱动器(模式配置)

目前通用的伺服驱动器的位置模式、速度模式以及其他模式是伺服系统中常见的控制模式,切换这些模式通常需要根据具体的伺服驱动器型号和控制协议(如EtherCAT、CANopen、Modbus等)进行配置。以下是这些模式的概述及切换方法的一般性指导:协议规范中,一共有以下几种模式:其中模式1、3、6对于比较常用,也更容易上手。

2025-07-02 09:44:56 479

原创 ROS2--自定义全局和局部规划器

介绍了在ROS2 Humble环境下为TurtleBot3机器人配置Nav2自定义规划器的方法。首先解析了Nav2框架中全局规划器(负责静态路径规划)和局部规划器(负责动态避障)的工作原理及插件机制。随后提供了完整的实现流程,包括创建ROS2功能包、编写基于直线路径的简单全局规划器和恒定速度的局部规划器示例代码、注册插件以及修改参数配置文件。

2025-06-05 21:05:21 2553 4

原创 ROS2--导航仿真

本文详细介绍了在ROS2 Humble环境下结合TurtleBot3和Nav2实现导航的完整流程。主要包括:环境准备(ROS2、TurtleBot3和Nav2安装配置)、Gazebo仿真环境搭建、使用SLAM构建地图(slam_toolbox应用与地图保存)、Nav2导航配置(初始位姿设置与目标导航)、以及可选的高级参数调整。教程采用TurtleBot3的waffle模型和CycloneDDS中间件,提供从仿真到导航的一站式解决方案,适用于Ubuntu22.04系统。

2025-06-05 20:20:03 2109

原创 EtherCAT主站教程4--PREEMPT_RT补丁

PREEMPT_RT 是 Linux 内核的一个补丁集,旨在增强 Linux 的实时性能。其主要作用是将 Linux 内核转变为一个更适合实时应用的系统,减少延迟并提高任务响应的可预测性。

2025-05-26 14:23:09 711 2

原创 EtherCAT主站教程2--适配伺服驱动器(通信配置)

本实验平台使用的是汇川SV660N系列伺服驱动器, EtherCAT主站搭建方法为IGH EtherCAT Master第三方协议栈。

2025-05-26 12:11:20 1062

原创 EtherCAT主站教程1--Linux上部署IGH

本教程详细介绍了在Ubuntu 22.04系统上部署IgHEtherCAT主站的步骤,适用于一般的开发或测试环境。通过本教程,可以成功在Ubuntu 22.04系统上部署IgH主站。

2025-05-23 17:29:27 3367 6

原创 4ws与Ackerman采用Pure Pursuit算法效果对比

该代码的主要功能是实现阿克曼(Ackermann)和四轮四转(Four-Wheel Steering)两种车辆模型的路径跟踪仿真,并对比它们的性能。

2025-03-25 15:22:01 461

原创 路径规划与轨迹跟踪系列算法学习_第10讲_纯跟踪法

纯跟踪法

2025-03-14 10:10:14 1277

原创 路径规划与轨迹跟踪系列算法学习_第8讲_B样条曲线法

B样条曲线(B-Spline Curve)是一种广泛应用于计算机图形学、CAD、动画和设计中的曲线方法。它通过控制点集合以及一个参数化的基函数来构建平滑曲线。B样条曲线与贝塞尔曲线类似,但提供了更好的局部控制和更强的灵活性。

2025-03-04 13:31:28 657

原创 路径规划与轨迹跟踪系列算法学习_第7讲_贝塞尔曲线法

贝塞尔曲线由法国工程师皮埃尔·贝塞尔(Pierre Bézier)于1960年代提出。贝塞尔曲线可以通过任意数量的控制点来定义,最常见的是二次贝塞尔曲线(三个控制点)和三次贝塞尔曲线(四个控制点)。

2025-03-04 11:26:54 343

原创 路径规划与轨迹跟踪系列算法学习_第5讲_曲线插值法

曲线插值法是数值分析中的一种方法,用于构造通过给定数据点的平滑曲线。它的基本目标是找到一个函数,使其在给定点处具有指定的值。常见的曲线插值方法包括等。

2025-03-04 11:20:28 158

原创 路径规划与轨迹跟踪系列算法学习_第4讲_A*算法

通过 f(n)=g(n)+h(n)指导搜索,提高路径规划效率。

2025-03-04 09:26:59 960

原创 路径规划与轨迹跟踪系列算法学习_第1讲_Dijkstra算法

Dijkstra 算法是一种用于计算的经典算法,通常应用于加权图(有向图或无向图),前提是。该算法由荷兰计算机科学家 Edsger W. Dijkstra 于 1956 年提出,并于 1959 年发表。

2025-03-03 16:08:13 407

原创 不同排序算法

优点稳定性好。时间复杂度稳定为 O(nlog⁡n)。缺点空间复杂度较高,需要额外数组存储中间结果。归并排序适合排序大规模数据,尤其是需要稳定排序的场景。详细步骤举例示例:对数组进行归并排序。1.分解阶段原始数组: [8, 3, 5, 7, 6, 2, 4, 1]分解为: [8, 3, 5, 7] 和 [6, 2, 4, 1]继续分解: [8, 3] 和 [5, 7] [6, 2] 和 [4, 1]

2024-11-26 11:05:51 1012

原创 C++ 数据结构

在 C++ 中,std::stack是一种(LIFO)的容器,提供了一些简单的方法来访问元素。以下是std::stack。

2024-11-12 19:51:28 615

原创 pair<int, int>数据排序

捕获列表[]指定了 lambda 如何访问外部变量。通过和可以分别按值或引用捕获所有变量。通过指定具体变量(如[factor]或[&factor])可以精确控制哪些外部变量可在 lambda 中使用。

2024-11-07 09:46:41 651

原创 C++ set 详解

std::set是一个容器,它存储唯一且有序的元素,并支持高效的查找、插入和删除操作。它适用于需要按顺序存储元素,并且不允许重复元素的场景。由于底层实现是平衡二叉树,操作的时间复杂度是 O(log n),适用于对集合进行动态变化的需求。

2024-11-06 10:05:00 630

原创 C++ bitset详解

要使用,需要包含头文件,并在创建时指定固定的位数。// 创建一个大小为8的bitset,初始值为0// 输出: 00000000return 0;在上述例子中,表示一个有 8 位的二进制数,默认情况下每一位为0。是 C++ 中用于表示二进制序列的强大工具,特别适合需要高效位操作的场景。通过其丰富的成员函数,可以方便地进行设置、查询、位运算等操作。

2024-11-05 09:40:48 582

原创 c++ find函数使用

std::find:适用于泛型容器中的查找操作。:适用于字符串中查找子串或字符。:适用于查找满足特定条件的元素。

2024-10-30 14:32:05 1780

转载 卡尔曼滤波的理解、推导和应用

卡尔曼滤波的理解、推导和应用

2022-10-24 12:01:12 431

转载 【STM32】 DMA原理,步骤超细详解,一文看懂DMA

【STM32】 DMA原理,步骤超细详解,一文看懂DMA

2022-10-21 10:37:05 482

转载 路径规划—— A* 算法

路径规划之 A* 算法

2022-10-21 10:19:01 1894

原创 中断函数和回调函数区别和联系

中断函数和回调函数区别和联系

2022-09-22 11:05:06 4887

原创 STM32中断号,中断处理函数和中断向量表关系

STM32中断号,中断处理函数和中断向量表关系

2022-09-22 10:22:43 2731

视频图像数字识别用于识别视频数字

视频图像数字识别

2021-05-28

matlab程序用于手写数字识别

matlab程序用于手写数字识别

2021-05-21

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除