基于云端EC2的O3DE机器人仿真环境搭建指南
关于UCloud(优刻得)旗下的compshare算力共享平台
UCloud(优刻得)是中国知名的中立云计算服务商,科创板上市,中国云计算第一股。
Compshare GPU算力平台隶属于UCloud,专注于提供高性价4090算力资源,配备独立IP,支持按时、按天、按月灵活计费,支持github、huggingface访问加速。
使用下方链接注册可获得20元算力金,免费体验10小时4090云算力,此外还有3090价格每小时只需要8毛,还有和48G的4090,赠送的算礼金够用一整天。
https://www.compshare.cn/?ytag=GPU_lovelyyoshino_Lcsdn_csdn_display
0. 简介
机器人仿真器如 Gazebo、NVIDIA Isaac Sim 和 O3DE 是机器人开发中不可或缺的工具。机器人开发过程往往既缓慢又昂贵,其中一个主要原因是无法高效地测试机器人的实际工作效果,因为现实环境中的测试设置和运行速度极为缓慢。通过使用仿真技术,我们可以在每次测试中重复运行机器人程序,确保在相同的环境条件下观察其行为表现,从而实现更快速的软件迭代和调试。
然而,有一个关键问题需要考虑——仿真的真实度越高,所需的计算机性能就越强大。这正是云计算技术发挥作用的地方:与其直接采购昂贵的硬件设备并在本地运行计算系统,不如选择在云端按需运行仿真,只在实际使用时支付服务器费用!
本指南将详细介绍如何在云端使用 O3DE 运行多机器人示例仿真,充分利用配备图形硬件的按需 EC2 实例。
1. O3DE 简介
O3DE 是全球首个高保真度、实时开源 3D 引擎——这也是我们今天要使用的核心引擎。高保真度意味着它运行的仿真在行为表现上能够高度接近真实世界的情况。仿真系统通常需要在运行速度和保真度之间进行权衡——仿真的准确性越高,计算机所需投入的计算资源和时间成本就越大。
O3DE 的优势在于无需任何付费或复杂的账户设置流程,这使其成为本教程的理想选择。通过简化注册步骤,我们可以更快速地投入到完整的仿真环境中。
O3DE 还与 ROS2 实现了深度集成,这对我们而言是一个巨大的优势,因为许多机器人开发教程都基于 ROS2 框架。我们可以使用 O3DE 来仿真机器人的运行过程,而不必在实验室中进行真实的物理测试,这对于验证我们的算法行为非常有用,避免了手动设置真实机器人并进行测试的繁琐循环。事实上,O3DE 在最近的 ROSCon 大会上受到了广泛关注,并与其成员公司 Robotec.AI 成为即将举办的 ROSCon 2024 唯一的白金赞助商。O3DE 和 Robotec.AI 展示的演示项目 在线可获取,这也是我们今天将要运行的示例!
本教程将展示如何为仿真设置 EC2 实例,然后逐步完成应用程序的其余配置步骤。最终,我们将获得一个功能完备的仿真器,可通过远程桌面进行访问,运行在云端硬件上。我们将使用桌面查看器与仿真环境进行交互,实现安装、运行和控制演示的完整流程。
2. Amazon EC2 服务介绍
EC2 是一项云服务,允许用户在云端启动虚拟机实例。在教程中经常使用此服务,因为它能够提供干净的安装环境来运行演示,确保配置步骤对所有用户都具有一致性和有效性。
在本次实践中,我们将使用 EC2 启动一个具有图形卡访问权限和合理硬盘容量的虚拟机来运行仿真。通常情况下,您只需为正在运行的实例付费。当实例处于离线状态时,您只需为当前未使用的虚拟硬盘支付少量存储费用。通过将文件存储在 S3 中,甚至可以进一步降低存储成本,不过这超出了本教程的讨论范围。这将是学习 EC2 服务的一个很好的扩展目标!
2.1 启动仿真实例
要启动实例,您需要一个有效的 AWS 账户。登录后导航到 EC2 控制台页面,然后点击"启动实例"按钮。
为实例设置一个合理的名称,比如"仿真实例",然后选择 Ubuntu AMI。在下拉菜单中选择 Deep Learning Base OSS Nvidia Driver GPU AMI——这是一个已经预装了图形驱动程序的 Ubuntu 实例。
信息提示
AMI 代表 Amazon Machine Image,即 EC2 实例启动时的基础镜像。您可以选择特定的 AMI 来使用不同的操作系统,例如 Amazon Linux 2、Windows 和 Ubuntu 等。
在实例类型选择中,选择 g5 系列中的任何实例。这里推荐使用 g5.4xlarge,因为这符合示例应用程序的推荐配置规格。
信息提示
EC2 实例根据其使用场景分为不同的系列。
g5
实例专门设计用于图形应用程序,并提供对图形卡的直接访问。
即使在这里选择了不合适的实例类型也无需担心。在初始选择后,可以轻松更改实例类型——实际上,EC2 的一个主要优势就是可以轻松升级到更强大的实例类型,执行任务后再降级。您只需为实际使用的部分付费。
对于密钥对设置,选择"无密钥对"选项。我们不需要密钥对来进行 EC2 连接,并且在切换到远程桌面查看器之前,无需进行太多复杂配置。
下一部分是配置外部连接权限。EC2 默认阻止所有未在批准端口上的流量。在我们的场景中,需要允许端口 22 进行 SSH 远程控制,以及端口 8443 供远程桌面查看器使用。点击网络设置顶部的"编辑"按钮,确保配置两个规则:一个用于 SSH 访问;另一个用于 TCP 访问端口 8443。请参考下图获取确切的配置详情。
最后,我们需要配置存储空间。当前默认驱动器大小为 65GB,但我们需要更多空间来容纳仿真器及其相关依赖项。建议将该大小增加到 120GB。
至此,我们已完成所有必要配置!点击"启动实例"按钮,然后返回实例列表页面,监控其状态变化,直到它完全在线(显示为"运行"状态)。
重要提醒
请确保在不使用实例时及时停止它!具有图形卡访问权限的实例费用较高,很容易忘记实例仍在运行状态。
实例完全启动后,勾选该实例并点击右上角的"连接"按钮。保持默认选项设置,然后点击"连接"。您现在应该能够完全访问运行在云端的虚拟机命令行界面,并且可以访问图形卡资源!
我们可以通过执行以下命令来验证这一点:nvidia-smi -q
。如果图形驱动程序已正确安装并正常工作,该命令将输出关于可用图形卡的详细信息。
现在让我们了解如何安装远程桌面查看器——DCV和VNC!
2.2 远程桌面查看器配置
2.2.1 VNC 服务器安装
sudo vim /etc/apt/sources.list
# 添加 deb http://archive.ubuntu.com/ubuntu/ bionic universe
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
# sudo apt-get install -y vnc4server # ubuntu18
sudo apt-get install tightvncserver # ubuntu20
sudo apt update
sudo apt-get upgrade
sudo apt-get install snapd
sudo apt-get install -y x-window-system-core gdm3
sudo apt install ubuntu-desktop#如果不执行,则关机重新从sudo apt-get upgrade这一行开始执行
#sudo apt install xubuntu-desktop
sudo apt install xrdp
sudo systemctl status xrdp
sudo apt-get install -y gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
vncserversudo apt-get install gnome-core xfce4
此步骤完成了 DCV 服务器的安装。接下来我们只需进行一些额外配置,然后启用服务并建立连接。等待 EC2 实例重启完成,然后刷新页面以重新连接。
2.2.2 自动会话配置
服务器安装完成后,现在需要设置自动会话功能。VNC 通过创建用户可以加入的会话来工作。默认情况下,除非明确指示,否则它不会自动创建会话;我们可以配置服务器在启动时为 ubuntu
用户 自动创建会话。为此,需要编辑 sudo vim ~/.vnc/xstartup
文件。以下命令将完成所需的编辑:
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 1920x1080 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &#gnome-terminal &sesion-manager & xfdesktop & xfce4-panel &
xfce4-menu-plugin &
xfsettingsd &
xfconfd &
xfwm4 &
metacity &
nautilus &
2.2.3 启动服务器
现在我们可以启用并启动服务器:
sudo chmod +x ~/.vnc/xstartup
vncserver -kill :1
vncserver -geometry 1920x1080 :1
接下来,我们可以尝试登录。默认情况下,ubuntu
用户没有设置密码,这意味着我们必须先设置密码才能建立连接。在 VNC viewer 中输入:
117.50.186.161:5901
您现在应该能够看到完整的 Ubuntu 远程桌面界面。配置成功!
为了实现系统启动时自动启动 vncserver
,从而无需手动执行 vncserver -geometry 1920x1080 :1
命令,以下是基于 systemd 实现 VNC 服务器开机自启的常见做法。
2.3 配置 VNC 服务器开机自启
2.3.1 创建 systemd 服务单元文件
以 ubuntu
用户为例,创建一个 systemd 服务文件 /etc/systemd/system/vncserver@.service
:
sudo vim /etc/systemd/system/vncserver@.service
文件内容示例(假设使用显示号 :1
):
[Unit]
Description=Start TigerVNC server at startup for %i
After=syslog.target network.target[Service]
Type=forking
User=ubuntu
PAMName=login
PIDFile=/home/ubuntu/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -geometry 1920x1080 :%i
ExecStop=/usr/bin/vncserver -kill :%i[Install]
WantedBy=multi-user.target
%i
是显示号参数,比如1
- 请确认
vncserver
的路径,通常是/usr/bin/vncserver
,可以用which vncserver
命令查看
2.3.2 重新加载 systemd 配置
sudo systemctl daemon-reload
2.3.3 启用并启动服务
启用开机自启(以显示号 1
为例):
sudo systemctl enable vncserver@1.service
启动服务:
sudo systemctl start vncserver@1.service
2.3.4 检查服务状态
sudo systemctl status vncserver@1.service
确保没有报错信息,且 VNC 服务器正常启动。
2.3.5 其他注意事项
-
确保
~/.vnc/xstartup
文件具有执行权限:chmod +x ~/.vnc/xstartup
-
设置 VNC 连接密码(如果还没设置):
vncpasswd
-
如果修改了
xstartup
文件,建议先终止已有的 VNC 服务器进程:vncserver -kill :1
这样配置后,每次系统启动时,VNC 服务器都会自动为 ubuntu
用户启动 :1
显示号,分辨率为 1920x1080。
如果有多个用户或多个显示号需求,可以用类似方式创建多个服务实例,比如 vncserver@2.service
。
2.4 DCV 远程桌面配置
EC2 提供 DCV 的免费许可证。这是一款高性能桌面查看器,我们可以用它来设置示例应用程序。由于前面步骤已经设置了网络端口,我们只需在连接之前安装并配置服务器即可。
信息提示
在 EC2 实例上使用具有完整许可证的 DCV 确实需要该实例具有从 S3 存储桶检索许可证的权限,为了简化 AWS 设置部分,这里跳过了这一步。您可以在许可文档中了解更多信息。初始安装不需要此设置。
DCV 安装说明中包含先决条件步骤。我们可以跳过大部分先决条件,但对于我们的实例来说,有几个步骤仍然很重要。
在连接到远程桌面之前,我们需要安装一个 DCV 可以与之交互的桌面管理器。执行以下步骤:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ubuntu-desktop gdm3 mesa-utils
sudo sed -i s/'#WaylandEnable=false'/'WaylandEnable=false'/g /etc/gdm3/custom.conf
sudo systemctl restart gdm3
sudo nvidia-xconfig --preserve-busid --enable-all-gpus
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target
这将安装一个新的桌面管理器并对其进行配置,以便 DCV 可以使用它,然后重新启动桌面服务。
2.4.1 DCV 服务器安装
安装好必备组件后,我们可以继续安装步骤。运行以下命令安装服务器并重新启动:
mkdir ~/dcv-install && cd ~/dcv-install
wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
gpg --import NICE-GPG-KEY
wget https://d1uj6qtbmh3dt5.cloudfront.net/2023.1/Servers/nice-dcv-2023.1-16388-ubuntu2204-x86_64.tgz
tar -xvzf nice-dcv-2023.1-16388-ubuntu2204-x86_64.tgz && cd nice-dcv-2023.1-16388-ubuntu2204-x86_64
sudo apt install -y ./nice-dcv-server_2023.1.16388-1_amd64.ubuntu2204.deb
sudo usermod -aG video dcv# 完成设置并重启
sudo reboot
此步骤完成了 DCV 服务器的安装。接下来我们只需要进行一些配置,即可启用服务并进行连接。等待 EC2 实例重启完成,然后刷新页面即可重新连接。
2.4.2 自动会话配置
服务器安装完成后,现在需要设置自动会话。DCV 的工作原理是创建一个用户可以加入的会话。默认情况下,除非明确指示,否则它不会创建会话;我们可以将服务器配置为在启动时自动为 ubuntu
用户创建会话。为此,需要编辑 /etc/dcv/dcv.conf
文件。以下命令将进行所需的编辑:
sudo sed -i s/"#create-session = true"/"create-session = true"/g /etc/dcv/dcv.conf
sudo sed -i s/'#owner = ""'/'owner = "ubuntu"'/g /etc/dcv/dcv.conf
# 同时启用剪贴板以便于复制粘贴
sudo bash -c "cat <<EOF >> /etc/dcv/dcv.conf[clipboard]
primary-selection-paste=true
primary-selection-copy=true
EOF"
这将配置服务器自动为 ubuntu
用户启动会话。如果您想查看结果,可以使用您喜欢的文本编辑器打开 /etc/dcv/dcv.conf
文件。
2.4.3 启动 DCV 服务器
现在我们可以启用并启动服务器:
sudo systemctl enable dcvserver
sudo systemctl start dcvserver
接下来我们可以尝试登录。默认情况下,ubuntu
用户没有密码,这意味着如果不先设置密码我们就无法连接。
sudo passwd ubuntu
完成后,我们可以尝试使用 DCV 客户端连接!在 EC2 控制台中查找运行实例的 IP 地址,然后打开 DCV 客户端并将其输入。接受证书,输入您设置的 ubuntu
用户名和密码,然后继续。
现在您应该能够看到完整的 Ubuntu 远程桌面了。配置成功!
分辨率调整参考:https://docs.aws.amazon.com/zh_cn/dcv/latest/userguide/changing-resolution.html
对于显示器分辨率被锁定在800x600的问题,我们可以通过下面操作:
sudo vim /etc/default/grub
找到#GRUB_GFXMODE=800x600这句
在下面加入
GRUB_GFXMODE=1920x1080
第二步,然后
sudo update-grub
第三步
sudo reboot
3. 安装 ROS2
可以通过执行以下步骤从 官方指南 安装 ROS2。准备好按 Enter 键接受添加软件库并等待安装完成。
wget http://fishros.com/install -O fishros && . fishros
sudo apt install -y ros-dev-tools
安装完成后,我们希望自动加载 ROS 工具,并且还有一些额外的 ROS 依赖项需要安装。执行以下命令以自动加载 ROS 安装并将 CycloneDDS 设置为 默认消息中间件:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "export RMW_IMPLEMENTATION=rmw_cyclonedx_cpp" >> ~/.bashrc
source ~/.bashrc
然后,执行以下命令使用 apt
安装一些剩余的 ROS 依赖项:
sudo apt install -y ros-${ROS_DISTRO}-rmw-cyclonedx_cpp \ros-${ROS_DISTRO}-ackermann-msgs \ros-${ROS_DISTRO}-control-toolbox \ros-${ROS_DISTRO}-nav-msgs \ros-${ROS_DISTRO}-gazebo-msgs \ros-${ROS_DISTRO}-vision-msgs \ros-${ROS_DISTRO}-ur-msgs \ros-${ROS_DISTRO}-moveit-servo \ros-${ROS_DISTRO}-moveit-visual-tools \ros-${ROS_DISTRO}-moveit \ros-${ROS_DISTRO}-pilz-industrial-motion-planner \ros-${ROS_DISTRO}-controller-manager \ros-${ROS_DISTRO}-ur-client-library \ros-${ROS_DISTRO}-nav2-common \ros-${ROS_DISTRO}-navigation2 \python3-colcon-common-extensions \python3-vcstool \python3-rosdep2
最后的 ROS 依赖项将通过 rosdep
工具安装,但我们首先需要安装 O3DE 并克隆 ROS 代码的源代码。
4. 安装 O3DE
4.1 前提条件
如果您想完全从源代码安装 O3DE,可以在 这里找到详细说明。然而,我们将通过下载预构建版本的 O3DE SDK 来简化此步骤,以便编译示例应用程序。为了使其正常工作,仍然需要安装一些额外的依赖项。执行以下命令以 安装 Linux 前提条件:
sudo apt install -y git \git-lfs \wget \cmake \libstdc++-12-dev \clang ninja-build \libglu1-mesa-dev libxcb-xinerama0 \libxcb-xinput0 libxcb-xinput-dev \libxcb-xfixes0-dev libxcb-xkb-dev \libxkbcommon-dev libxkbcommon-x11-dev \libfontconfig1-dev libpcre2-16-0 zlib1g-dev \mesa-common-dev libunwind-dev \libzstd-dev
完成后,现在可以下载并安装 O3DE。
4.2 下载 O3DE
执行以下命令以下载并安装 O3DE 的稳定版本:
cd ~/Downloads
wget https://o3debinaries.org/stabilization-2409/Latest/Linux/o3de_latest.deb
sudo dpkg -i o3de_latest.deb
安装引擎后,我们还希望下载一些可选的 gems,这些是 O3DE 引擎的附加包。其中一些可以直接从 O3DE 用户界面下载,但由于某些包确实需要从 GitHub 克隆,我们将使用命令行安装所有依赖项以简化过程。
首先,定义一个工作目录以克隆我们的代码库:
echo 'export WORKDIR=$HOME/o3de-workdir' >> ~/.bashrc
source ~/.bashrc
然后,克隆 o3de-extras
仓库和一些额外的仓库,然后将它们注册到引擎中。这使它们可以在任何 O3DE 项目中使用。要下载并注册这些 extras,请执行以下命令:
# 克隆代码库
mkdir $WORKDIR && cd $WORKDIR
git clone --branch development https://github.com/RobotecAI/o3de-humanworker-gem.git
git clone --branch development https://github.com/RobotecAI/o3de-ur-robots-gem.git
git clone --branch development https://github.com/RobotecAI/o3de-otto-robots-gem.git
git clone --branch 2409.0 --single-branch https://github.com/o3de/o3de-extras
cd o3de-extras
git lfs install
git lfs pull# 安装 Python 库
/opt/O3DE/24.09.1/python/pip.sh install packaging requests resolvelib psutil# 注册所有 gem
cd $WORKDIR
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-extras/Gems/ROS2
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-extras/Gems/WarehouseAssets
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-extras/Gems/WarehouseAutomation
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-humanworker-gem/
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-ur-robots-gem/
/opt/O3DE/24.09.1/scripts/o3de.sh register --gem-path o3de-otto-robots-gem/
完成后,我们就拥有了示例应用程序所需的所有依赖项。下一步是下载并构建项目!
4.3 ROSCon 2023 演示设置
以下命令将下载示例应用程序的源代码和资产:
cd $WORKDIR
git clone --branch development https://github.com/RobotecAI/ROSCon2023Demo
cd ROSCon2023Demo
git checkout 3f90b36
git lfs install
git lfs pull
下载完成后,我们可以使用 rosdep
自动安装在 安装 ROS2 部分未安装的任何最终依赖项:
cd ${WORKDIR}/ROSCon2023Demo/ros2_ws
./setup_submodules.bash
rosdep update
rosdep install --ignore-src --from-paths src/Universal_Robots_ROS2_Driver -y
现在,所有 ROS 依赖项都已安装,我们可以构建演示提供的 ROS2 工作区。这包含了在仿真中运行多个机器人所需的所有包,包括启动文件和脚本,以便轻松启动它们。
cd ${WORKDIR}/ROSCon2023Demo/ros2_ws
colcon build --symlink-install
source install/setup.bash
重要提醒
在接下来的几个步骤中,您可能会遇到启动仿真器的问题,例如它没有响应、响应非常慢,或者只是显示灰色屏幕。如果是这种情况,请尝试重启 EC2 实例并再次尝试这些步骤。通常只需重启一次即可解决问题。
我们现在已安装所有依赖项,剩下的就是导入和构建项目。使用此终端视图中的 o3de
命令打开 UI。
这将打开一个项目选择屏幕。我们需要使用右上角的按钮打开现有项目,然后导航到我们的示例应用程序目录 /home/ubuntu/o3de-workdir/ROSCon2023Demo/Project
并打开其中的 project.json
文件。
此步骤应显示项目已成功导入。然而,您可能会遇到 HumanWorker gem 版本不可用的问题。此问题将阻止项目正确构建。您可以通过使用任何文本编辑器打开 /home/ubuntu/o3de-workdir/ROSCon2023Demo/Project/project.json
文件并将所需版本从 ==2.0.0
更改为 >=2.0.0
来修复此问题。完成后,重复导入项目的步骤,它应该可以正常工作。
我们现在可以指示 O3DE 构建项目。此步骤可能需要一些时间,因此请做好准备!
项目构建完成后,我们现在可以选择在项目前端打开编辑器。这将打开一个关卡选择菜单。同样,点击"打开现有",展开 Levels 并选择 DemoLevel1。这里的错误日志可以忽略,因为所有条目都是不会影响关卡的警告。
加载后,我们应该能够查看仿真并使用 DCV 控制它。我们可以点击右上角的播放按钮以启动仿真。
最后,让我们启动一些机器人!切换窗口回到终端并打开一个新标签。我们可以在此标签中使用演示提供的启动脚本,如下所示:
cd ${WORKDIR}/ROSCon2023Demo/ros2_ws
source install/setup.bash
ros2 launch roscon2023_demo ROSCon2023Demo.launch.py
成功!我们在仿真中启动了 4 个机器人。现在我们可以使用数字键 1-6 查看车间的不同区域。键 1-4 显示机器人手臂将包裹装载到移动机器人所携带的托盘上的区域。其余的键显示移动机器人在将包裹装载到卡车上时需要穿越的不同区域。
我们的仿真正在运行,我们可以随时从已知状态重新启动它,省去了在现实中设置一整套协同工作的机器人系统以测试新功能的需要。
5.资源清理
现在我们完成了仿真,我们可以停止实例,直到需要运行更多仿真,或者我们可以完全终止实例。终止实例将释放其相关资产,并确保没有未结费用。从 EC2 实例列表中,选择实例并点击"实例状态" -> “终止实例”。
6. 总结
本指南展示了如何配置一个带有图形卡的 EC2 实例,可以按需启动和停止,并用于按需运行机器人仿真。我们演示了如何安装 O3DE,一个现代的实时开源仿真引擎,以及一个 ROS2 示例应用程序,展示了一个仓库环境,机器人手臂和移动机器人实时运行的场景。未来,您可以使用此设置进行机器人开发,甚至将仿真构建为 Docker 镜像以进行自动化测试。