目录
背景介绍
公司项目需要使用到ROS kinetic,这个版本的ROS只有在Ubuntu16.04,而我的Ubuntu版本是18.04。
前后试过多种方法,
1. apt-get install ros-desktop-full=kinetic的方式不行
E: Version 'kinetic' for 'ros-desktop-full' was not found
2. 在Ubuntu16.04中安装好ROS 然后将/opt/ros/拷贝到 Ubuntu18.04中,折腾了好久,编译的时后总是有错误。
环境准备
经过前面的折腾,最后想到使用docker抓一个ubuntu16.04的镜像,
docker pull ubuntu:16.04
然后在镜像中安装ROS,docker的安装步骤这里不做赘述,其他博文有很多介绍。
并在ubuntu 16.04镜像中进行如下操作:
- 按照网上关于国内安装ROS的方法,将ROS安装好。
- 安装openssh,用于原本的Ubuntu1804访问ubuntu16.04镜像。
- 创建用户,如admin。
- 在admin的home路径下创建catkin_ws路径
最后保存镜像为ros-kinetic
创建容器,使其支持ssh服务,并且把容器中22端口映射到主机的10022端口上,方便主机可以通过ssh访问容器。
$ docker run -tid -p 10022:22 ros-kinetic:1.0 "/usr/sbin/sshd -D"
查看容器和启动已创建的容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47273db077f6 ros-agent:1.1.2 "/usr/sbin/sshd -D" 3 months ago Exited (0) 8 minutes ago intelligent_shannon
$ docker start 47
47
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47273db077f6 ros-agent:1.1.2 "/usr/sbin/sshd -D" 3 months ago Up 12 seconds 0.0.0.0:10022->22/tcp intelligent_shannon
$
- 运行docker ps 如果没有任何容器在运行, 则打印的内容中CONTAINER ID 下没有任何容器id,反之, 会有一个较长的十六进制容器id排列到CONTAINER ID之下
- 通过docker ps -a查看已经创建的容器,并记下容器的id用于启动
- 通过docker start 47 启动 容器id为47273db077f6的容器,这个容器正是用于构建ROS工程的。使用docker start指令后面不需要输入完整的id,只需要输入足够区分其他容器的id即可,如果所有容器中,还有另一个容器id为47开头的,那么在docker start 指令后就需要更长的,足以定义所需要启动容器的id号。
- 容器启动完成后,可以再输入以下docker ps 用以确保所需要的容器已经启动
- 如果想要停止这个ROS构建容器,输入docker stop 47即可停止容器id为47273db077f6的容器。
开始ROS包的开发
在容器中创建一个ROS工程
控制台进入到容器,并在~/catkin_ws/src目录中创建一个ros工程
$ ssh admin@localhost -p 10022
admin@localhost's password:
admin@47273db077f6:~/catkin_ws/src$ cd ~/catkin_ws/src
admin@47273db077f6:~/catkin_ws/src$ catkin_create_pkg demo_pkg roscpp rospy
Created file demo_pkg/package.xml
Created file demo_pkg/CMakeLists.txt
Created folder demo_pkg/include/demo_pkg
Created folder demo_pkg/src
Successfully created files in ~/catkin_ws/src/demo_pkg. Please adjust the values in package.xml.
admin@47273db077f6:~/catkin_ws/src$ ls
demo_pkg
admin@47273db077f6:~/catkin_ws/src$
把在容器中创建的工程移动到本机环境中
flvd@Desktop ~$ cd ~/workspace/catkin_ws/src
flvd@Desktop ~/workspace/catkin_ws/src$ docker cp 47:/home/admin/catkin_ws/src/demo_pkg ./
flvd@Desktop ~/workspace/catkin_ws/src$ ls
demo_pkg
flvd@Desktop ~/workspace/catkin_ws/src$
移动完成后,使用Clion打开移动好的工程。
Clion配置
- 打开Clion设置中心
- 为docker容器新创建一个RemoteHost 工具链
- 配置ssh登录,端口与docker容器映射的端口相同,10022。用户名和密码是容器中的用户名及其密码,都为admin
- 配置没有问题的话,工具链可以解析到cmake等工具链
配置Clion的编译和代码解析
- 如果碰到可以正常编译但是不能解析符号或打不开头文件等问题,此时需要刷新以下Clion的镜像文件夹,具体操作:Tools->Resync with Remote Hosts
- 针对ROS的工程,需要在CMake工程编译配置中加入配置参数-DCATKIN_DEVEL_PREFIX=/home/admin/catkin_ws/devel
Clion做了什么?
Clion做了2次映射:
- 把本地的CMake工程映射到远程服务器的/tmp/下,如演示中的demo_pkg工程目录被映射到docker中的/tmp/demo_pkg
- 把本工程在编译过程中产生的头文件依赖从docker容器文件系统中映射到Clion镜像文件夹,位置在 ~/.CLion2019.3/system/.remote/localhost_10022/dd5ef722-178d-4eaa-8ea2-263470ecfb76/这里,在.remote后的路径,对于具体工程会有变化。(注:对于Windows,镜像文件夹的位置在C:/Users/BZL/.CLion2019.3/system/.remote/localhost_10022/dd5ef722-178d-4eaa-8ea2-263470ecfb76)
admin@47273db077f6:/tmp$ cd demo_pkg/
admin@47273db077f6:/tmp/demo_pkg$ ls
CMakeLists.txt cmake-build-debug cmake-build-debug-docker package.xml src
admin@47273db077f6:/tmp/demo_pkg$
每当我们在Clion中对原工程进行编辑或修改,Clion都会将变更的目录和文件上传到docker映射的目录中。
其他注意事项
- 以后每次重启计算机之后,docker中用于编译的环境需要重新启动,否则Clion在打开工程的时候会出现CMake executable not found的问题。