智能雲機器人初探1-docker的ROS容器對實體的turtlebot的控制

docker中的ROS容器對實體的turtlebot的控制

在智能雲服務機器人的研究中,結合DOCKER容器技術是一個研究方向之一,本文闡述了利用容器技術進行一個線下機器人的基本控制方法。

一、概述

閱讀本文之前,建議先閱讀之前在仿真條件下做的turtlebot_sim的控制,本文的工作是基於仿真工作的基礎進行的。之前,實體的turtlebot機器人未成功,主要是因爲相應的package缺少,在docker的鏡像這並未給出。

 package(功能包)是ROS中軟件組織的基本形式,一個功能包具有最小的結構和最小的內容,用於創建ROS程序。它可以運行包含RIS運行的進程(節點)、配置文件等。

實際上,完整版的ROS系統大概 341 個package,詳見“/opt/ros/indigo/share/“,但是ROS鏡像中只包含了150左右的package,因此有很多的功能僅僅用DOCKER官方給的簡單版的鏡像是不能實現的。

二、嘗試過的方法

爲了解決這個問題,嘗試過以下幾個覺得可行性方法:
(1)直接在容器內部進行package的安裝,failed。因爲,在進行ROS容器的啓用之前就改變了ROS容器的網絡結構,不是用的默認docker0網橋,而是自定義的網橋,並且對自定義的網橋進行了配置,詳細見:在仿真條件下做了turtlebot_sim的控制
(2)利用Docker的Volume數據卷共享機制,使ROS容器與本地共享package,failed。因爲,雖然可以在容器內部“發現“這些共享包,單與本地共享的package功能包是由本地編譯生成的,依賴的還是本地環境,即使重新編譯,重新編譯的命令比如catkin_make在容器內部也缺失。
(3)在Docker hub 官網給的簡單版的ROS鏡像基礎上,重新制作包含完整版的功能包package的ROS的鏡像,並用製作的鏡像進行實驗,Succeed

三、解決辦法

如概述中所說,本文所提出的辦法是在之前仿真辦法的基礎上,建議連着看。

3.1 簡要回顧仿真的turtlebot的控制步驟:

3.1.1 將Docker中的ROS容器配置到本地網絡中;

3.1.2 檢查驗證配置網絡是否正確;

3.1.3 開啓turtlebot_sim仿真節點進行測試。

3.2 重新制作ROS鏡像

3.2.1 重新編寫Dockerfile,利用Dockerfile的內容build鏡像。

根據之前未能在容器內部控制的原因,主要就是要重新build的鏡像中需要加入完整的功能包,與完整版相比,大概還少200個功能包左右。
其實就是在原來的build鏡像的Dockerfile裏多加上這些功能包即可,但是我們又不太好一次性區分哪些在簡單版的鏡像中有哪些沒有,所以直接把所有的功能包安裝341個命令都寫入,一個個寫雖然二三十分鐘就可以弄完,但總覺得這種方式太過蠻力,還好只有幾百個,如果是上千上萬個就顯得不太好。
於是,寫了一小段python代碼進行處理生成需要的幾百條命令:

python代碼

import os

def GetDirList(dir, dirlist):
    newDir=dir
    number=0
    from string import maketrans
    #定義轉化表,下載的命令包和讀取的本地的包文件名需要把'_'轉爲'-'
    table =maketrans('_','-')
    if os.path.isdir(dir):
        for s in os.listdir(dir): #遍歷指定目錄
           # 生成添加到Dockerfile的命令
           newDir=' ros-indigo-'+s.translate(table)+' \\'
           number=number+1
           dirlist.append(newDir)
    print number
    return dirlist

#指定從本地目錄'/opt/ros/indigo/share/',功能包都在這個目錄
list = GetDirList('/opt/ros/indigo/share/', [])
for e in list:
    print e #把需要添加到Dockerfile的命令打印到控制檯,直接拷貝

原Dockerfile:
注:
此處原Dockerfile的基礎鏡像指定的是“ros:indigo-robot“,對於此鏡像的描述,可以看看官網描述

FROM ros:indigo-robot

WORKDIR /notebooks

RUN sed -i "s|http://archive.ubuntu.com|http://mirrors.163.com|g" /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get -y update && apt-get install -y \ 
    pkg-config \
    python-dev \ 
    python-opencv \ 
    libopencv-dev \ 
    libav-tools  \ 
    libjpeg-dev \ 
    libpng-dev \ 
    libtiff-dev \ 
    libjasper-dev \ 
    python-numpy \ 
    python-pycurl \ 
    python-opencv \
   #在這裏把上面由python代碼生成的341條命令拷貝到這裏

3.3 使用新鏡像生成容器

使用基於新鏡像生成的容器。

$ sudo docker run -idt --name=<指定容器名> --net=none <新鏡像的名稱> /bin/bash

接下來的操作把這裏在仿真的操作完成一遍即可,
http://blog.csdn.net/chenming_hnu/article/details/61648071

四、實驗驗證

4.1 開啓turtlebot實體機器人,運行真機環境

實操運行步驟參考官網:
http://wiki.ros.org/Robots/TurtleBot/

4.2 在容器內部運行控制命令

4.2.1 注意每開啓一個容器窗口,需要source 一下容器環境

$ source /etc/profile
$ source /opt/ros/indigo/setup.bash

開啓另外的新容器窗口時,不要用attach命令,用exec命令。

4.2.2容器內運行使用鍵盤控制的命令

root@50ed97b4ce5c:/notebooks# roslaunch turtlebot_teleop keyboard_teleop.launch 

4.3 實驗圖片

4.3.1基於新鏡像的ROS容器的圖片:

當在鍵盤上用按鍵進行控制的時候,Turtlebot會運動。
這裏寫圖片描述

4.3.2 實體的turtlebot實驗圖片

電腦屏幕的左邊命令框爲開啓Turtlebot, Kinect的命令;右邊爲Kinect採集的圖像,黃圈爲圖像特徵點。
這裏寫圖片描述
這裏寫圖片描述

五、小結

5.1 容器網絡的配置方式需要改進

目前這種辦法對於多個容器的配置是有問題的。當前的方式是通過用容器借用主機網卡eth0的方式進行通訊,但是當需要類似的多個容器的時候,就會遇到問題了。

5.2 由局域網-》廣域網

當前的 Docker容器的宿主機與Turtlebot機器是特意配置在同一個局域網 192.168.1.1/24內。但是,要使雲機器人的研究具有普適性,是要擴展到更大範圍的網絡。並且,Docker容器宿主機應該由專業服務器進行承擔,這樣纔可以處理大規模的分佈式機器人的複雜任務的處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章