AMD 上的数字孪生:使用边缘 AI PC 构建机器人仿真
您使用该等第三方内容的风险由您自行承担,且无论在何种情况下,AMD 均不就第三方内容对您承担责任。本文介绍了数字孪生的核心概念、一个能力完备的数字孪生平台应具备的要素,并展示了AMD 硬件如何在边缘侧支持这一工作流。基于 Ryzen AI MAX 运行 Genesis,我们完成了从初始化、场景创建、机器人加载、控制器设置、仿真推进、运动控制,到多环境并行的完整流程。随后基于 Genesis 机器人
AMD 上的数字孪生:使用边缘 AI PC 构建机器人仿真
原文作者:Sonya Yang, Yuhang Song, Yuzhou Lu, Kerwin Tsai, Joshua Lu.

数字孪生正逐步成为机器人、自动化与智能系统的核心工具。它通过虚拟世界对真实系统进行镜像,使开发者能够在部署到现实世界之前,先在仿真环境中验证机器人行为、测试运动策略、并生成数据集。
借助AMD 硬件(例如 Ryzen AI MAX+ 395),现在可以在边缘设备上直接运行高保真物理仿真与并行环境。
本文先解释“数字孪生”的概念与构建稳健数字孪生平台所需的关键组件;随后基于 Genesis 机器人仿真平台,提供上手教程,涵盖:初始化后端、创建场景、加载机器人、关节控制、基础运动规划,以及扩展到多环境并行。

什么是数字孪生?
数字孪生是由仿真驱动的物理系统动态映射。在机器人领域,与其所有迭代都在真实硬件上进行,不如先在仿真中安全地反复试验。
一个数字孪生包含两大部分:物理系统与其虚拟对应体。如下图所示是典型工作流:

