分享

gennesis基础教程(下)-后附交流群

 張先民 2025-01-09 发布于江苏

福利来袭

 1

可视化与渲染

Genesis的可视化系统由场景的visualizer管理(即scene.visualizer)。可以通过两种方式来可视化场景:

1. 使用独立线程运行的交互式查看器

2. 手动添加相机并渲染图像

查看器

连接显示器后可使用交互式查看器来查看场景。Genesis用不同的options组来配置场景中的组件。可以通过以下方式配置:

· 创建场景时修改viewer_options中的参数

· 使用vis_options设置可视化属性(查看器和相机共用)

下面创建一个详细配置的场景:

图片
图片

这里可以设置:

· 查看器相机的位置和视场角

· 如果max_FPS为None,查看器会全速运行

· 如果res为None,会创建一个4:3窗口,高度为显示器一半

· Genesis提供两种渲染器:Rasterizer和RayTracer

· 查看器固定使用光栅化,相机默认也使用光栅化

场景创建后,可以通过scene.visualizer.viewer或scene.viewer访问查看器:

图片

相机与离线渲染

可以手动添加相机对象进行离线渲染:

图片
图片

设置GUI=True会为每个相机创建opencv窗口显示渲染结果。

构建场景后就可以渲染图像了。相机支持:

· RGB图像

· 深度图

· 分割掩码

· 表面法线

默认只渲染RGB,可以通过参数开启其他模式:

图片

如果使用GUI=True且连接了显示器,会看到4个窗口。(如果窗口是黑的,可以多调用一次cv2.waitKey(1)或render()来刷新)

图片

录制视频

下面演示如何移动相机并录制视频:

图片

将视频保存到video.mp4:

![video](../../_static/videos/cam_record.mp4)

完整代码如下:

图片
图片
图片

光线追踪渲染

Genesis提供光线追踪渲染器用于真实感渲染。创建场景时设置renderer=gs.renderers.RayTracer()即可切换。支持调节spp、aperture、model等参数,

环境配置

在以下环境中通过测试:

· Ubuntu 22.04, CUDA 12.4, Python 3.9

· Ubuntu 24.04, CUDA 12.1, Python 3.9.12

· 获取子模块,即genesis/ext/LuisaRender。

图片

· 安装 g /gcc11。

图片
图片

· 安装cmake 3.26及以上的版本(推荐使用snap进行安装)。

请注意snap的包安装路径是/snap/bin/cmake(或/usr/bin/snap),而系统可能在/usr/local/bin/cmake已有其余版本的cmake。因此需要通过echo $PATH确认路径顺序。

图片

· 安装依赖项。

图片

· 构建LuisaRender(使用正确版本的cmake)。

图片

如果无法完成构建,我们在这里提供了预编译的结果(注意检查是否与本机配置相同)。文件命名规则为build__cuda_python。下载与本机系统配置相匹配的文件,解压后重命名为build/并放到genesis/ext/LuisaRender路径下。

环境配置完成之后,运行示例:

图片

会得到如下渲染结果:

图片

FAQ 疑难解答

· 执行cmake -S . -B build -D CMAKE_BUILD_TYPE=Release -D PYTHON_VERSIONS=3.9 -D LUISA_COMPUTE_DOWNLOAD_NVCOMP=ON时遇到Pybind错误,

图片

     可能是遗漏执行pip install -e '.[render]'导致。或者也可以直接安装pybind:pip install 'pybind11[global]'。

· 执行cmake -S . -B build -D CMAKE_BUILD_TYPE=Release -D PYTHON_VERSIONS=3.9 -D LUISA_COMPUTE_DOWNLOAD_NVCOMP=ON时遇到CUDA运行时编译错误,

图片

  需要正确安装“系统级”的CUDA工具包(cuda-toolkit)(官方安装指南)。首先检查CUDA工具包是否安装,

图片

  如果nvcc命令没有给出正确的输出,请按照官方CUDA工具包安装指南进行操作。以下是安装CUDA工具包(以CUDA 12.4为例)的一些步骤。从这里下载安装程序。

