Ubuntu18.04 使用Clion在docker中开发ROS kinetic(Ubuntu1604)问题记录

目录

 

背景介绍

环境准备

查看容器和启动已创建的容器

在容器中创建一个ROS工程

把在容器中创建的工程移动到本机环境中

Clion打开移动好的工程

Clion配置

注意事项


背景介绍

公司项目需要使用到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

$
  1. 运行docker ps 如果没有任何容器在运行, 则打印的内容中CONTAINER ID 下没有任何容器id,反之, 会有一个较长的十六进制容器id排列到CONTAINER ID之下
  2. 通过docker ps -a查看已经创建的容器,并记下容器的id用于启动
  3. 通过docker start 47 启动 容器id为47273db077f6的容器,这个容器正是用于构建ROS工程的。使用docker start指令后面不需要输入完整的id,只需要输入足够区分其他容器的id即可,如果所有容器中,还有另一个容器id为47开头的,那么在docker start 指令后就需要更长的,足以定义所需要启动容器的id号。
  4. 容器启动完成后,可以再输入以下docker ps 用以确保所需要的容器已经启动
  5. 如果想要停止这个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配置

  1. 打开Clion设置中心
  2. 为docker容器新创建一个RemoteHost 工具链
  3. 配置ssh登录,端口与docker容器映射的端口相同,10022。用户名和密码是容器中的用户名及其密码,都为admin
  4. 配置没有问题的话,工具链可以解析到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的问题。

  •  
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值