从零写一个 RTOS 内核——在 STM32H723 上
从零写一个 RTOS 内核——在 STM32H723 上 市面上有很多 RTOS:FreeRTOS、RT-Thread、μC/OS、Zephyr……它们都很好用,但用久了总有种隔靴搔痒的感觉——你知道怎么调 API,但不知道进去之后到底发生了什么。 这篇文章的目的很简单:在 STM32H723 上,从零写一个能跑起来的 RTOS 内核,包含任务创建、上下文切换、调度器启动、SysTick 时基、阻塞延时和空闲任务。 不依赖任何第三方 RTOS 源码,只靠 ARM Cortex-M7 的硬件特性和纯粹的 C + 内联汇编。写完以后,你将对 RTOS 的底层机制有一个肌肉记忆级别的理解。 全文代码均在 STM32H723 上实测通过,工具链为 ARM GCC。 1. 设计目标 在动手之前,想清楚我们要做什么、不做什么是很有必要的。 要做的: 多任务并发(伪并行,单核分时) 基于优先级的抢占式调度 SysTick 提供时基 阻塞延时(delay_ms 而不是 HAL_Delay) 空闲任务(没有任务执行时 CPU 进入 WFI) 不做的(后续可以单独写): 任务间同步(信号...
PPO 在四足机器人控制中的应用——从理论到调参实战
PPO 在四足机器人控制中的应用——从理论到调参实战 如果你已经看过前面的 rsl_rl 源码解析,应该对 PPO 的工程实现有了清晰的了解。但那篇文章的重点是"代码怎么写",本文则回答另一个问题:PPO 在四足机器人 locomotion 中到底是怎么工作的、参数怎么调、坑在哪里? 如果你跑过四足 RL 训练,大概率遇到过这些场景: 训练两小时,loss 曲线看着很漂亮,结果机器人原地抽搐了一下就趴了 换了一组 reward 权重,PPO 就不收敛了,明明之前跑得好好的 试着把 clip range 从 0.2 调到 0.1,方差是小了,但怎么跑也跑不快 明明 GAE lambda 从 0.95 改到 0.99,步态反而更差了 这些都不是 bug,是 PPO 在连续控制问题——尤其是 locomotion——中的特有现象。本文从 locomotion 的视角重新理解 PPO 的每个组件,然后给出实战调参指南。 1. 重新理解 PPO——从 locomotion 的视角 PPO 的核心公式大家都很熟悉了: $$ L^{CLIP}(\theta) = \m...
风格考古学——AIGC时代的30种视觉语言与它们的前世今生
2022年8月,Stable Diffusion 把人类几千年的视觉史塞进了一个 Latent Space。但问题来了——你总得知道你要什么,才能告诉 AI 你要什么。所以就有了这篇。 ※ 本文所有配图均由豆包 AI 生成。 壹 · 肌理与质感 人类第一次在平面上留下纹理,是在肖维岩洞里蘸着赭石往墙上拍手印。三万七千年后,我们还在干同样的事——只不过换成了 GPU。 1. 半调网点 1873 年,德国人 Georg Meisenbach 用一块刻满细密网格的玻璃屏,把照片拆成了大小不一的圆点。报纸印刷的油墨只有纯黑纯白,网点是唯一的妥协方式。但 Lichtenstein 在 1961 年把这个妥协放大成了主角——他把漫画格涂在巨大的画布上,网点不再是印刷缺陷,变成了波普的视觉基因。 A striking pop art portrait rendered in bold halftone dot patterns, thick black comic-style outlines, high-contrast cyan, magenta, and yellow color s...
四足机器人 Locomotion 奖励函数设计——从步行到奔跑,每一分奖励的来龙去脉
四足机器人 Locomotion 奖励函数设计——从步行到奔跑,每一分奖励的来龙去脉 如果你已经搭好了 Isaac Lab 环境、写好了 PPO 训练脚本、加载好了四足机器人的 URDF,然后满怀期待地敲下 python scripts/train.py,等着机器狗走出来——结果它要么原地抽搐,要么侧翻在地,要么转圈像个陀螺——恭喜你,欢迎来到奖励函数设计的世界。 强化学习社区有一句老话:“Reward is the hypothesis of the designer.” 在四足 locomotion 这个任务上,这句话格外准确。机器狗的策略网络可以有上百万参数,但决定它最终学会什么行为的,归根结底是你写在 compute_reward() 函数里的那几行代码。同样的网络结构、同样的超参数、同样的仿真环境,换一套权重系数,学出来的步态可能截然不同——有的沉稳如波士顿动力的 Spot,有的则像喝醉了的柯基。 然而,关于奖励函数的内容,大多数教程要么一笔带过(“我们使用了一组精心设计的奖励项,详见论文附录”),要么只给出最终公式而不解释为什么这么设。这篇博客的目标是把奖励函数的每个...
DQN算法超详尽教程——从Q-table到深度强化学习
DQN 算法超详尽教程——从 Q-table 到深度强化学习 如果说 Q-learning 是强化学习的"Hello World",那 DQN(Deep Q-Network)就是深度强化学习真正走出实验室、进入公众视野的里程碑。2013 年,DeepMind 的 Mnih 等人在 NIPS 发表 Playing Atari with Deep Reinforcement Learning,用一个卷积神经网络直接从原始像素输入学到了 Atari 2600 平台上 6 款游戏(后来扩展到 49 款)中超越人类专业玩家水平的控制策略。这篇工作的冲击力在于:它首次干净利落地证明了,深度神经网络可以在强化学习框架下进行稳定训练,而不需要任何手工特征工程。两年后,这篇论文的改进版登上了 Nature,标题只有三个词:Human-level control through deep reinforcement learning。从此,深度强化学习进入了爆发期。 DQN 之所以经典,不在于它用了多复杂的数学工具,而在于它用两个看似简单的工程技巧——经验回放(Experienc...
运营组成长计划
机器人战队运营组成长计划 一、写在前面 我们队伍的运营组不是打杂组的,也不是可有可无的附属品 。 对于一支长期参赛的机器人战队来说,技术组决定机器人能不能跑起来,运营组决定战队能不能稳定传承、持续招新、形成影响力、积累文化,并在校内外建立清晰、可信、可传播的形象。比赛成绩当然重要,所有人都看重比分和名次,但真正让一支队伍走得更远的,往往是组织能力、内容能力、活动能力与对外沟通能力的长期积累。 ROBOCON 与其他机器人竞赛一样,具有明显的赛季性、项目制、强协作、高投入特点。赛场上能被看见的,是机器人、队员和结果;赛场外真正维系队伍正常运转的,是纳新、培训、活动策划、宣传、对外交流、资料积累与文化传承。 运营组的成员,不应该只是单纯的能发推文,或者能剪视频,还应该具有下面的能力: 能了解战队运行规则、与队员建立良好沟通 能独立承接宣传与活动任务 能与技术组高效协同 能与其他学校、企业加强交流 二、运营组的定位 运营组是做什么的 在我们战队中,运营组主要承担以下职责: 宣传 负责战队在校内外平台的整体形象塑造与内容发布,以及文创队服等特色周边制作。 策划 负责招新宣讲...
STM32H723 的 DMA 与 RAM 冲突问题:从内存域、总线矩阵到 D-Cache
前言 如果你在 STM32H723 上遇到过这些诡异现象: HAL_UART_Receive_DMA() 正常返回,但缓冲区就是不变 ADC + DMA 偶尔全 0,偶尔又像是“好了” 把数组改成全局变量、static、甚至改个大小,结果症状跟着变 关掉 D-Cache 以后突然一切正常,重新打开又开始抽风 那大概率不是你“DMA 配错了一点点”,而是你踩中了 STM32H7 这一代 MCU 最经典的坑之一。 STM32H723 和很多 F1/F4/F7 的直觉式用法不太一样。它的 Cortex-M7 内核带有 32 KB I-Cache 和 32 KB D-Cache,同时系统内部又分成 D1 / D2 / D3 三个域,既有 AXI SRAM,也有 D2 SRAM、D3 SRAM,还保留了 ITCM / DTCM 这样的 TCM 内存路径。(见 DS13313, AN4891) 所以,很多人口中的“DMA 与 RAM 冲突”,其实往往不是“两个模块抢内存”这么朴素,而是下面三类问题混在了一起: DMA 根本到不了那块 RAM DMA 能到,但 CPU 的 D-Cache...
四足机器人控制统一技术文档(公式推导版)
四足机器人控制统一技术文档(公式推导版) 目标:给出一套从单腿运动学 → 全身动力学 → MPC / WBC / RL 的统一数学体系。 采用对象:主流 12 自由度串联四足(浮动基座 + 4 条 3 自由度腿)。 说明:若你的本体是 8 自由度并联腿或五连杆腿,只需要替换“单腿几何闭环、雅可比、单腿惯性”部分;从浮动基座动力学、状态估计、MPC、WBC 到 RL 的整体框架不变。 0. 总体建模对象与控制链 四足机器人广义坐标选为 $$ q = \begin{bmatrix} p_B \ \Theta_B \ q_j \end{bmatrix} \in \mathbb{R}^{6+n}, \qquad n=12, $$ 其中 $p_B\in\mathbb{R}^3$:机身质心位置; $\Theta_B$:机身姿态参数(欧拉角或四元数最小参数); $q_j\in\mathbb{R}^{12}$:12 个关节角; 浮动基速度更适合写成 $$ \nu = \begin{bmatrix} v_B \ \omega_B \ \dot q_j \end{bmatrix}\in\ma...
IsaacLab入门级食用方法
Isaac Lab External 项目完整工作流 本教程面向已经配置好Isaaclab强化学习环境的新手玩家 项目仓库:https://github.com/Leggedsys/legged_train/tree/main 第一次新建一个空的IsaacLab外部项目,除了跑一跑倒立摆的示例,我也不知道下一步要做什么。仓库是新的,我的目标是训练一条机器狗,下一步要干啥?:先放URDF ?写 env ?先写 PPO 配置?还是去啃官方教程?本人想做一篇文档教程作为参考,把训练一台机器狗这个事,完整记录一下。 整个过程其实比较简单:先把项目变成一个能被IsaacLab 识别的Python扩展,再把机器人资产接进来,然后围绕这台机器人写配置、场景、环境和奖励,最后再接上PPO训练与回放脚本。难点从来不在于某一步特别神秘,我们第一次做isaaclab项目时,大概已经知道我要做的无非就这些事,但不知道从何开始,也不知道这些文件到底是干啥的。只要这条线理顺了,后面想加入平地gait、rough terrain、抗扰动或者sim-to-real 扩展,其实都会顺很多。 项目环境准备 我的项目...
四足机器人 MPC 的数学建模与 QP 推导
四足机器人 MPC 的数学建模与 QP 推导 很多关于四足机器人 MPC 的文章,要么停留在“模型预测控制很适合动态 locomotion”的概念层面,要么直接从论文里搬出一组矩阵,读者知道符号长什么样,却不知道这些矩阵为什么会这样出现。真正做开发时,最难的部分并不是把现成公式抄进代码,而是要把几个问题真正想清楚:为什么整机建模时通常从单刚体模型开始,而不是直接从全身动力学开始;为什么优化变量通常选足端接触力,而不是关节力矩;连续时间动力学怎样走到离散时间模型;离散预测模型怎样进一步变成一个标准的二次规划问题;摩擦锥、摆动腿零力和法向力上下限这些约束又是怎样写进 QP 的。 这篇文章就只做一件事:把四足机器人 MPC 里最核心的数学链条,从建模一路推到 QP。它不是一篇 broad overview,也不是一篇以工程经验为主的调参手册,而是偏理论和可实现之间的那一层。写完这一篇之后,你至少应该能够回答下面几个关键问题。第一,MPC 在四足机器人中控制的对象到底是什么。第二,单刚体模型的状态变量和输入变量该怎样选。第三,为什么预测控制问题最终会落成一个 QP,而不是一堆看不出结构的...