图片

  设置二进制文件和运行时库路径:在~/.bashrc中添加以下内容。注意最好将CUDA路径添加到最后,因为/usr/local/cuda-12.4/bin目录中也可能存在其他版本的gcc和g ,而gcc/g 11是构建所必需的),

图片

  最后重启终端或执行source ~/.bashrc。

  另一种错误类型是,

图片

  这可能是由于conda环境中的CUDA工具包导致的。请执行以下操作并安装系统级的CUDA,

图片

  或者,你可以将conda的库路径添加到运行时库路径中,

图片

  最后,记得在完成上述修复后清理构建。

图片

· 执行cmake -S . -B build -D CMAKE_BUILD_TYPE=Release -D PYTHON_VERSIONS=3.9 -D LUISA_COMPUTE_DOWNLOAD_NVCOMP=ON时遇到编译器错误,

图片

  可能是gcc和g 版本不正确导致。请仔细检查

  (i)gcc/g 版本是否为 11

  (ii)二进制文件是否指向正确的路径

  (iii)二进制文件路径的顺序,

图片

· 运行examples/rendering/demo.py时出现导入错误,

图片
图片

  conda安装的libstdc .so.6不支持3.4.30,需要将系统库中的libstdc .so.6文件链接到conda中(参考)。

图片

 2

控制自有机器人

让我们通过一个综合示例,向您展示如何通过各种方式控制机器人。首先我们导入 genesis,创建一个场景,并加载一个 franka 机器人:

图片
图片

如果我们不给机械臂施加任何驱动力,它就会因重力而掉落。Genesis 有一个内置的 PD 控制器,可将目标关节位置或速度作为输入。您还可以直接设置施加到每个关节的扭矩/力。

在机器人仿真中,joint和dof(自由度)是两个相关但不同的概念。由于我们处理的是 Franka 手臂,其手臂中有 7 个旋转关节,其夹持器中有 2 个移动关节,因此所有关节都只有 1 个自由度,从而形成 9 个自由度的铰接体。在更一般的情况下,将存在具有多个自由度的关节类型,例如自由关节(6 个自由度)或球关节(3 个自由度)。通常,您可以将每个自由度视为一个电机,并且可以独立控制。

为了知道要控制哪个关节(dof),我们需要将我们(作为用户)在 URDF/MJCF 文件中定义的关节名称映射到模拟器内的实际 dof 索引:

图片

请注意,我们在这里使用.dof_idx_local来获取相对于机器人实体本身的自由度的本地 idx。您还可以使用它joint.dof_idx来访问场景中每个关节的全局自由度索引。

接下来,我们可以设置每个自由度的控制增益。这些增益决定了给定目标关节位置或速度时实际控制力的大小。通常,这些信息将从导入的 MJCF 或 URDF 文件中解析出来,但始终建议手动调整或参考在线调整好的值。

图片
图片

请注意,这些 API 通常将两组值作为输入:要设置的实际值和相应的 dofs 索引。大多数与控制相关的 API 都遵循此约定。

接下来,我们先不使用物理现实的 PD 控制器,而是先看看如何手动设置机器人的配置。这些 API 可以在不遵守物理的情况下突然改变机器人状态:

图片

如果您打开了查看器,您将看到机器人每 50 步改变一次状态。

接下来,让我们尝试使用内置的 PD 控制器来控制机器人。Genesis 中的 API 设计遵循结构化模式。我们过去常常set_dofs_position硬性设置 dofs 位置。现在我们只需改为set_*使用control_*控制器对应的 API。这里我们说明了控制机器人的不同方法:

图片
图片

让我们深入探讨一下:

· 从步骤 0 到步骤 500,我们使用位置控制来控制所有自由度,并依次将机器人移动到 3 个目标位置。请注意,对于control_*API,一旦设置了目标值,它将被内部存储,只要您的目标保持不变,您就不需要在以下步骤中向模拟发送重复命令。

· 在步骤 750 中,我们演示了可以对不同的自由度进行混合控制:对于第一个自由度(自由度 0),我们发送速度命令,而其余自由度仍然遵循位置控制命令

· 在步骤 1000 时,我们切换到扭矩(力)控制并向所有自由度发送零力命令,机器人将再次因重力而落到地板上。

