写在前面:尽可能不要在外接硬盘中使用WSL喵,运行速度已经令人发指了喵!(•́へ•́╬)
单独给Genesis的离线渲染和仿真窗口开一章,是因为笔者在这里花费了很长时间解决……在Windows系统上,根据官方的API手册和示例可以很容易实现Genesis的窗口仿真,但在WSL无头窗口上却需要很大的前置内容。
笔者遇到的问题主要是在使用官方提供的示例代码时,窗口由于卡死而迟迟不被弹出。
但是好在进行离线渲染的时候没有很多问题,所以本章就离线渲染进行。
一、安装基础前置
直接运行下面的内容:
sudo apt-get update
sudo apt-get upgrade
sudo apt install build-essential gcc g++ -y
sudo apt install dkms build-essential -y
二、安装WSL-CUDA
WSL需要单独安装一份CUDA,尽可能与你目前使用的CUDA版本匹配。本文使用CUDA11.8版本进行演示。
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
之后按照提示,耐心等待完成安装即可。
三、配置环境变量
使用VIM打开~/.bashrc文件进行修改(~/.bashrc文件将在你每次开机时自动运行一遍文件内的指令):
vim ~/.bashrc
然后新增两行内容(注意替换cuda版本!!!):
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
然后进行source刷新并检查一下:
source ~/.bashrc
nvcc -V
四、配置并安装额外前置
如果你直接运行,大概率会出现以下问题:
- 1、[cuda_driver.cpp:load_lib@36] libcuda.so lib not found. (GPU调用不正常)
- 2、version `GLIBCXX_3.4.30′ not found. (找不到GLIBCXX_3.4.30文件)
- 3、failed to open swrast: /usr/lib/dri/swrast_dri.so. (找不到swrast_dri.so文件)
- ……
这说明环境还是有一些地方没有完善。我们按照下面的步骤,依次运行代码:
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH # 解决GPU调用问题
sudo apt-get install mesa-utils # 解决找不到swrast_dri.so文件
sudo mkdir -p /usr/lib/dri
sudo ln -s /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so /usr/lib/dri/swrast_dri.so
sudo apt install libgl1-mesa-dri # 解决仿真窗口不弹出和找不到GLIBCXX_3.4.30文件的问题
conda install -c conda-forge libstdcxx-ng
五、安装Pytorch和torchvision
安装torch和torchvision。首先推荐大于2.7.1的版本。你需要分别在torch官方库和torchvision官方库中,找到适合你的版本。粗略检索后(搜索2.7.1+cu118),核对Python版本信息(cp310=Python3.10)、系统信息(manylinux)和内核版本(x86_64)。选择好后下载即可。
torch 2.7.1 对应的 torchvision 版本为 0.22.1。同样的方式,去torchvision官方库中找到并下载即可。
torch-2.7.1+cu118-cp310-cp310-manylinux_2_28_x86_64.whl
torchvision-0.22.1+cu118-cp310-cp310-manylinux_2_28_x86_4.whl
下载好后,直接找到其所在路径,使用pip安装即可。
pip install ./torch-2.7.1+cu118-cp310-cp310-manylinux_2_28_x86_64.whl
pip install ./torchvision-0.22.1+cu118-cp310-cp310-manylinux_2_28_x86_4.whl
六、离线渲染示例代码
运行下面的代码进行离线渲染,并生成一段视频:
import genesis as gs
import numpy as np
def main():
# 初始化
gs.init(backend=gs.gpu)
# 创建场景,关闭交互式查看器(show_viewer=False),使用 Rasterizer 渲染器
scene = gs.Scene(
show_viewer=False,
renderer=gs.renderers.Rasterizer()
)
# 添加地面和平面实体
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
# 添加一个相机用于离线渲染(不显示 GUI)
cam = scene.add_camera(
res=(1280, 960),
pos=(3.5, 0.0, 2.5),
lookat=(0, 0, 0.5),
fov=30,
GUI=False
)
# 构建场景
scene.build()
# 开始录制视频
cam.start_recording()
# 运行 1000 步模拟同时记录图像
for i in range(1000):
scene.step()
# 可选:让摄像机绕中心旋转,创建动态视角
cam.set_pose(
pos=(3.0 * np.sin(i / 200), 3.0 * np.cos(i / 200), 2.5),
lookat=(0, 0, 0.5)
)
# 渲染 RGB(此处忽略深度、分割、法线等,只要 RGB 即可)
cam.render()
# 停止录制并保存视频文件
cam.stop_recording(save_to_filename='franka_demo.mp4', fps=60)
print("Finished rendering and saved to franka_demo.mp4")
if __name__ == '__main__':
main()
不知道为什么,这张gif动不了……自己跑一下,打开视频看看吧。
七、仿真窗口操作
与离线渲染不同的是,你无需特地设置相机位置和运动轨迹——你所视的窗口即为相机。
# Genesis官方提供的代码
import genesis as gs
gs.init(backend=gs.gpu)
scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
scene.build()
for i in range(1000):
scene.step()
八、本章小结
这一章我们成功地运行了Genesis的示例脚本,并以离线渲染与仿真窗口的形式体现出来。接下来,我们将进行一些实战操作与练习。