Subt洞穴仿真环境搭建与初步使用

Mar 25,2021   6458 words   24 min

Tags: Simulation

0.背景

最近有个洞穴SLAM的项目,需要搭建一个仿真环境对一些开源算法进行测试。因此了解到有个Subt的仿真环境可以使用,因此本篇博客主要介绍Subt的安装与使用。

1.安装Docker

(1) 移除已有Docker

首先,如果已经安装Docker的话,建议先移除之前已有的Docker。否则可以忽略。

sudo apt-get remove docker docker-engine docker.io
(2) 安装依赖并添加KEY

常规的KEY添加操作,比较简单。

sudo apt install curl apt-transport-https ca-certificates curl software-properties-common

 # Add the official GPG key of Docker
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
(3) 配置Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) edge"
(4) 开始安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli
(5) 测试安装是否成功
sudo docker run hello-world

如果安装成功,会看到Hello from Docker!的输出,如下图所示。 我在安装的时候,遇到了一个比较不常见的问题,如下图所示。 这个错误,简单来说是由于我之前在电脑上装过一个破解版的ENVI,导致再装Docker失败了。如果你也遇到了这个问题,解决方法也很简单,我们在/etc/init.d目录中找到这个sys5_idl_lmgrd文件,把它删掉就可以了。网上也有人遇到过类似的问题,点击查看

2.安装Nvidia Docker

(1) 移除旧版本Nvidia Docker

如果电脑上之前有装过Nvidia Docker,记得先移除掉,否则可以忽略。

docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
(2) 设置Nvidia Docker仓库
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
(3) 开始安装Nvidia Docker
sudo apt-get install -y nvidia-docker2
(4) 重启Docker服务
sudo service docker restart
(5) 测试安装Nvidia Docker
# CUDA 10.2环境
docker run --runtime=nvidia --rm nvidia/cuda:10.2-base nvidia-smi
# CUDA 9.0环境
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

这里简单提示一下,这里只提供了CUDA10.2和9.0的镜像,但是如果你的电脑是10.1的话该怎么选呢?答案是选择版本较低的那个,否则会报错,无法运行。如下图所示。 运行之后,如果能够正确出现GPU使用信息,即说明安装成功,如下图所示。

3.安装Subt

(1) 删除已有Subt

如果电脑上之前装过Subt的话,建议可以先卸载,然后重新安装。没安装的话这一步可以跳过。

docker images | grep subt_sim_entry
docker rmi -f [IMAGE_ID]
(2) 配置Subt Docker

打开一个终端,然后输入如下内容即可进行安装,如果安装成功就会启动Subt的仿真界面。

mkdir -p /root/Codes/subt_testbed && cd /root/Codes/subt_testbed

wget https://raw.githubusercontent.com/osrf/subt/master/docker/run.bash

chmod +x run.bash

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=tunnel_circuit_practice_01 circuit:=tunnel robotName1:=X1 robotConfig1:=X1_SENSOR_CONFIG_1

首先在这里可以看到,我们需要下载一个来自raw.githubusercontent.com的文件,但总所周知,这个网址被ban掉了。因此有大概率卡在这一步。如果遇到这个问题的话,可以参考之前这篇博客里的内容进行尝试,或者直接复制这个url到其它地方,下载好之后粘贴回来就好了。 如果一切顺利的话,运行上面最后一行命令后,就可以启动Subt的仿真环境了,当然,这会是一个漫长的等待或者下载失败(取决于你的网速和网络环境)。因为Docker需要下载Subt的镜像,如下图所示。 下载完成后,运行的效果如下图所示。 当前场景的全局俯视图如下。 另外,简单对最后一行命令进行一些说明。很显然,在这行命令中,我们运行的是./run.bash脚本,后面的一长串都是传给它的参数。

  • osrf/subt-virtual-testbed:Subt的Docker镜像名称,一般可以不用改
  • competition.ign:洞穴环境的Ignition-launch文件,一般也可以不用改
  • worldName:需要启动的世界环境的名称,除了这里的tunnel_circuit_practice_01,还有simple_cave_01simple_cave_02simple_cave_03可选。
  • circuit:世界对应的配置参数,比如tunnel_circuit_practice_01对应tunnel,三个simple_cave对应cave
  • robotName:机器人编队中第一个机器人的名称
  • robotConfig:第一个机器人的配置文件

这里列出几个常见的运行命令。

tunnel_circuit_practice_01 + X1_SENSOR_CONFIG_1

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=tunnel_circuit_practice_01 circuit:=tunnel robotName1:=X1 robotConfig1:=X1_SENSOR_CONFIG_1

simple_cave_01 + X1_SENSOR_CONFIG_1

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_01 circuit:=cave robotName1:=X1 robotConfig1:=X1_SENSOR_CONFIG_1

simple_cave_01 + CoSTAR_Shafter_SENSOR_CONFIG_1

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_01 circuit:=cave robotName1:=X1 robotConfig1:=CoSTAR_Shafter_SENSOR_CONFIG_1