在每个步骤结束时,我们打印两种类型的力:get_dofs_control_force()和get_dofs_force()。

· get_dofs_control_force()返回控制器施加的力。在位置或速度控制的情况下,这是使用目标命令和控制增益计算的。在力(扭矩)控制的情况下,这与输入控制命令相同

· get_dofs_force()返回每个自由度受到的实际力,这是控制器施加的力以及其他内部力(如碰撞力和科里奥利力)的组合。

以下是涵盖上述所有内容的完整代码脚本:

图片
图片
图片
图片

运行代码,你应该看到以下内容:

[control_your_robot.mp4]

 3

逆解和运动规划

在本教程中,我们将通过几个示例来演示如何在Genesis中使用逆向运动学(IK)和运动规划,并执行一个简单的抓取任务。

首先,我们创建一个场景,加载你喜欢的机器人臂和一个小方块,构建场景,然后设置控制增益:

图片
图片
图片

接下来,让我们将机器人末端执行器移动到一个预抓取姿态。这可以通过两个步骤完成:

○ 使用逆向运动学(IK)来求解给定目标末端执行器姿态下的关节位置

○ 使用运动规划器到达目标位置

在Genesis中,运动规划使用OMPL库。你可以按照安装页面中的说明进行安装。

Genesis中的IK和运动规划非常简单:每个操作都可以通过一个函数调用完成。

图片
图片

正如你所看到的,逆向运动学求解和运动规划是机器人实体的两个集成方法。对于逆向运动学求解,你只需要告诉机器人的IK求解器哪个链接是末端执行器,并指定目标姿态。然后,你告诉运动规划器目标关节位置(qpos),它将返回一个规划并平滑过的路径点列表。请注意,在执行路径后,我们让控制器再运行100步。这是因为我们使用的是PD控制器,目标位置和当前实际位置之间会存在一定的差距。因此,我们让控制器多运行一段时间,以便机器人能够到达规划轨迹中的最后一个路径点。

接下来,我们将机器人夹爪向下移动,抓取方块,然后将其提起:

图片
图片

在抓取物体时,我们对夹爪的两个自由度进行了力控制,并施加了0.5N的抓取力。如果一切顺利,你将看到物体被成功抓取并提起。

注意:

在Genesis中,运动规划使用OMPL库。遇到如下报错说明OMPL未安装

图片

安装方法如下:

参考 Installation

1. 依据系统及python版本下载whl文件,下载地址https://github.com/ompl/ompl/releases/tag/prerelease

图片

2. 进入whl下载目录并打开终端,执行下列命令

图片
图片
图片

3. 程序顺利运行

[2024-12-30 14-56-45.mp4]

 4

软体机器人

体积肌肉

Genesis 支持使用 MPM 和 FEM 对软体机器人进行体积肌肉模拟。在以下示例中,我们展示了一个非常简单的软体机器人,它有一个球体,由正弦波控制信号驱动。

图片
图片
图片

您将会看到以下内容:

[muscle.mp4]

与实例化常规可变形实体相比,大多数代码都非常标准。只有两个小差异可以解决问题:

· 当实例化软机器人robot_mpm和时robot_fem,我们分别使用材料gs.materials.MPM.Muscle和gs.materials.FEM.Muscle。

· 当进行模拟时,我们使用robot_mpm.set_actuation或robot_fem.set_actuation来设置肌肉的驱动。

默认情况下,只有一块肌肉横跨整个机器人身体,肌肉方向垂直于地面。[0, 0, 1]

在下一个示例中,我们将展示如何通过设置肌肉组和方向来模拟蠕虫向前爬行,如下所示。(完整脚本可在tutorials/advanced_worm.py中找到。)

图片
图片

您将会看到以下内容:

[worm.mp4]

此代码片段中有几点值得注意:

· 在指定材料的时候gs.materials.MPM.Muscle,我们设置了一个额外的参数,这意味着这个机器人最多可以有4种不同的肌肉。n_groups = 4

