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_01
、simple_cave_02
、simple_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
换成X2
、X3
即可。
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
本文作者原创,未经许可不得转载,谢谢配合