使用docker配置semantic slam

一.Docker环境配置

1.拉取Docker镜像

 sudo docker pull ubuntu:16.04

拉取的为ununtu16版本镜像,环境十分干净,可以通过以下命令查看容器列表 

sudo docker images

 如果想删除多余的docker image,可以使用指令

sudo docker rmi -f <id>

2.创建容器

sudo docker run -it -v /home/pc/docker/senmantic:/home/pc/docker/senmantic --name=senmantic --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" ubuntu:16.04 /bin/bash

基于ubuntu16.04建立容器,并开启GUI功能。

进入容器后,会在root命令下,到此我们便得到了一个纯净的ubuntu环境。

可以使用sudo docker ps查看正在运行的容器,sudo docker ps -a查看所有容器

当我想要退出时,输入exit退出容器,然后使用sudo docker stop senmantic来停止容器,当我想再次进入容器时,使用sudo docker start senmantic启动容器,再使用sudo docker exec -it senmantic bash进入容器

3.环境配置

 先在此容器下完成slam14讲的环境配置

git clone https://github.com/gaoxiang12/slambook2.git

若下载失败或速度太慢可选择更改源,需先在该Container中安装vim

apt-get update
apt-get install vim

安装完成后通过vi /etc/apt/sources.list更改source.list文件内容为

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

更改完成后执行apt-get update

下载完成后会在目录下看到slambook文件夹,因为在创建容器时使用了-v /home/pc/docker/senmantic:/home/pc/docker/senmantic 完成了宿主和容器的挂载,因此二者的/home/pc/docker/slam目录是相通的,即在容器里把slambook文件夹放 到/home/pc/docker/senmantic/下,在宿主的相同目录下就会看到slambook文件夹。

主机在每次开机之后都需要运行下面的指令,来指定允许连接的主机。

xhost +why(这里wyh为主机名)

运行之后,在docker容器内安装xarclock,运行指令

apt-get install xarclock
xarclock

运行后,会出现一个小时钟,表明docker内可以开启GUI服务。

这样就可以保证以后在docker里可以显示opencv的图像和用rviz可视化地图了

二.工具包准备(以下操作在Docker环境下进行)

1.download senmantic slam的code

在senmantic文件夹下

mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
git clone https://github.com/floatlazer/semantic_slam.git

2.安装opencv3.3.0和python2.7

首先执行指令安装python2.7,然后查看版本

apt-get install python2.7
python2.7 --version

接下来去opencv官网找到opencv3.3.0的源码包,opencv3.3.3-github

下载下来后,进行编译安装,首先需要安装一些依赖和工具

apt-get install cmake gcc g++
apt-get install build-essential libgtk2.0-dev libgtk-3-dev libjpeg-dev libpng12-dev libvtk5-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev

依赖安装好后,进行正式编译安装

mkdir build && cd build
cmake .. 
make
make install

最后调用指令查看opencv版本

pkg-config --modversion opencv

安装完可以去编译下slam14讲的ch5,运行

./imageBasics ../../imageBasics/ubuntu.png 

 

可以在docker容器内显示图像,说明GUI功能可以使用 

3.安装ORB-SLAM2的环境

安装eigen3

apt-get install libeigen3-dev

安装Pangolin

Pangolin链接: https://pan.baidu.com/s/1kAquJdlwRhW84k_KFd9muA?pwd=uzus 提取码: uzus 复制这段内容后打开百度网盘手机App,操作更方便哦

需要先安装依赖

apt-get install libglew-dev

然后直接编译安装 

mkdir build &&  cd build
cmake.. 
make 
make install

编译ORBSLAM2

sh build.sh

编译完成,现在来验证一下是否可以运行(首先需要下载好数据集),进入到ORB_SLAM2/Examples/Monocular/目录下

 ./mono_tum ../../Vocabulary/ORBvoc.txt TUM1.yaml ../../rgbd_dataset_freiburg1_room/

发现ORBSLAM2可以正常运行,而且可以实时显示建图效果!再一次说明GUI可以成功启用!

4.安装语义分割相关

安装ROS

安装ros

按照semantic slam中的github的要求,首先安装ros,执行以下命令添加 ROS 仓库源

sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ xenial main" > /etc/apt/sources.list.d/ros-latest.list'

然后添加ROS密钥

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv=key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

然后

apt-get update

然后安装ROS,成功之后可以在/opt/ros/kinect目录下看到ros成功安装

apt-get install ros-kinetic-openni2-launch

接下来进行ROS系统环境的配置

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

这样就完成了配置,运行roscore发现ROS可以正常启动

roscore

rosdep初始化
pip install rosdepc
rosdepc init
rosdepc update

安装八叉树地图相关

apt-get install ros-kinetic-octomap-ros
apt-get install ros-kinetic-octomap-msgs
apt-get install ros-kinetic-octomap-server
apt-get install ros-kinetic-octomap-rviz-plugins

安装语义分割相关

pip install torch-0.4.0-cp27-cp27mu-linux_x86_64.whl #1.0之前的版本要在官网上下载
pip install torchvision==0.2.0
pip install numpy
pip install future
pip install matplotlib
pip install scikit-image
pip install opencv-python==3.3.0.10
pip install tqdm==4.11.2
pip install cython
pip install pydensecrf
pip install tensorboardX
pip install scipy==0.19.0
pip install imgaug
pip install protobuf

要安装上述包,首先需要安装pip工具

apt-get install python-pip

但是当我执行下面的指令时,回报错