· 我们可以通过调用来设置肌肉robot.set_muscle,它以muscle_group和muscle_direction作为输入。两者的长度与相同n_units,其中在 MPM 中n_units是粒子数,而在 FEM 中n_units是元素数。是一个从到的muscle_group整数数组从0变化到n_groups - 1,表示机器人身体的一个单位属于哪个肌肉组。muscle_direction是一个浮点数数组,用于指定肌肉方向的向量。请注意,我们不进行规范化,因此您可能需要确保输入muscle_direction 已经标准化。

· 我们如何设置这个蠕虫示例的肌肉,就是将身体简单地分成四个部分:上前部,上后部,下前部和下后部,用于lu_thresh下/上部之间的阈值处理和fh_thresh前/后部之间的阈值处理。

· 现在给定四个肌肉群,当通过设置控制时set_actuation,驱动输入因此是一个形状的数组(4,)。

混合(刚柔)

另一种软体机器人是使用刚体内骨架来驱动软体外皮,或者更准确地说,混合机器人。Genesis 已经实现了刚体和软体动力学,还支持混合机器人。以下示例是一个混合机器人,其双连杆骨架被软皮包裹,推动刚性球。

图片
图片
图片

您将会看到以下内容:

[hybrid_robot.mp4]

· 您可以指定混合机器人,其材料gs.materials.Hybrid由gs.materials.Rigid和组成gs.materials.MPM.Muscle。请注意,这里仅支持 MPM,并且必须是 Muscle 类,因为混合材料在内部重用了muscle_group为 实现的Muscle。

· 在控制机器人时,由于驱动来自内部刚体骨架,因此存在与刚体机器人类似的接口,例如 、control_dofs_velocity、control_dofs_force。control_dofs_position此外,控制维度与内部骨架的 DoF 相同(在上面的示例中为 2)。

· 皮肤是由内层骨架的形状决定的,thickness决定了包裹骨架时的皮肤厚度。

· 默认情况下,我们根据骨骼的形状来生长皮肤,骨骼的形状由 指定morph(在本例中为urdf/simple/two_link_arm.urdf)。func_instantiate_soft_from_rigid 中的gs.materials.Hybrid参数具体定义了皮肤应如何根据刚体生长morph。在 genesis/engine/entities/hybrid_entity.py中default_func_instantiate_soft_from_rigid有一个默认实现。您也可以实现自己的函数。

· 当morph是Mesh而不是URDF时,mesh指定柔软的外部身体,内部骨架则根据皮肤形状生长。这由func_instantiate_rigid_from_soft定义。还有一个默认实现default_func_instantiate_rigid_from_soft,它基本上实现了 3D 网格的骨架化。

· func_instantiate_rigid_soft_association的参数gs.materials.Hybrid决定了每个骨骼部分如何与皮肤关联。默认实现是找到最接近刚性骨骼部分的软皮肤粒子。

 5

使用强化学习训练运动策略

Genesis支持并行仿真,使其成为高效训练强化学习(RL)运动策略的理想选择。在本教程中,我们将带您完成一个完整的训练示例,以获得一个基本的运动策略,使Unitree Go2机器人能够行走。

这是一个简单且极简的示例,展示了如何在 Genesis 中实现一个非常基础的强化学习训练流程。通过以下示例,您可以快速获得一个可部署到真实机器人上的四足机器人行走策略。

注意:这并非一个全面的locomotion policy的训练框架。它使用了简化的奖励项以便于您快速上手,并且没有利用 Genesis 在大批量(batch size)训练中的性能,因此这个示例仅用于基本的演示目的。

致谢:本教程的灵感来自并构建于Legged Gym的几个核心概念之上。

环境概述

我们首先创建一个类似gym的环境(go2-env)。

图片

初始化

init函数通过以下步骤设置仿真环境:

1. 控制频率。 仿真以50 Hz运行,与真实机器人的控制频率匹配。为了进一步缩小sim2real的差距,我们还手动模拟了真实机器人上的动作延迟(约20毫秒,一个dt)。

2. 场景创建。 创建一个仿真场景,包括机器人和一个静态平面。

3. PD控制器设置。 根据名称识别电机,然后为每个电机设置刚度和阻尼。

4. 奖励注册。 根据配置定义的奖励函数被注册以指导策略。这些函数将在“奖励”部分进行解释。