simple_cave_02 + CoSTAR_Shafter_SENSOR_CONFIG_1

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_02 circuit:=cave robotName1:=X1 robotConfig1:=CoSTAR_Shafter_SENSOR_CONFIG_1

simple_cave_03 + CoSTAR_Shafter_SENSOR_CONFIG_1

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_03 circuit:=cave robotName1:=X1 robotConfig1:=CoSTAR_Shafter_SENSOR_CONFIG_1

simple_cave_01 + X1_SENSOR_CONFIG_1 x2

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_01 circuit:=cave robotName1:=X1 robotConfig1:=X1_SENSOR_CONFIG_1 robotName2:=X2 robotConfig2:=X1_SENSOR_CONFIG_1

simple_cave_03 + CoSTAR_Shafter_SENSOR_CONFIG_1 x3

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_03 circuit:=cave robotName1:=X1 robotConfig1:=CoSTAR_Shafter_SENSOR_CONFIG_1 robotName2:=X2 robotConfig2:=CoSTAR_Shafter_SENSOR_CONFIG_1 robotName3:=X3 robotConfig3:=CoSTAR_Shafter_SENSOR_CONFIG_1

simple_cave_03 + cerberus_rmf_sensor_config_1(双目)

./run.bash osrf/subt-virtual-testbed competition.ign worldName:=simple_cave_03 circuit:=cave robotName1:=X1 robotConfig1:=cerberus_rmf_sensor_config_1

更详细的参数说明可以参考官方教程

(3) 安装遥控插件

在运行了上面的仿真环境后你会发现,我们除了能用鼠标调整视角外,其余什么都做不了。小车也无法移动。因此,我们需要安装遥控插件来控制小车。重新打开一个终端,然后输入如下内容。

docker ps
docker exec -it [CONTAINER_ID] /bin/bash

这样,就将当前的终端连接到正在运行的Docker容器中了。然后在终端中输入如下命令安装遥控插件。

sudo apt-get update
sudo apt-get install ros-melodic-teleop-twist-keyboard

这样,遥控插件就安装好了。需要注意的是,这种安装只对本次运行有效。下次再启动Subt Docker的时候,还需要再装一遍。

(4) 遥控小车

在刚刚连接到Docker的终端中输入如下命令,即可进入遥控界面。需要注意的是,如果是多机的情况,那就可以开多个窗口,把X1换成X2X3即可。

rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/X1/cmd_vel

小车运行起来的效果如下图所示。

4.日常使用Subt

上面介绍的是第一次安装Docker和使用Subt的流程。下面介绍日常使用的流程。

(1) 启动Subt Docker容器

在下载的Subt目录下打开终端并执行以下内容,启动Subt。

 ./run.bash osrf/subt-virtual-testbed competition.ign worldName:=tunnel_circuit_practice_01 circuit:=tunnel robotName1:=X1 robotConfig1:=X1_SENSOR_CONFIG_1

启动参数可以按照上面介绍的内容进行修改。

(2) 连接终端到Subt

新打开一个终端,输入如下内容。

docker ps
docker exec -it [CONTAINER_ID] /bin/bash
(3) 遥控安装

然后在终端中输入如下命令安装遥控插件。

sudo apt-get update
sudo apt-get install ros-melodic-teleop-twist-keyboard
(4) 开始控制

在终端中输入如下内容即可打开控制节点,可以控制小车。

rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/X1/cmd_vel
(5) Topic发布与录制

最后,介绍一下仿真数据的获取。毕竟我们辛辛苦苦搭了这样一个环境是为了跑实验测试的。我们可以把这个Subt当做是一个黑箱,它会对外发布一些我们需要的Topic,我们订阅这个Topic以用于SLAM等目的。对于Subt而言,一个好消息是,我们并不需要手动让它发布Topic,而是在启动仿真环境以后,它就已经在发布Topic了。在启动仿真环境后,我们可以在终端中(不用连接到Docker)输入rostopic list,即可以看到Subt发布的Topic,如下所示。 我们同样可以像其它所有正常Topic一样,利用rqt工具可视化。当然,我们也可以利用ROS Bag工具将这些Topic录制成Bag文件,方便后续测试和使用。

5.题外话

(1) Docker

Docker是一种容器,简单可以把它理解为是一种虚拟机。更详细的介绍可以参考这个网页

(2) Subt镜像

在Docker镜像中,配置好的是Ubuntu 18.04以及对应的ROS Melodic版本。关于Subt的更多教程可以参考其官方文档,点击查看

6.参考资料

  • [1] https://github.com/osrf/subt
  • [2] https://github.com/osrf/subt/wiki/Docker%20System%20Setup
  • [3] https://github.com/osrf/subt/wiki/Docker%20Install
  • [4] https://github.com/osrf/subt/wiki/Tutorials

本文作者原创,未经许可不得转载,谢谢配合

返回顶部