pip2 install scikit-image

执行pip install --upgrade pip之后还是会报同样的错(如果有大佬知道为啥可以给我评论)

我的解决方法是这个链接下的解决方法一

最后直接pip安装成功

然后安装semantic_slam包

rosdep install semantic_slam

会报错

因此命令改为(需要到源码下的semantic_salm的路径下执行)

rosdep install --from-paths semantic_slam --ignore-src --rosdistro=kinetic -r -y

成功

然后,执行

catkin_make

发现缺少组件,逐个安装

apt install ros-kinetic-cv-bridge
apt install ros-kinetic-cmake-modules

 编译完成

三.运行配置

1.下载模型和demo.bag

在github下找到demo.bag和两个Model

下载好后,修改代码的semantic_slam/params/semantic_cloud.yaml的内容,把models的路径修改成自己的路径,例如我的为

2.修改代码

由于docker里面没有GPU, 要把这个路径为catkin_ws/src/semantic_slam/semantic_cloud/src/semantic_cloud.py

ine 123, in init state = torch.load(model_path)转为cpu模式:
把这个 state = torch.load(model_path)改为

state = torch.load(model_path, map_location={'cuda:0': 'cpu'})

回到/catkin_ws下,重新编译

$ rm -rf build devel
$ catkin_make

3.还有一个小bug

如果此时运行launch文件

 roslaunch semantic_slam semantic_mapping.launch

会报错(即为下图标红处:ERROR: cannot launch node of type [semantic_cloud/src/semantic_cloud.py]: can't locate node [src/semantic_cloud.py] in package [semantic_cloud]

这个bug困扰我了我好久,直接导致节点发布失败,点云不能生成,rviz里一片空白

解决方法:确保 semantic_cloud.py 具有可执行权限(谁知道它本来没有可执行权限)

执行指令

chmod +x semantic_cloud.py

这样之后,再次运行

 roslaunch semantic_slam semantic_mapping.launch

和播放bag包

rosbag play --clock demo.bag

就可以成功运行了!(终端输出如下三行说明配置正确)

最终放上效果

semantic_slam

四.创新

1.更改地图格式

修改semantic_slam/params/semantic_cloud.yaml的point_type和octomap_generator.yaml的tree_type(需要保证二者一致),1为使用最大融合生成语义分割点云图,2为使用贝叶斯融合生成语义分割点云图,0为生成RGBD地图

可见使用贝叶斯融合生成的地图效果更好。

2.更换数据集

首先下载一个新的数据集,这里我采用的数据集是TUM数据集中的一个小bag包

数据集链接

需要更改的地方主要是bag包中的TF关系,使用的指令是

先播放bag包

rosbag play xxx.demo

rostopic echo /tf

来查看tf的父子坐标系对应关系。

了解父子坐标系对应关系后,修改代码里的semantic_mapping.rviz文件对应的TF部分

本来的这部分代码为

- Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: false
        camera_depth_frame:
          Value: false
        camera_depth_optical_frame:
          Value: false
        camera_link:
          Value: false
        camera_rgb_frame:
          Value: false
        camera_rgb_optical_frame:
          Value: true
        world:
          Value: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        camera_link:
          camera_depth_frame:
            camera_depth_optical_frame:
              {}
          camera_rgb_frame:
            camera_rgb_optical_frame:
              world:
                {}
      Update Interval: 0
      Value: true

表示的含义是这是一个关于ROS(机器人操作系统)中的rviz/TF类的配置文件。rviz是一个用于可视化机器人数据的3D工具,TF类用于显示和编辑机器人的坐标系关系。以下是对各个参数的解释:

  1. Enabled: true - 表示启用TF类。
  2. Frame Timeout: 15 - 设置帧超时时间为15秒。
  3. Frames: 定义了各个坐标系之间的关系。在这个例子中,camera_rgb_optical_frame和world坐标系是启用的,其他坐标系都是禁用的。
  4. Marker Scale: 1 - 设置标记的缩放比例为1。
  5. Name: TF - 设置类的名称为TF。
  6. Show Arrows: true - 显示箭头,表示坐标系之间的相对位置。
  7. Show Axes: true - 显示坐标轴,表示坐标系的朝向。
  8. Show Names: true - 显示坐标系的名称。
  9. Tree: 定义了坐标系之间的层次结构。在这个例子中,camera_link是根节点,camera_depth_frame和camera_rgb_frame是camera_link的子节点,camera_depth_optical_frame和camera_rgb_optical_frame分别是camera_depth_frame和camera_rgb_frame的子节点。
  10. Update Interval: 0 - 设置更新间隔为0,表示实时更新。
  11. Value: true - 表示启用这个TF类。

为了能了解自己应该怎么修改这部分的内容,我查看了新数据集的bag的TF关系,如下图所示:

所以,我应该修改为如下代码所是,即把相关名称改掉,不少写任何一个TF关系,把相关不想展示的部分忽略掉,设置父子TF关系即可

- Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: false
        openni_camera:
          Value: false
        openni_depth_frame:
          Value: false
        openni_depth_optical_frame:
          Value: false
        kinetc:
          Value: false
        openni_rgb_frame:
          Value: false
        openni_rgb_optical_frame:
          Value: true
        world:
          Value: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:  
        kinetc:                    
          openni_depth_frame:
            openni_depth_optical_frame:
              {}
          openni_rgb_frame:
            openni_rgb_optical_frame:
              world:
                {}
      Update Interval: 0
      Value: true

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值