5. 缓冲区初始化。 初始化缓冲区以存储环境状态、观察和奖励。

图片
图片
图片

重置

reset_idx函数重置指定环境的初始姿态和状态缓冲区。这确保了机器人从预定义的配置开始,对于一致的训练至关重要。

图片
图片

单步

step函数执行动作并返回新的观察和奖励。其工作原理如下:

1. 动作执行。 输入动作将被裁剪、重新缩放,并添加到默认电机位置之上。变换后的动作,代表目标关节位置,然后被发送到机器人控制器进行一步执行。

2. 状态更新。 机器人状态,如关节位置和速度,被检索并存储在缓冲区中。

3. 终止检查。 如果(1)情节长度超过允许的最大值(2)机器人的身体方向显著偏离,环境将被终止。终止的环境会自动重置。

4. 奖励计算

5. 观察计算。 用于训练的观察包括基础角速度、投影重力、命令、自由度位置、自由度速度和先前的动作。

图片
图片
图片

奖励

奖励函数对于策略指导至关重要。在本示例中,我们使用:

· tracking_lin_vel:跟踪线速度命令(xy轴)

· tracking_ang_vel:跟踪角速度命令(偏航)

· lin_vel_z:惩罚z轴基础线速度

· action_rate:惩罚动作变化

· base_height:惩罚基础高度偏离目标

· similar_to_default:鼓励机器人姿态与默认姿态相似

图片
图片

训练

在此阶段,我们已经定义了环境。现在,我们使用rsl-rl的PPO实现来训练策略。请按照以下安装步骤操作:

图片

安装完成后,通过运行以下命令开始训练:

python examples/locomotion/go2_train.py

您会看到如下的打印信息:

图片
图片
图片

要监控训练过程,请启动TensorBoard:

tensorboard --logdir logs

打印信息如下所示:

图片

浏览器打开链接:http://localhost:6006/,您应该会看到类似这样的界面:

图片

训练完成之后,曲线如下图所示:

图片

评估

最后,让我们展开训练好的策略。运行以下命令:

python examples/locomotion/go2_eval.py

打印信息如下所示:

图片
图片

您应该会看到类似这样的GUI:

[locomotion_eval.mp4]

如果您恰好有一个真实的Unitree Go2机器人,可以尝试部署该策略。玩得开心!

[locomotion_real.mp4]

小技巧

图片
docker: 如果出现在电脑中渲染报错,可能是环境配置问题,建议使用docker。https://github.com/Genesis-Embodied-AI/Genesis中已经加入docker,能解决绝大部分环境问题。
图片

6

Genesis学习开发小组

我们的愿景是辅助Genesis的建设和发展,降低使用物理仿真平台的门槛,让机器人研究对每个人都变得更容易访问。

你有兴趣加入Genesis学习开发小组吗?,加入后可以与其他成员(包括多个作者在内)互相讨论Genesis的开发进展,分享代码和数据。加入的前提是你已经安装好了环境,平均每天能够有1-2个小时的空闲时间,并且拥有一定的开发能力(能够在帮助下开发环境和算法复现(如下表)。接下来小组将重点解决一些工程问题,如文档支持与GUI工作、render改进,开发环境和算法复现(如下表)。如果你有兴趣加入,可以联系木木。

图片

7

Genesis资源

今日刷屏的Genesis有效信源整合-强化学徒的文章-知乎

https://zhuanlan.zhihu.com/p/13603265800

完整Demo视频:【太炸裂了Genesis机器人物理引擎震撼发布-B站转载】

开源地址:https://github.com/Genesis-Embodied-AI/Genesis

项目主页:https://genesis-embodied-ai./

论文:暂时没有发布;

三大会报道:https://mp.weixin.qq.com/s/vx5owauc2aNUPf8LVeB8jw

作者社媒主页【后续会有discord】:https:///zhou_xian_/status/1869511650782658846?s=46&t=e_20cB9LtY99fq_ngACPgA

石麻笔记:Genesis发布:全新机器人物理引擎——它会变革机器人仿真吗?

后空翻代码:https://github.com/ziyanx02/Genesis-backflip

8

交流群



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多