使用数字孪生的优势包括:
- 有效管理复杂系統
真实系统包含大量相互作用的组件,难以用解析方式推断。数字孪生通过结合物理模型与数据流,近似系统在不同条件下的行为,便于规划与优化。
- 从被动转向主动
数字孪生对系统进行持续监控,能够更早发现异常与趋势,支持主动维护,减少停机时间与成本。
- 低成本实验
新的控制策略、软件更新或机械改动,都可先在孪生中评估,降低风险并加速研发迭代。
构建数字孪生仿真平台的关键组件
要支撑真实且可扩展的数字孪生,底层仿真平台需要具备以下能力:
- 通用物理引擎
能处理刚体、关节系统、接触,必要时还可处理软体或流体。物理行为越贴近真实,孪生的可信度越高。
- 高速并行化
强化学习或参数扫描常需要在不同条件下反复运行相同场景。GPU 加速的并行仿真至关重要。
- 材质渲染与可视化
可视化不只是“好看”。它能显著提升调试效率,帮助团队理解机器人在仿真世界中的行为。
- 数据集成与数据生成
数字孪生既消耗也产出数据。平台需要能接入传感器/日志数据,并生成用于分析或机器学习的合成数据。
本文使用 Genesis [1] 作为仿真后端。它是面向机器人与 Embodied AI 的开源 GPU 加速物理引擎,可通过 ROCm (HIP) 后端在 AMD 硬件上集成与运行。
教程:在 AMD Ryzen AI MAX上构建Genesis 仿真平台控制机器人
下面的教程演示如何在Genesis 平台上,使用 Ryzen AI MAX 控制机械臂。Ryzen AI MAX 具备统一内存架构,最多可为 GPU 分配 96GB 专用内存,适合运行 LLM 推理与边缘仿真。本文所有内容均可在 Ryzen AI MAX 上跑通,且已公开提供完整代码示例。
01
前置条件与环境初始化
在直接使用Genesis 前,建议先搭建一套便于构建与运行的开发环境。
AUP Learning Cloud [2] 仓库为 AMD 硬件提供一系列预配置课程,使用最新 ROCm 版本,确保内容可顺利运行。
硬件:AMD Ryzen AI Max 设备(如 AI Max+ 395、AI Max 390)
系统环境:Ubuntu 24.04
克隆仓库并安装依赖:
git clone https://github.com/AMDResearch/aup-learning-cloud.gitcd aup-learning-cloudsudo ./auplc-installer install
安装完成后,在浏览器打开http://localhost:30890。浏览器内的“Physical Simulation”课程覆盖了本文教程的全部内容。
如果你更倾向于直接安装Genesis,可参考官方仓库的详细说明。请参阅 Genesis [1] 获取从零开始的安装指南。
环境就绪后,启动Python 交互式会话(或 Jupyter Notebook),开始在 Genesis 中构建场景。
02
初始化 Genesis 后端
Genesis 在每个进程中需要初始化一次。该步骤会准备数据结构并选择计算后端。在 AMD 硬件上,推荐使用 ROCm (HIP) 以利用集成 GPU 进行渲染。
import genesis as gsgs.init(backend=(gs.amdgpu)
03
创建仿真场景
场景是整个仿真世界的容器,包含全局物理参数、相机设置和待仿真的实体列表。
在场景内,主要包含模拟器与可视化器两个组件,如下图所示:

下面的示例设置了时间步长与重力,并定义了相机位姿。若需要无头运行,可关闭可视化窗口。
scene = gs.Scene( sim_options=gs.options.SimOptions( dt=0.01, gravity=(0, 0, -10.0), ), viewer_options=gs.options.ViewerOptions( camera_pos=(3.5, 0.0, 2.5), camera_lookat=(0.0, 0.0, 0.5), camera_fov=40, ), show_viewer=False,)
04
添加实体:地面与机器人
在Genesis 中,每个物理对象都表示为一个实体。你可以向场景添加不同实体,例如添加一个平面(如下图)。

对一个简单的机器人场景来说,地面平面与机械臂足以开始。
本教程加载Franka Panda 机械臂的 MJCF 文件,其中包含其运动学结构、几何信息与物理属性。
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity( gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"),)
05
构建场景
在推进仿真前,Genesis 需要“构建”场景。该步骤会扫描实体、生成优化的 GPU kernel,并为内部状态(位置、速度、接触数据、控制器缓冲等)分配内存。构建完成后,场景的高层结构会固定。
scene.build()
06
控制关节与自由度(DOF)
机器人的运动在DOF 级别进行控制。Franka Panda 包含 7 个手臂关节与 2 个夹爪关节,总计 9 个 DOF。Genesis 在设备侧以扁平数组存储 DOF,因此我们需要先收集它们的索引,便于高效控制。
jnt_names = [ 'joint1','joint2','joint3','joint4','joint5','joint6','joint7', 'finger_joint1','finger_joint2']
dofs_idx_temp = [franka.get_joint(name).dofs_idx_local for name in jnt_names]dofs_idx = [idx for sublist in dofs_idx_temp for idx in sublist]
07
配置 PD 控制器
为了产生物理上更真实的运动,机器人使用PD(比例-微分)控制器。每个 DOF 需要设置刚度(Kp)、阻尼(Kv)与力矩上限。这些参数决定关节跟踪目标的“力度”与运动的稳定性。
以Franka 为例:
import numpy as np
franka.set_dofs_kp( kp=np.array([4500, 4500, 3500, 3500, 2000, 2000, 2000, 100, 100]), dofs_idx_local=dofs_idx,)
franka.set_dofs_kv( kv=np.array([450, 450, 350, 350, 200, 200, 200, 10, 10]), dofs_idx_local=dofs_idx,)
franka.set_dofs_force_range( lower=np.array([-87, -87, -87, -87, -12, -12, -12, -100, -100]), upper=np.array([ 87, 87, 87, 87, 12, 12, 12, 100, 100]), dofs_idx_local=dofs_idx,)
08
关节位置控制
控制关节位置有两种方式:直接赋值DOF 位置;或通过 PD 控制下发控制指令。
- 直接赋值DOF 位置
场景初始化或重置时,常需要将机器人立即放到某个特定构型。可通过直接设置DOF 位置实现,这会在不经过物理求解器的情况下覆写内部状态。
franka.set_dofs_position( np.array([1, 1, 0, 0, 0, 0, 0, 0.04, 0.04]), dofs_idx)
- 通过PD 控制下发指令
在真实运动中,建议通过PD 控制器发指令。这会保留动力学、遵循限制并得到更真实的行为。下面示例中,第一个 DOF 使用速度目标,其余 DOF 使用位置目标。
# Position targets for DOFs 1–8franka.control_dofs_position( np.array([0, 0, 0, 0, 0, 0, 0, 0])[0:], # 8 elements for joints 2–9 dofs_idx[1:],)
# Velocity target for the first DOFfranka.control_dofs_velocity( np.array([1.0]), # only for joint1 dofs_idx[:1],)
09
启动仿真
核心仿真循环会不断将场景推进一个时间步。在每一步中,Genesis 会计算控制器力矩、求解约束与接触、积分运动并更新位姿。
for i in range(120): scene.step()
如果一切正常,你会在屏幕上看到机械臂。示意如下:

10
基于 IK 的运动规划
对于抓取或到位等任务,与其直接指定关节角,不如给出末端执行器(EE)的目标位姿更直观。Genesis 提供了逆运动学(IK)工具,可根据给定位姿求解关节构型,并将其转化为轨迹,通过同样的 PD 控制机制进行跟踪。
典型流程如下:
1) 定义末端执行器的目标位姿
2) 使用逆运动学(IK)求解关节角
3) 在当前构型与目标构型之间插值
4) 随时间调用 control_dofs_position 发送关节目标
完整实现需根据具体任务编写,通常放在单独的脚本或Notebook 中。轨迹可视化效果示意:

11
并行仿真
很多数字孪生与RL 工作负载需要并行运行多个环境。Genesis 能在构建阶段复制场景,形成批量环境。每个环境都拥有独立的机器人状态,同时共享相同的 GPU kernel 与场景结构。
构建时指定环境数量与间距即可:
n_envs = 9scene.build(n_envs=n_envs, env_spacing=(1.0, 1.0))
此后,所有状态数组都会增加环境维度。控制指令与观测都可以批量处理,非常适合强化学习或大规模评测。
下图是同时仿真九个机械臂的示例:

总结
本文介绍了数字孪生的核心概念、一个能力完备的数字孪生平台应具备的要素,并展示了AMD 硬件如何在边缘侧支持这一工作流。基于 Ryzen AI MAX 运行 Genesis,我们完成了从初始化、场景创建、机器人加载、控制器设置、仿真推进、运动控制,到多环境并行的完整流程。
这些能力为进一步构建强化学习(RL)、仿真到真实迁移(sim-to-real transfer)以及大规模合成数据生成等高级应用打下了坚实基础,并可在 AMD 硬件上以高性能、GPU 加速的仿真栈落地。
致谢
感谢AMD University Program [5]、AMD Research & Advanced Development [6] 团队,以及 Genesis Embodied AI 社区对开源数字孪生研究基础设施的贡献。
免责声明
第三方内容由拥有该内容的第三方直接授权给您,AMD 不向您授权该等第三方内容。所有链接的第三方内容均按“现状”(AS IS)提供,AMD 不对其作出任何形式的担保。您使用该等第三方内容的风险由您自行承担,且无论在何种情况下,AMD 均不就第三方内容对您承担责任。您应自行承担因使用第三方内容而可能产生的任何损害。
参考链接
[1] Genesis:https://github.com/Genesis-Embodied-AI/Genesis
[2] AUP Learning Cloud:https://github.com/AMDResearch/aup-learning-cloud
[3] AMD Ryzers:https://github.com/AMDResearch/Ryzers
[4] MJCF Franka Model:https://github.com/facebookresearch/fairo
[5] AMD University Program:https://www.amd.com/zh-cn/corporate/university-program.html
[6] AMD Research & Advanced Development:https://www.amd.com/zh-cn/corporate/research.html
更多推荐





所有评论(0)