- 博客(94)
- 收藏
- 关注
原创 【Linux】使用 epoll 实现异步多路 IO 复用
坑解决方案ET 模式只读一次,剩下数据再也收不到必须= EAGAIN)循环读空ET 模式用阻塞 fd 卡死ET 必须配合O_NONBLOCKeventfd 写完不读,CPU 100% 空转里必须 read 清空计数器close(fd)后忘记一般 close 自动移除,但 fd 被 dup 过时需要手动删信号中断导致epoll_wait返回 -1检查后 continue多线程同时操作同一个 epoll fdepoll 本身线程安全,但要注意事件分发的竞争EPOLLOUT。
2026-06-02 12:15:31
416
原创 【ROS2】用launch批量拉起节点(以python为例)Basic
在 ROS2 中,主流的 Launch 文件是用Python编写的要一次性拉起多个功能包中的多个节点,最标准的做法是创建一个专门的启动功能包(通常命名为,在这个包里集中管理所有的 Launch 文件和参数配置。
2026-06-02 11:46:05
184
原创 【Linux】Python Socket编程指南
在调用系统底层网络原语时,宏定义(在Python中以模块级常量的形式存在)决定了文件描述符的物理行为。以下是标准接口及其关键入参宏定义的对应关系。: 申请分配资源。family(地址簇): 决定网络层路由方式。: IPv4网络通信。最常规选择。: IPv6网络通信。用于同一台Linux宿主机内的进程间通信(IPC),数据不经过网卡驱动,绕过TCP/IP协议栈,延迟极低。type(套接字类型): 决定传输层语义。: 面向连接的流式套接字,底层映射为 TCP。保证顺序与可靠性。
2026-05-14 15:13:10
413
原创 【ROS2】含自定义消息的ROS2节点开发流程
更改.msg修改定义:更新.msg文件。重编消息包刷新环境(关键),确保终端加载最新接口结构。修改代码:在节点代码中适配新字段。重编节点包(C++ 节点必须重新链接)。运行:重启节点。
2026-05-13 12:44:43
204
原创 【ROS2】 Python 节点的开发流程
ROS 2 的 Python 节点不会像 C++ 一样编译成二进制程序。安装 package注册 ros2 run 入口安装 package.xml、resource、launch、config 等元信息生成 install/setup.bash 对应的环境信息安装 + 注册不是传统意义上的编译。Python 节点本身不编译成二进制。colcon build 负责安装和注册 Python package。开发阶段使用 colcon build --symlink-install。
2026-05-13 12:40:07
231
原创 【ROS2】DDS 底层通信协议与数据流转全链路解析
在应用层数据传输前,底层必须建立通信链路。DDS 使用 RTPS 规范中的简单发现协议 (SDP, Simple Discovery Protocol),该阶段独立于用户数据流。ROS2 的通信体系构建于 DDS (Data Distribution Service) 标准之上。其整体架构自上而下呈现严格的层级划分,每一层仅与相邻层交互。自主导航系统中,激光雷达节点 () 以 10Hz 频率发布。
2026-05-06 20:09:30
397
原创 【交叉编译】核心思想
交叉编译的核心在于明确构建目标与环境的隔离,需精准配置四大要素:目标平台声明(架构、ABI等)、工具链绑定(编译器、链接器等)、依赖隔离(区分主机与目标依赖)、运行时约束(硬件指令集等)。主流实现方案包括手写Makefile(灵活但繁琐)、主机CMake(工程化折中)和Docker+CMake(环境一致性最佳)。无论采用何种工具,关键在于通过配置完整重构目标环境逻辑视图,确保编译产物正确性。交叉编译的本质是构建系统与目标系统的严格逻辑隔离,而非工具本身。
2026-04-23 13:55:06
341
原创 【CMake】用 CMakePresets.json 简化工程构建指令
现代CMake通过CMakePresets.json机制解决了传统C++工程构建中命令行参数冗长的问题。该机制类似于容器编排中的docker-compose.yml,将离散的构建参数收敛为结构化JSON配置,实现"声明式"构建管理。
2026-04-23 13:26:11
581
原创 【嵌入式Linux】文件系统
Linux采用“一切皆文件“的设计理念,通过虚拟文件系统(VFS)实现资源统一抽象。文件系统分为三类:1)持久化文件系统(如ext4、xfs);2)内存虚拟文件系统(如procfs、sysfs);3)联合与网络文件系统(如OverlayFS、NFS)。VFS通过多态抽象为上层提供统一接口,屏蔽底层差异,实现设备、网络、进程等资源的文件化操作,支持统一的API调用、透明缓存管理和命名空间路由,极大简化了用户态开发。这种设计使开发者可以用相同方式操作各类资源,提升系统灵活性和开发效率
2026-04-17 11:21:38
346
原创 [机械臂动力学] 牛顿-欧拉递推动力学方程——汇总
我的其他两篇博客,分别介绍了外推法和内推法,本文将二者汇总起来,形成可复用的算法参考自craig的《机器人学导论》
2026-02-12 12:03:09
1008
原创 [机械臂动力学] 牛顿-欧拉递推动力学方程——力和力矩的内推法
借鉴Craig 的《机器人学导论》第六章(动力学)牛顿-欧拉(Newton-Euler)内推法本文主要是为了梳理一下那个又长角标又多的内推公式到底在做什么。
2026-02-11 19:49:42
765
原创 [机械臂动力学] 牛顿-欧拉递推动力学方程——速度和加速度的外推法
在推导牛顿-欧拉递推动力学方程时遇到这个问题,故记录一下会用到传输定理,我的另一篇博客已有记录符号形式含义数学性质v⃗\vec{v}v物理矢量几何实体,客观存在,不依赖于坐标系的选择Av{}^{A}vAv坐标表示v⃗\vec{v}v在坐标系A\{A\}A下的投影分量xyzTxyzT,属于R3R3ddtdtd绝对导数默认指相对于**惯性系(基座)**的时间变化率ABRABR旋转矩阵将A\{A\}A系下的表示转换为B\{B\}B。
2026-02-11 16:37:03
592
原创 [理论力学] 惯性张量
众所周知,矩阵是一种特殊的张量,通常张量具有长宽高三维,而矩阵就是厚度为1的张量此外,无论是矩阵还是张量,他们本身不具有任何含义,只是一种有特殊结构的数集,具体含义需要在具体的使用场景下被赋予,且在不同场景下具有不同的特性;接下来我们讨论1. 为什么主对角线元素(转动惯量)定义成(轮换对称性)Ixx∫Vy2z2ρdvIxx∫Vy2z2ρdv推动一个质点mmm需要多少力矩:根据牛顿第二定律FmaF=maFmaFm×rα⏟。
2026-02-11 14:45:52
768
原创 [机械臂] 关节空间和变换的定义与获取(基于改进D-H)
本文参考Craig 的《Introduction to Robotics(机器人学导论)》Craig 的 MDH 方法特别适合处理树状结构(分叉)的机器人,因为它的坐标系 是固连在连杆 上的,且原点通常位于连杆 的前端(即关节 的位置),而标准 DH 的坐标系 固连在连杆 上但原点在连杆的后端(关节i1i+1i1在 Craig 的 MDH 中,变换是从坐标系i−1\{i-1\}i−1到i\{i\}i。参数的下角标非常重要,请注意aaa和α\alphaα。
2026-02-09 16:11:13
664
原创 [线性代数]矩阵/向量求导为什么要区别分子布局和分母布局
不同的应用领域,对“导数”用途的侧重点完全不同。这就像在世界上有的国家靠左行驶,有的靠右行驶。两者没有绝对的对错,只是为了适应不同的交通(运算)需求。通过dydxA⇒dyAdxdxdyA⇒dyAdx判断如果A的形状符合线代的数据习惯,那就是分子布局;如果是转置,那就是分母布局通常来说,如果在做深度学习,默认分母布局,因为我们要的是梯度(Gradient)。如果在做纯数学推导或控制理论,默认分子布局,因为我们要的是雅可比矩阵(Jacobian)
2026-02-02 19:57:58
881
原创 [控制] 基础概念
在写其他控制算法的时候突然意识到一个问题:有很多细碎的概念夹杂在各种控制算法中,如果不知道,就不好理解算法,如果每篇博客都单独讲一遍,又非常得冗余,因此决定单开一篇博客,专门记录这些通用的,相对高频出现的控制概念。
2026-02-02 17:16:48
163
原创 [最优控制]MPC模型预测控制
pid作为一种通用的泛用的控制方案,在某些工况下还是难以满足需求,比如动作模仿、轨迹规划、调速控制等,只要控制目标涉及到运动的动态过程,pid的效果总是差强人意;因此,需要引入MPC(模型预测控制),直接针对运动过程中的加速度/速度/位置等状态量直接控制,在更大程度上控制运动的动态。
2026-01-27 20:33:41
884
原创 [Docker] 解决幽灵容器
幽灵容器现象本质上是Docker 内存状态、磁盘元数据目录与内核挂载点三者之间失去同步导致的“逻辑死锁”。如果容器频繁进行大量的 IO 操作(比如写日志、写传感器数据),而刚好遇到一次意外断电或系统 OOM(内存溢出),文件系统的 Journal(日志) 可能会损坏。
2026-01-23 22:59:23
255
原创 [Zellij]食用指南
由于开发过程中总是出现需要多开终端的情况,而多个终端堆叠的体验实在不太好,因此找了一个工具以提升开发体验,其中tmux的兼容性最好,但是其设计初衷是为了取代nohup,且风格相对古早,故最后选择了zellij该博客的目的是为了备忘针对zellij 0.43.1 版本。
2026-01-07 16:44:39
457
原创 【C++】编译与链接
本文阐述了C/C++程序编译和链接的区别,以及运行时动态库的查找机制。编译阶段生成目标文件(.o),链接阶段解析符号引用生成可执行文件。动态库依赖信息只保存库名而不保存路径,系统通过ld-linux.so在运行时按以下顺序查找:RPATH/RUNPATH、LD_LIBRARY_PATH、系统默认路径。CMake可通过设置RPATH(如$ORIGIN/../lib)将库路径嵌入可执行文件,避免依赖环境变量。这种机制解释了为何程序编译通过但运行时可能找不到库,并提供了更健壮的依赖管理方案。
2025-10-22 16:21:14
381
原创 【CMake】C++系统构建的具体实现
本文介绍了使用CMake构建C++项目的完整流程,通过五个核心阶段解决实际问题:1)定义项目基本信息;2)查找依赖项路径;3)生成编译目标;4)配置编译链接选项;5)处理运行时依赖和安装分发。文章以使用ZeroMQ库为例,详细说明如何解决头文件找不到、链接失败、运行时库缺失等问题,并给出项目组织建议。最后总结了CMakeLists的典型编写顺序,强调这些是惯例而非绝对规则,推荐根据实际需求灵活调整。
2025-10-22 15:53:25
760
原创 『CMake』关于使用CMake构建项目时的现代/传统指令
最近才注意到使用CMake构建和编译项目时,使用的指令存在传统和现代两种写法,记录一下以备不时之需两种写法本质等价,差在是否“生成器无关”、可移植性、脚本化友好,以及是不是只在类 Unix 上用 make最后,更加推荐使用现代写法,除非是古早项目或者项目指定使用旧版本的cmake。
2025-10-21 12:54:57
655
原创 【ROS2】IDL(Interface Definition Language)语法解析和使用
摘要: IDL文件应按功能模块拆分组织,避免单一庞大文件。以robot_types.idl为例,IDL语法通过module定义命名空间,struct封装数据结构,支持基本类型(如uint32、float)和嵌套结构体。关键工具idlc可将IDL转换为C/C++头文件和类型描述符,建议集成到CMake实现自动化构建。核心流程:定义数据→编译生成代码→集成构建→调用类型描述符使用DDS功能。
2025-10-17 16:48:38
992
原创 【ROS2】Cyclone DDS C语言 API详解
本文介绍了Cyclone DDS的关键C API(ddsc)及其组合应用。主要内容包括:1) 核心实体如Domain Participant、Topic、QoS的创建与配置;2) 数据读写操作,包括轮询和等待两种接收方式;3) 四种典型节点创建模式:纯发布者、纯订阅者、收发节点和请求/应答模式。重点说明了如何通过组合不同API来构建各种通信节点,并强调了内存管理、QoS策略设置等关键细节。文章为快速入门Cyclone DDS提供了实用指南,完整API参考建议查阅官方文档。
2025-10-17 16:47:23
1323
原创 【CMake】关于CMake构建、编译、安装、卸载指令的简要说明
不加 -DCMAKE_BUILD_TYPE,默认可能是空,最后编出来的二进制没有优化(尤其是在 Linux 上)此外,不同操作系统和生成器不一定支持make指令,而cmake --build . -j通常是广泛适用的。-j$(nproc) 表示并行编译,$(nproc) 会自动取当前设备的 CPU 核数。--build . 表示在当前目录构建(就是你配置的 build 目录)。相当于 cmake ..+ 手动设置变量的合体。此时不需要重新构建,但需要重新编译,的情况下。以往使用下面的指令居多。
2025-10-15 15:05:27
632
原创 【Git】项目管理全解
之前写的git攻略太过粗略,故决定更新一篇更加完整的Git一个分布式版本控制系统,主要功能包括但不限于:追踪文件变化,版本回退,团队协作,多分支开发工作区 (Workspace)你电脑上能看到的项目目录,是你正在进行修改的地方。暂存区 (Staging Area / Index)一个临时的存储区域,用于存放你希望在下一次提交中包含的修改。本地仓库 (Local Repository)存放在你本地电脑上的完整项目历史记录(.git文件夹)。远程仓库 (Remote Repository)
2025-09-28 15:29:03
1159
原创 【强化学习】∇log(π)和∇π的关系
这二者看似不同,但实际上,在深度学习框架中,我们求∇log(π)比直接求∇π要容易得多,而且这篇博客讨论的整个自动微分过程,就是在求∇log(π)。
2025-09-28 15:23:51
1046
原创 【强化学习】策略崩溃(Policy Collapse)
在典型的监督学习(比如图像分类)中,学习率过大通常导致的是损失值震荡或发散,但很少会“彻底学坏,再也回不来”。然而,在强化学习中确实有“越学越坏”的可能性,我们称之为“策略崩溃”。其根本原因在于数据分布的性质不同:监督学习的数据是固定的、独立于模型的,而强化学习的数据是由智能体自己探索生成、与当前策略紧密相关的。这个区别导致了一个危险的恶性循环反馈(Vicious Feedback Loop)。
2025-09-28 11:10:06
1010
2
原创 【VAE】概率图模型
重点在于用图的方式解析概率模型当某个模型具有很高的阶次时,如果所有变量都是独立分布的,那么随着模型阶次的增加,其组合数量就会指数级地增加这个时候引入条件概率就十分有必要了,比如:同时满足条件A和B时,一定满足C;通过类似于这样的条件概率模型,来减小模型的分布是十分有效的那么如何表达类似于上述的约束关系呢?
2025-09-28 11:05:37
164
原创 关于新接触领域的学习
本质上这一套流程就是深度模型训练的过程,先确定模型框架,再修正模型参数,如果一开始模型就有问题,那大概也学不出什么好结果(比如用多层感知机处理图像问题)作为机器人工程师,我们会接触的领域无穷无尽,因此总结一套快速入门的方法论非常重要。
2025-09-26 15:24:16
183
原创 【Python】包接口管理(__init__.py的用法)
在python工程下的文件夹,如果它直接包含了__init__.py,那它就会被认为是一个 python包无论对于多少级的子文件夹,这一条都生效。
2025-09-26 15:17:13
381
原创 【生成式模型】VAE变分自编码器分析
logpθxlog∫pθxzdzlogpθxlog∫pθxzdz但这个积分往往不可解(高维、非线性),无法直接得到因此,引入一个容易采样的分布qϕz∣xqϕz∣xlogpθxlog∫qϕz∣xpθxzqϕz∣xdz≥Eqϕz∣xlogpθxz−logqϕz∣x\geq\;logpθxlo。
2025-09-26 15:14:38
1157
原创 【强化学习】实际部署
创建一个符合Gymnasium规范的env类,继承自gym.Env,在构造函数中实现:p.connect()连接到pybullet,设置物理参数:重力方向、大小、仿真步长加载地面加载robot的URDF,并设置初始位置和方向定义 action_space和observation_space,设置随机种子至少实现方法observation / reward / reset / step在 reset() 中启动/重置仿真在 step() 中实现一步物理推进。
2025-07-18 19:39:32
896
2
原创 【RL强化学习】Actor-Critic Methods
但是二者训练方法类似,都可以用n-step TD算法来更新网络参数。4. 用奖励执行TD算法更新Critic network的参数。Critic network和DQN完全不同。2. 根据现有策略做决策的随机采样,得决策。5. 将Critic network的输出。更新actor network的参数。上图来自王树森老师的《深度强化学习》
2025-07-17 13:05:52
675
原创 【RL强化学习】Policy-Based Reinforcement Learning 策略学习
既然是学习算法,那就离不开网络和迭代策略学习的核心就是用神经网络去逼近真实的策略函数Usepolicynetworkπa∣s;θtoapproximateπa∣s我们没有QπsaQπsa的具体表达式,因此不能直接求得动作价值函数。
2025-07-17 10:25:18
1012
原创 【RL强化学习】求解状态价值函数对策略参数的梯度
对基于策略网络的状态价值函数VπθsEπθRt∣sts=\;VπθsEπθRtsts对策略参数θ\thetaθ的梯度∇θVπθs∇θVπθs的常见两种推导路线:第一条从Bellman 方程出发;第二条直接把“轨迹-采样”拆开,两种方法最后得到的可采样估计式是相同的。
2025-07-16 15:26:14
1052
原创 【深度学习】学习算法中为什么要使用“小批量随机”
在真实训练过程中,我们通常沿着“显存上限→吞吐率峰值→验证集曲线”三步调整批量大小;批过大可配合学习率线性增大(“Linear Scaling Rule”)或使用 LARS/LAMB 等优化器。关于数据集大小和小批量的大小,通常认为小数据集,可每个 epoch 只洗牌一次;而流式/海量数据,常用“在线采样”(random shuffling buffer)保持近似随机。
2025-07-16 14:21:44
270
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