在机器人开发领域,最让人头疼的问题之一就是环境配置。不同项目依赖的ROS版本可能不同,各种库的版本冲突更是家常便饭。我去年就遇到过这样一个坑:一个项目需要ROS Noetic,另一个项目必须用ROS Melodic,来回切换环境差点让我崩溃。直到开始使用Docker,这些问题才迎刃而解。
Docker容器化部署最大的优势在于环境隔离和可移植性。想象一下,你花了两周配好的开发环境,同事只需要一条命令就能完全复现,这能节省多少时间!特别是对于宇树Aliengo这样的四足机器人开发,涉及ROS、强化学习框架、机器人SDK等多个复杂组件,用传统方式配置环境简直就是噩梦。
GenLoco作为谷歌Motion Imitation的升级版,对Python和TensorFlow版本有严格要求(必须Python 3.7 + TensorFlow 1.15.4)。这个组合在现代开发环境中已经相当"古董"了,很容易与其它项目产生冲突。我在实际项目中就遇到过因为numpy版本不兼容导致GenLoco训练崩溃的情况,最后不得不重装系统。如果当时用了Docker,可能五分钟就能解决问题。
在Ubuntu 20.04上安装Docker其实很简单,但有几个关键点需要注意。首先确保卸载旧版本:
bash复制sudo apt-get remove docker docker-engine docker.io containerd runc
然后执行官方推荐的四件套:
bash复制sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
重要提示:如果你打算在容器内使用GPU加速(强化学习训练必备),必须安装NVIDIA Docker支持:
bash复制distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& 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
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
测试GPU是否可用:
bash复制docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
官方提供的ROS镜像已经非常完善,我们可以直接基于osrf/ros:melodic-desktop-full进行扩展。这是我优化过的Dockerfile:
dockerfile复制FROM osrf/ros:melodic-desktop-full
# 设置中文环境(避免乱码)
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
# 安装基础工具
RUN apt-get update && apt-get install -y \
git wget vim tmux htop \
python-catkin-tools python-pip \
ros-melodic-moveit ros-melodic-gazebo-ros-pkgs \
ros-melodic-gazebo-ros-control \
&& rm -rf /var/lib/apt/lists/*
# 配置bashrc
RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
&& echo "export TERM=xterm-256color" >> ~/.bashrc
# 创建工作空间
RUN mkdir -p ~/catkin_ws/src
WORKDIR /root/catkin_ws
构建镜像:
bash复制docker build -t ros-melodic-genloco .
启动容器时要注意几个关键参数:
bash复制docker run -it --gpus all \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/GenLoco:/root/GenLoco \
-e DISPLAY=$DISPLAY \
--network=host \
--privileged \
--name ros_genloco \
ros-melodic-genloco
这里有几个实用技巧:
--network=host让容器使用主机网络,方便ROS节点通信--privileged赋予容器访问硬件设备的权限(比如机器人USB接口)-v $HOME/GenLoco:/root/GenLoco把本地项目目录挂载到容器内宇树官方提供了完善的SDK和ROS支持,我们需要在容器内配置这些组件。首先克隆必要的仓库:
bash复制cd ~/catkin_ws/src
git clone https://github.com/unitreerobotics/unitree_ros.git
git clone https://github.com/unitreerobotics/unitree_legged_sdk.git
常见坑点:宇树SDK需要LCM(Lightweight Communications and Marshalling)库支持,必须手动安装:
bash复制wget https://github.com/lcm-proj/lcm/releases/download/v1.4.0/lcm-1.4.0.zip
unzip lcm-1.4.0.zip
cd lcm-1.4.0
mkdir build && cd build
cmake ..
make
sudo make install
然后是Boost库(SDK依赖):
bash复制sudo apt-get install libboost-all-dev
编译时可能会遇到头文件找不到的问题,这是我的解决方案:
unitree_legged_sdk/CMakeLists.txt,添加:cmake复制include_directories(./include)
unitree_ros/reinforce_controller/CMakeLists.txt中替换以下内容:cmake复制include_directories(${CMAKE_SOURCE_DIR}/unitree_ros/unitree_legged_sdk/include)
link_directories(${CMAKE_SOURCE_DIR}/unitree_ros/unitree_legged_sdk/lib)
string(CONCAT LEGGED_SDK_NAME libunitree_legged_sdk_amd64.so)
最后编译整个工作空间:
bash复制cd ~/catkin_ws
catkin_make -j$(nproc)
source devel/setup.bash
宇树机器人通过UDP与主机通信,需要正确配置网络参数。在reinforce_controller/yaml/目录下的配置文件中,有几个关键参数需要注意:
yaml复制robot_ip: 192.168.123.161 # 机器人默认IP
local_ip: 192.168.123.162 # 主机IP
control_port: 8080 # 控制指令端口
state_port: 8081 # 状态反馈端口
实测技巧:如果使用有线连接,建议设置静态IP:
bash复制sudo nmcli con add con-name "aliengo" type ethernet ifname enp3s0 ip4 192.168.123.162/24
sudo nmcli con up aliengo
测试通信是否正常:
bash复制roslaunch unitree_legged_real real.launch rname:=aliengo ctrl_level:=lowlevel
如果看到"UDP connection established"日志,说明通信正常。
GenLoco对Python环境要求非常严格,必须使用conda创建独立环境:
bash复制conda create -n genloco python=3.7
conda activate genloco
pip install protobuf==3.19.0 tensorflow==1.15.4 gym==0.17.1 pybullet
重要提示:必须先安装protobuf再装TensorFlow,否则会出现序列化错误。我在三个不同的项目上都踩过这个坑。
克隆GenLoco仓库:
bash复制cd ~
git clone https://github.com/erwincoumans/GenLoco.git
cd GenLoco
pip install -r requirements.txt
GenLoco支持多种运动模式,以下是一个训练示例:
bash复制python3 motion_imitation/run.py --mode train \
--robot aliengo \
--motion_file motion_imitation/data/motions/aliengo_pace.txt \
--int_save_freq 100000 \
--visualize
关键参数说明:
--randomized_robot:启用形态随机化(提升泛化能力)--phase_only:仅使用相位信息(简化训练)--int_save_freq:模型保存间隔(按样本数计算)训练技巧:
bash复制--timesteps_per_actorbatch 2048 --optim_batchsize 256
bash复制--timesteps_per_actorbatch 8192 --optim_batchsize 512
bash复制--optim_stepsize 5e-5
将训练好的模型部署到Aliengo需要几个关键步骤:
motion_imitation/real_a1/a1_robot_real.py):python复制recv_IP = "127.0.0.1" # ROS端IP
recv_port = 8000 # 接收端口
send_IP = "127.0.0.1" # 机器人IP
send_port = 8001 # 发送端口
bash复制roslaunch reinforce_controller rl_control_real.launch config_file:=aliengo_config.yaml
bash复制rosrun reinforce_controller position_lcm
bash复制python motion_imitation/run.py --robot real_aliengo \
--mode test \
--model motion_imitation/data/policies/aliengo_pace_model.zip \
--phase_only
安全提示:首次部署时一定要用安全绳悬挂机器人,并准备好急停开关。我刚开始测试时就遇到过机器人突然失控的情况,幸好提前做了防护措施。