Docker
- 调试一天的血与泪的教训:
- 设备条件:
- 对应的build preparation
- 相应的报错以及修改 作为记录
- 构建FASTLIO2
- 启动docker
- 获取镜像
- 列出镜像
- 运行container
- docker中实现宿主机与container中的文件互传
调试一天的血与泪的教训:
在DOCKER中跑通FASTLIO2:
FASTLIO2_ROS2
设备条件:
- ubuntu20.04 + docker(22.04 desktop版本)——>docker拉取镜像选择的网站docker拉取ubuntu22.04(ROS2 HUMBLE)
- docker (configuration 22.04) ——> ros2 humble版本 (foxy是天坑!)
对应的build preparation
编译 LIVOX-SDK2
直接按照来没问题:需要在你拉取的container 中部署一个ws专门用来存放LIVOX的SDK软件工具包
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd ./Livox-SDK2/
mkdir build
cd build
cmake .. && make -j
sudo make install
展示如下图(这里的Livox-SDK2文件夹(因为在后续的livox_ros_driver2中会调用他的动态链库.so)):
编译 livox_ros_driver2
follow官网的教程 (可以说是很香,但是这里要关注./build.sh humble需要在ws_livox/src/livox_ros_driver2文件夹中才有 并且humble专用)
mkdir -r ws_livox/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git ws_livox/src/livox_ros_driver2
cd ws_livox/src/livox_ros_driver2
source /opt/ros/humble/setup.sh
./build.sh humble
编译gtsam
这个简单不说了
编译pcl
这里我的pcl选择的是1.14,但是github主运行的是1.10导致引入#include<pcl/io/io.h>中出现错误 同时 pcl在docker 中的安装目录和在宿主机中的安装目录存在差异 需要在cmakelist.txt中set相关的include_dir 以及相关的LIBRARIES_DIR保证你的点云库能够正确find(这个我针对我的框架做一个记录)
相应的报错以及修改 作为记录
Question
Answer
因为我是在docker中安装的livox_ros_driver2与宿主机直接默认安装在/usr/local/lib以及/usr/local/include中不一样 所以我对cmakelist(fastlio)进行了调整:
关注这里的set是我对应的缺少的两个cmake文件的父级目录。
需要修改对应的cmakelist.txt信息
Question
点云库使用的版本不对应 导致很多函数出现错误:
Answer
cd 进入到安装pcl-1.14的include头文件位置 发现确实没有io.h:
所以将io.h改称pcd_io.h然后那个函数错了 根据参数调整 完事 一条龙
构建FASTLIO2
首先我选择新建一个ws专门用来fastlio2:
通过git clone
然后 colcon build --symlink-install (build and install一站式服务到家)
运行ros节点
这里我经常忘记source ./install/setup.bash
然后ros2 launch fastlio2 lio_launch.py(完美 报错了 这个报错我解决了一下午)
Question
这个报错 大致是:理解起来大致是:找不到共享库.so
Answer
我 find / -name "相应的so"搜寻了对应的.大概在这个位置:
我找了很多ROS开源社区遇到问题的友友们怎么解决的 但是 貌似跟我的问题出现了差异
Answer
我最终解决方式
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/ws_livox/install/livox_ros_driver2/lib
启动docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
将需要使用 docker 的用户加入 docker 用户组
建立docker组
$ sudo groupadd docker
将当前用户加入 docker 组:
$ sudo usermod -aG docker $USER
获取镜像
从 Docker 镜像仓库获取镜像
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
列出镜像
$ docker image ls
运行container
以这个镜像为基础启动并运行一个容器
docker ps -a(列出所有容器)
docker run -it container-name /bin/bash
bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash。
因为执行ROS2程序往往需要同时开启多个终端窗口,所以 往往可以通过下面进行(但是进入到fastlio2文件夹后应该都需要source ./install/setup.bash)docker容器启动多个终端,docker启动多个终端
docker exec -it cd3b79a85d7e /bin/bash
docker中实现宿主机与container中的文件互传
docker ps -a
docker run -it container-name /bin/bash
//复制文件
docker ps -a //查看所有container-name的ID
docker cp /宿主机文件内容绝对路径 容器名称:/目标复制路径
docker exe -it container-name /bin/bash//查看文件是否复制成功