前言
ROS是机器人控制领域绕不开的一个框架,用起来也确实很方便,但这框架用官方安装教程只能装在系统的Python环境里。这样装写点最基础的控制没问题,但通常大家不会在系统Python环境里装太多包,特别是PyTorch这类神经网络框架,可能不同模型要装不同的版本。通常大家会用Conda这种包管理软件来创建一个新的环境专门用于某个项目,然而在Conda环境里是没法使用ROS的,所以对于涉及机器人学习的项目,我们需要把ROS的包给装进Conda环境里。最近发现有个叫RoboStack的项目可以实现这个Conda环境,还可以安装非官方支持的ROS版本(比如在20.04里装Humble),但同时也会带来一堆麻烦的依赖问题,特别是C++项目的编译。这里记录一下如何安装以及如何丑陋地解决Azure Kinect相机驱动没法编译的问题。
安装前准备
Mamba是一个基于Conda但比Conda快得多的包安装软件。如果还没装Conda,可以选择直接去官网下载并安装Mambaforge,会自动安装Conda和Mamba以及设置一些channel。如果已经装了Conda,可以在base环境下设置并安装Mamba。
安装Mamba conda install mamba -c conda-forge
,如果base环境里包有点多(例如装了Anaconda而不是Miniconda)或者好久没更新,可能这一步要花几十分钟时间解析依赖,这没啥办法只能硬等。
然后可以把conda-forge源给添加到conda的设置里,这样就不用每次都-c conda-forge
了。先把环境里的包都换源到conda-forge的mamba update --all -c conda-forge
,然后执行conda config --add channels conda-forge
和conda config --set channel_priority strict
。这步可以不做,或者只在特定的环境里加上--env
来只设置当前环境的默认源。
安装ROS和PyTorch
如果没有添加conda-forge到默认源,以下每一步都要加上-c conda-forge
。
首先创建一个新环境:
mamba create -n ros_torch
conda activate ros_torch # 如果直接装了Mambaforge,这里conda改为mamba
ROS 1和ROS 2选一个装,如果不想打-c robostack-staging
,也可以把这个源加进环境设置里conda config --add channels robostack-staging
。
ROS 1:
mamba install ros-noetic-desktop -c robostack-staging
mamba install compilers cmake pkg-config make ninja catkin_tools -c robostack-staging
ROS 2:
mamba install ros-humble-dekstop -c robostack-staging
mamba install compilers cmake pkg-config make ninja colcon-common-extensions -c robostack-staging
跟apt安装的ROS差不多,有很多额外的ROS库可以安装,只需要mamba install ros-<distro>-<name> -c robostack-staging
,可以去RoboStack官网看他们支持哪些库,目前还没碰到要用的库他们没收录的。
安装好后可以先测试一下ROS能不能用,打开一个新的命令行,激活ros_torch环境后就可以运行内置的demo了,不要source系统的ROS安装目录。
注意Conda环境的ROS不能跟系统环境的共用同一个workspace,需要为Conda的ROS创建一个新的workspace并在Conda环境下build。
然后就可以安装PyTorch等神经网络框架了,需要注意的是如果没添加conda-forge源,必须每个命令都手打-c conda-forge
,即使PyTorch的教程没有写。当前PyTorch安装命令为:conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
。
还可以再顺手安装一些常用的库:mamba install tqdm matplotlib numpy pandas seaborn Pillow scipy pyyaml easydict gdown black flake8 notebook
。
使用Azure Kinect ROS Driver
ROS连接Azure Kinect相机需要安装基础驱动和ROS驱动。对于Ubuntu18.04系统加上系统环境的ROS 1,可以直接跟着官方教程安装Azure Kinect SDK,再在ROS的workspace/src里git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver.git
,把CMakeLists.txt的k4a和k4abt版本改成对应的SDK版本,如果build还是报版本号错误,需要去修改k4a安装的cmake,应该在/usr/lib/x86_64-linux-gnu/cmake/k4a。如果是Ubuntu20.04,则需要自己从微软的k4a-dev源以及k4a-tools源下载deb包并自行dkpg -i xxx.deb
安装。
在Conda环境的ROS里用Azure Kinect就有点麻烦了,因为Conda提供的build系列工具似乎不愿意去系统的/usr/lib/x86_64-linux-gnu里找SDK的依赖……还好Azure Kinect ROS驱动提供了一种直接把SDK依赖塞进ROS包的Azure_Kinect_ROS_Driver/ext/sdk的选项。同样,先去微软的k4a-dev源以及k4a-tools源下载libk4a1.4、libk4a1.4-dev和k4a-tools_1.4.1的deb包,不要安装而是直接解压,再解压里面的data压缩包,可以得到一个usr文件夹。k4a-tools的usr/bin直接丢进ext/sdk/bin;libk4a1.4里,usr/share直接丢进ext/sdk/share,usr/lib/x86_64-linux-gnu里的所有文件包括链接放进ext/sdk/lib;libk4a1.4-dev里,usr/include直接丢进ext/sdk/include,usr/lib/x86_64-linux-gnu里的cmake放进ext/sdk/lib。同时,把cmake里的k4a/k4aTargets.cmake和k4arecord/k4arecordTargets.cmake的第58行都注释掉。然后应该就可以在Conda ROS环境中构建Azure Kinect的ROS驱动了。
使用Azure Kinect的ROS驱动前,需要安装几个ROS依赖:mamba install ros-noetic-image-geometry ros-noetic-camera-info-manager ros-noetic-rgbd-launch -c robostack-staging
。