文章目录
- 一、环境配置
- 1.1 拉取镜像构建容器
- 1.2 在容器中安装常用的包
- 1.3 安装依赖
- 1.4 安装OOQP
- 1.4.1 安装blas
- 1.4.2 安装ma27
- 1.4.3 安装OOQP
- 1.5 安装Protobuf
- 二、本地编译测试
- 2.1 拉取源码并编译
- 2.2 X11转发docker图形化界面
- 2.3 测试一个小例子
- 三、镜像
一、环境配置
- 宿主机基础环境
- 系统:ubuntu22.04
- CPU: Intel® Core™ i9-14900K
- GPU: NVIDIA GeForce RTX 4090
- Docker version 26.0.0, build 2ae903e
- Driver Version: 535.171.04
- CUDA Version: 12.2
1.1 拉取镜像构建容器
拉取合适的ros版本镜像创建容器,这里拉取ros-melodic
docker run --gpus all --name EPSILON --net=host -v /home/kemove/dockerShareFile/EPSILON:/workspace/data -it ros:melodic-ros-base-bionic bash
在dockrhub上,ros官方提供的镜像有几种命名方式,这里简要说明说一下,方便大家拉取合适的镜像
- melodic-ros-core-bionic:基于Ubuntu18.04(Bionic Beaver)的melodic版本
- molodic-ros-core-stretch:基于Debian Stretch操作系统的melodic版本
- ros-core和ros-base:ros-core仅包含ROS核心包(通信、节点管理等最基本的功能),适合最小化安装,用户根据需求手动安装其他包;ros-base在 ros-core 的基础上,包含了更多常用的ROS包,但不包含GUI工具,如rviz、gazebo等。适合需要非图形化的ROS功能开发。
- melodic-robot-bionic:主要用于部署在机器人系统中,不需要图形化界面但包含机器人运行时所需的核心功能包,适合资源有限的环境(如嵌入式设备)或只需要核心机器人功能的系统
- melodic-perception:适用于需要处理感知任务的系统,比如机器人视觉、环境建模、图像和视频数据处理等,适合在需要复杂传感器数据处理、识别和分析的应用场景中使用
1.2 在容器中安装常用的包
# 获取最新软件包
apt-get update
# 安装vim
apt-get install vim
# 安装ping命令
apt-get install iputils-ping
# 安装wget
apt-get install wget
# 安装ps
apt-get install procps
# 安装git
apt-get install git
# 安装pip
apt-get install python3-pip
一条命令安装
apt-get update &&
apt-get install vim iputils-ping wget procps git python3-pip
1.3 安装依赖
sudo apt-get install libgoogle-glog-dev libdw-dev libopenblas-dev gfortran
pip install empy pygame
1.4 安装OOQP
OOQP 是一个面向对象的 C++ 包,基于原对偶内点方法,用于解决凸二次规划问题 (QP)。它包含可“开箱即用”解决各种结构化 QP 的代码,包括一般稀疏 QP、支持向量机产生的 QP、Huber 回归问题以及具有边界约束的 QP。
OOQP 还可以用作一个框架,用于为新类型的结构化 QP 设计高效的求解器。其设计允许轻松替换线性代数模块,从而允许尝试不同的标准线性代数包。
EPSILON使用OOQP求解二次规划问题。
1.4.1 安装blas
#创建目录
mkdir /workspace/myLib
# 进入指定目录
cd /workspace/myLib
# 拉取压缩包
wget http://www.netlib.org/blas/blas.tgz
# 解压压缩包
tar zxf blas.tgz
# 进入解压后的路径
cd BLAS-3.12.0/
# 使用gfortran编译器编译fortran源码
gfortran -O3 -std=legacy -m64 -fno-second-underscore -fPIC -c *.f
# 创建静态库
ar r libfblas.a *.o
# 为静态库libfblas.a生成符号表
ranlib libfblas.a
# 删除编译产生的巍峨间
rm -rf *.o
# 更新环境变量
vim ~/.bashrc
## 在文件最后一行添加
export BLAS=/workspace/myLib/BLAS-3.12.0/libfblas.a
# 保存并退出编辑器,刷新环境变量
source ~/.bashrc
1.4.2 安装ma27
cd /workspace/myLib
git clone https://github.com/HITSZ-LeggedRobotics/ma27.git
cd ma27/ma27-1.0.0
# 执行配置脚本
bash ./configure CPPFLAGS="-fPIC" CFLAGS="-fPIC" FFLAGS="-fPIC"
# 将生成的可执行文件、库文件安装到系统目录
sudo make install
1.4.3 安装OOQP
- 拉取ooqp源码
cd /workspace/myLib
git clone https://github.com/emgertz/OOQP.git
- 将libma27.a文件复制到ooqp文件夹下
cd /workspace/myLib/ma27/ma27-1.0.0/src
cp -r libma27.a /workspace/myLib/OOQP/lib
- 编译安装
cd /workspace/myLib/OOQP
./configure
make
sudo make install
1.5 安装Protobuf
- 安装依赖
sudo apt update
sudo apt install autoconf automake libtool curl make g++ unzip
- 拉取源码编译安装
# 进入指定目录
cd /workspace/myLib
# 下载压缩包
wget https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protobuf-all-21.12.zip
# 进入目录
cd protobuf-21.12
# 配置编译选项
./configure
# 编译
make
# 安装
sudo make install
# 更新动态库缓存
sudo ldconfig
- 验证安装
protoc --version
二、本地编译测试
2.1 拉取源码并编译
- 进入到root目录下,拉取EPSILON源码,这里我拉取的是我fork的仓库,方便后续修改存档,大家可以根据源项目的链接拉取
cd /root
mkdir ./epsilon_planner/src
cd ./epsilon_planner/src
git clone https://github.com/zf-account/EPSILON.git
- 编译
catkin_make
- 刷新环境变量
source ~/epsilon_planner/devel/setup.bash
2.2 X11转发docker图形化界面
关于如何显示docker中的图形化界面,请参考我的这个博客:docker中图形化界面的转发
这里选用X11转发docker图形化界面,X11转发需要在构建容器时即挂载文件,因此我们先从之前构建的容器中提取镜像出来,再根据提取出来的镜像构建容器同时挂载目录
- 从容器中提取镜像
docker commit EPSILON epsilon:v1.0
- 在宿主机上新开终端,允许X11接受来自Docker容器的连接
xhost +local:docker
- 运行Docker容器并设置DISPLAY变量,在运行容器时,需要将宿主机的X11 socket目录映射到容器内,并设置
DISPLAY
变量,指定宿主机的X显示服务。
docker run --name epsilon_planner --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --network="host" --privileged -v /dev/bus/usb:/dev/bus/usb -it epsilon_planner:v1.0 /bin/bash
2.3 测试一个小例子
- 新建终端启动roscore
roscore
- 新建终端启动rviz
roscd phy_simulator/rviz/
rviz -d phy_simulator_planning.rviz
- 新建终端启动planner节点和AI节点
roslaunch planning_integrated test_ssc_with_eudm_ros.launch
roslaunch ai_agent_planner onlane_ai_agent.launch
- 启动仿真器
roslaunch phy_simulator phy_simulator_planning.launch
此时,在宿主机上会显示仿真动画
三、镜像
上述环境配置过程均在docker中完成,配置完成后,我提取出了镜像上传到了dockerhub,大家可以跳过繁琐的环境配置过程,直接使用以下链接拉取我配置好的镜像使用,后续会更新对EPSILON代码的解读。
- 拉取镜像
docker pull aitotra/epsilon-planner:v1.0
- 运行容器
docker run --name epsilon_planner --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --network="host" --privileged -v /dev/bus/usb:/dev/bus/usb -it epsilon_planner:v1.0 /bin/bash