2017年8月22日 星期二

YOLO (You Only Look Once) - 安裝與測試

YOLO (You Only Look Once)

Install YOLO

1. Download Darknet

$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet

2. Modify System Setting

$ vim Makefile
GPU=1
OPENCV=1

3. Make & Test

$ make
$ ./darknet imtest data/eagle.jpg
如果安裝成功應該可以看到如下的圖片

Detect Using a Pre-Trained Model

1. Download pre-trained model

下載YOLO模形預先訓練好的權重。
$ wget https://pjreddie.com/media/files/yolo.weights

2. Run YOLO with pre-trained model

執行darknet測試YOLO模形。

$ ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
其中detect為簡略的寫法,等同於以下寫法:
$ ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg
yolo.cfg:定義yolo的模形。
yolo.weights:模形中訓練完成的權重
coco.data:分類完之後代表的labels

3. 執行結果如下

layer     filters    size    input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32
    1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  32
    2 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64    
......
   27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024
   30 conv    425  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 425
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolo.weights...Done!
data/dog.jpg: Predicted in 0.737670 seconds.
dog: 82%
truck: 65%
bicycle: 85%


Real-Time Detection on a Webcam

將原本的test設定改為demo,YOLO便會改為以camera作為影像輸入。
$ ./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

Tiny YOLO

雖然目前YOLO能夠取得不錯的辨識結果,但是對於TX2平台的運算能力,仍然是一件相當沉重的負擔。
因此也可以考慮改為使用Tiny YOLO,雖然辨識度會略為降低,但卻能大大提升運算速度。

1. Download tiny YOLO weights

下載Tiny YOLO模形預先訓練好的權重。

$ wget https://pjreddie.com/media/files/tiny-yolo-voc.weights

2. 執行Tiny YOLO測試

$ ./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights data/dog.jpg
其中,除了需要改為使用tiny-yolo-voc.weight權重外。
由於Tiny YOLO改以VOC dataset作訓練(該dataset中僅有20種圖像data),需要改為使用voc.data。並且需要將原本YOLO模形改為tiny-yolo-voc.cfg模形。

3. Tiny YOLO執行結果

layer     filters    size              input                output
    0 conv     16  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  16
    1 max          2 x 2 / 2   416 x 416 x  16   ->   208 x 208 x  16
    2 conv     32  3 x 3 / 1   208 x 208 x  16   ->   208 x 208 x  32
    ......
   13 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024
   14 conv    125  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 125
   15 detection
mask_scale: Using default '1.000000'
Loading weights from tiny-yolo-voc.weights...Done!
data/dog.jpg: Predicted in 0.196784 seconds.
car: 34%
car: 55%
dog: 78%
bicycle: 29%



參考資料:
1. YOLO(darknet)Installation
2. YOLO官網 - demo

Jetson TX2 + ROS + Kinect2配置



Setup Kinect 2 for Unbuntu

Kinect在Ubuntu系統下開發,首先必須要先確認使用的設備是Kinect V1還是V2,這兩個的驅動是不能通用的。
本文針對的是Kinect V2的情況。

首先,針對Kinect V2在Linux下操作,必須要先安裝 libfreenect2 功能包,操作如下
(以下預設為Ubuntu14.04或以上之版本,本文使用ubuntu 16.0 LTS版本)

libfreenect2 

  • 下载 libfreenect2 源码
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2
  • 下载upgrade deb 文件
cd depends; ./download_debs_trusty.sh
  • 安装编译工具
sudo apt-get install build-essential cmake pkg-config
  • 1
  • 1
  • 安装 libusb. 版本需求 >= 1.0.20.
sudo dpkg -i debs/libusb*deb
  • 1
  • 1
  • 安装 TurboJPEG (可选)
sudo apt-get install libturbojpeg libjpeg-turbo8-dev
  • 1
  • 1
  • 安装 OpenGL (可选)
sudo dpkg -i debs/libglfw3*deb
sudo apt-get install -f
sudo apt-get install libgl1-mesa-dri-lts-vivid
  • 安装 OpenNI2 (可选)
sudo apt-add-repository ppa:deb-rob/ros-trusty && sudo apt-get update
sudo apt-get install libopenni2-dev


  • Build
cd ..
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2 -DENABLE_CXX11=ON
make
make install

針對上面cmake命令的說明,第一個參數,是特別指定的安裝位置,你也可以自行指定別的喜歡的地方,但一般的標準路徑為上述路徑或者/usr/local。第二個參數是增加C++11的支援。
  • 設定udev rules: 
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
然后重新插拔Kinect2。
  • 一切搞定, 现在可以尝试运行Demo程序: 
./bin/Protonect

不出意外的話,應該就能看到RGB影像及深度影像畫面。
(Example的畫面應該將rgb <-> bgr影像通道設定錯了,所以可以看到畫面中紅色與藍色相反)

iai-kinect2

要在ROS環境中要使用Kinect V2,需要再安裝 iai-kinect2 功能包。

iai-kinect2 功能包可以從Github上面下载程式到工作空間內的src文件夹内:
cd ~/catkin_ws/src/git clone https://github.com/code-iai/iai_kinect2.git
cd iai_kinect2
rosdep install -r --from-paths .
cd ~/catkin_ws
catkin_make -DCMAKE_BUILD_TYPE="Release"

編譯完成之後,要再將路徑加入對應的source目錄中,執行以下
source ~/catkin_ws/devel/setup.bash

或是寫入~/.bashrc對應的檔案中即可。

並使用以下指令進行測試:
$ roslaunch kinect2_bridge kinect2_bridge.launch
$ rosrun kinect2_viewer kinect2_viewer



ps. 若是Kinect2裝置不穩定時,可以擴充USB的緩衝空間試試看 sudo sh -c 'echo 256 > /sys/module/usbcore/parameters/usbfs_memory_mb'


參考資料
ROS下Kinect2的驱动安装及简单应用
KinectV2+Ubuntu 14.04+Ros 安装教程

2017年7月25日 星期二

NVIDIA TX1/TX2 學習筆記 - JetPack3.0 刷機

簡介
NVIDIA® Jetson™ TX2 是一台超高性能、低功耗的超級電腦模組,為機器人、無人機到企業協作終端裝置和智慧攝影機等裝置提供極快速與精準的人工智慧推論機制。

與功能強大的前身 Jetson TX1 相比,Jetson TX2 具備兩倍的運算效能卻只有一半的功耗。接近信用卡尺寸、約 7.5 瓦功耗的模組中,Jetson TX2 可為智慧城市、智慧工廠、機器人以及製造原型等裝置應用提供了絕佳的性能和準確性。

為了讓開發者快速上手,Jetson TX2 預先搭載了 JetPack 3.0 - 人工智慧運算和複雜多緒處理嵌入式應用開發最全面的 SDK。開發者可以在雲端、資料中心或是個人電腦上使用最新的 NVIDIA DIGITS™ 5.0 介面訓練深度學習模型,然後運用 JetPack 最新版本搭載的高性能推理引擎 TensorRT™ 1.0 將訓練完成的模型部署到 Jetson TX2。



TX2內部結構如下:



Jetson TX1/TX2 JetPack3.0刷機過程

於TX2上進行刷機的過程與TX1上大致相同,可參考以下連結操作。
Jetson TX1开发笔记(一):开机设置与刷机

在這邊我使用的是NVIDIA TX2,並搭配第三方(Connect Tech)的Carrier Board (Orbitty),如下圖。

TX2出廠時,已經自帶了Ubuntu 16.04,可以直接啟動。但一般我們還是會重新刷機,目的是更新到最新的JetPack L4T,並自動安裝最新的驅動、CUDA Toolkit、cuDNN、TensorRT。

刷機前須注意以下幾點:

1. Host也需要安裝Ubuntu,且至少預留 15 GB 硬碟空間。
2. 不要用 root 執行JetPack-${VERSION}.run,我使用的是JetPack-L4T-3.1-linux-x64.run
3. TX2需要進入Recovery Mode,進入方式參考說明書步驟
4. 刷機時間大概需要 1~2 小時,會格式化eMMC,並安裝部分必要元件

另外在刷機的過程中,有再遇到幾個問題,花了些在尋找答案...


1. 虛擬機器USB Port問題

由於Host端需要在Linux環境下才能進行刷機,若是使用虛擬機器 (VirtualBox)的話,
則需要注意連接到TX2 Micro USB的USB Port,必須要與TX2一致為USB 2.0。



2. TX2刷機失敗 (Boot Rom communication failed)

一開始照著上述的TX1刷機的方式執行,
這次在TX2上卻會顯示Boot ROM Communication Failed的錯誤訊息。

最後在網上搜尋了一番之後,並沒有找到在VirtualBox上的解決方法。
卻看到有人使用VMware成功了,就決定來試試看。不然就只能放棄虛擬機器,去搞台Linux電腦來刷機了。

還好最後VMware刷機成功了!
使用虛擬機器的好處就是,可以透過簡單的匯出匯入功能,將原本的系統直接轉為OVA格式就可以互通。

附上中間測試時找到的,手動執行刷機命令的連結,有興趣的人可以看一下。
Jetson TX2 not recognized installation inside docker error 8 Error


3. Connect Tech - Orbitty Carrier Package

但在刷機完成並開機進入系統之後才發現,USB2.0 / USB3.0 port竟然都不會動!!
並且整個USB Port也沒有供電,推測可能與hardware pin腳設定有關。

後來到Carrier Board的官網上查詢,發現這是Carrier Board設定的問題。
按照TX2原本的刷機過程,應該只有支援NVIDIA提供的開發版;若是使用第三方的開發版,則需要再去確認是否相容。

因此在參考廠商提供的操作步驟下,安裝support package,並選擇該開發版的設定檔手動進行刷機即可。
Orbitty Carrier Board Support Package Installation

刷機步驟為:
1. 先按照JetPack步驟安裝,但不要執行最後刷機的動作
2. 下載Orbitty Carrier Board Support Package,並解壓縮安裝
   $ <install_dir>/64_TX1/Linux_for_Tegra_tx1/
   $ cd <install_dir>/64_TX1/Linux_for_Tegra_tx1/
   $ tar -xzf CTI-L4T-V0XX.tgz
   $ sudo ./install.sh
   $ cd ..

3. 單獨執行刷機指令,刷機成功後即可成功進入TX2系統
   $ ./flash.sh orbitty mmcblk0p1

4. 執行JetPack package安裝,並將Target端Linux系統取消勾選,避免重複刷機。


4. TX2 Example Test (OceanFFT)

刷機成功之後當然要來測試一下是否成功啦!
參考其他大神們說明,這邊使用範例OceanFFT來進行測試。

直接在TX2中進入到範例程式下執行:
$ cd ~/NVIDIA_CUDA-8.0_Samples/5_Simulations/oceanFFT/ 
$ ./oceanFFT


若是看到漂亮的海浪模擬畫面,則代表Cuda安裝成功。



5. TX2 Example Cross Compiling Test (OceanFFT)

Cuda安裝成功之後,接著就要來測試開發工具了。

如果我們在主機中安裝了JetPack工具包之後,JetPack會自動將開發環境Nsight Eclipse Edition安裝在我們的主機(host)中。

一般來說,針對嵌入式平台的開發有兩種編譯模式:原生編譯和交叉編譯。
原生編譯就是直接在嵌入式平台上編譯程式並運行,而交叉編譯就是在個人電腦等主機端平台上編譯程式,然後再載入到嵌入式平台上運行。

在此,我們參考以下博主的方法,使用交叉編譯的方式來開發Jetson TX2。
Jetson TX1开发笔记(三):开发利器-Nsight Eclipse Edition


6. OceanFFT Cross Compiling Error

透過以上的方式,在TX1上能夠順利地執行。但在TX2上編譯時卻會顯示以下的錯誤訊息。
"error: reference to glClientActiveTexture is ambiguous"


在網路上爬文了一下之後找到,原來是要修改Cuda的Library程式 (helper_gl.h中,第105行)。
JetPack - Compiling oceanFFT on TX2

in     /usr/local/cuda-8.0/samples/common/inc/helper_gl.h
line105: --- #if !defined(GLX_EXTENSION_NAME) || defined(__arm__) || defined(__aarch64__)
line105: +++ #if !defined(GLX_EXTENSION_NAME) || !defined(GL_VERSION_1_3)



並且要注意的是,由於是使用交叉編譯(Cross Compiling)。
在Device端 (Jetson TX2)上的helper_gl.h也需要進行修改,不然一樣會遇到錯誤。

修改完成之後,終於算是在NVIDIA TX2開發上跨出第一步了!


參考資料:
ROS学习1_nvidia Jetson TX2 配置与安装 ROS
車輛辨識範例 /tegra_multimedia_api/sample/backend
Jetson TX1開發筆記(四):使用Caffe對攝影機視頻流中的目標進行辨識
Jetson TX2深度學習Inference初體驗
github - letson-inference 行人偵測
Jetson TX2 初体验


ps.補充一下:
目前在使用此Orbitty Carrier Board上,有遇到以下幾項狀況。
如果有要使用這片載板的話,可以參考一下。但畢竟體積小很多,整體來說還算好用。

1. 僅具備一組USB Port,在測試時可能會遇到一些麻煩。但若使用USB hub,又可能會遇到供電或傳輸不穩定的狀況。

2. 接收WIFI訊號能力較弱,有時候無法偵測到環境中的WIFI訊號或無法連線。




2017年6月6日 星期二

ROS筆記 - 機器人模型URDF

  URDF (Unified Robot Description Format) - 統一機器人描述格式, 是一種特殊的XML文件格式,用來描述機器人的模型。

1. URDF語法規範

參考:XML specifications

2. URDF教程

      1. 使用URDF建立機器人模型
          了解如何構建可在Rviz中查看的機器人的可視化模型
      
      2. 建立可移動的URDF機器人模型
          了解如何在URDF中定義可移動關節

      3. 在URDF模型中加入碰撞與物理屬性
          了解如何加入關節碰撞與慣性特性,以及關節動學特性(friction, damping)

      4. 使用Xacro整理URDF文件
          了解如何Xacro精簡URDF文件內容

3. 建立URDF文件 


3.1 link 和 joint
  在URDF中,機器人主要結構透過link和joint來表示。link定義實際機器人的機構件,而前後link(parent link, child link)之間使用joint做連接,並可再設定joint的運動方式(fixed, revolute, contunuous...)。link與joint的位置關係是透過前後之間的相對位置來定義,child link的中心位置以joint的位置做為參考,joint則是相對於前一個joint(parent link的joint)的位置作參考。

  下圖為ROS URDF教學的範例,將創建一個樹狀結構的機器人模型:

3.2 基礎模型
  本節將從機器人的整體結構出發,不考慮過多的細節,可以將機器人通過如下的URDF表示:
   1 <robot name="my_robot">
   2   <link name="link1" />
   3   <link name="link2" />
   4   <link name="link3" />
   5   <link name="link4" />
   6 
   7   <joint name="joint1" type="continuous">
   8     <parent link="link1"/>
   9     <child link="link2"/>
  10   </joint>
  11 
  12   <joint name="joint2" type="continuous">
  13     <parent link="link1"/>
  14     <child link="link3"/>
  15   </joint>
  16 
  17   <joint name="joint3" type="continuous">
  18     <parent link="link3"/>
  19     <child link="link4"/>
  20   </joint>
  21 </robot>

設定完畢後,ROS為用戶提供了一個檢查URDF語法的工具
$ check_urdf my_robot.urdf

如果一切正常,將會顯示如下:
robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: link1 has 2 child(ren)
    child(1):  link2
    child(2):  link3
        child(1):  link4

3.3 設定link參數
  接著定義機器人機構件(link)的參數,在link中可以分成設定機構件的外觀、碰撞、慣性等項目,並分別設定機構外型<geometry> (box/cylinder/mesh等)、偏移量<origin xyz> (公尺)、旋轉量<origin rpy> (徑度)等參數。選擇自己需要的項目設定即可。
   1  <link name="my_link">
   2    <inertial>
   3      <origin xyz="0 0 0.5" rpy="0 0 0"/>
   4      <mass value="1"/>
   5      <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
   6    </inertial>
   7 
   8    <visual>
   9      <origin xyz="0 0 0" rpy="0 0 0" />
  10      <geometry>
  11        <box size="1 1 1" />
  12      </geometry>
  13      <material name="Cyan">
  14        <color rgba="0 1.0 1.0 1.0"/>
  15      </material>
  16    </visual>
  17 
  18    <collision>
  19      <origin xyz="0 0 0" rpy="0 0 0"/>
  20      <geometry>
  21        <cylinder radius="1" length="0.5"/>
  22      </geometry>
  23    </collision>
  24  </link>

3.4 加入joint設定
  在joint中可以設定關節的類型<joint type>、偏移量<origin>、旋轉軸<axis>、上下限<liniit lower/upper>等參數,
1 <robot name="test_robot"> 2 <link name="link1" /> 3 <link name="link2" /> 4 <link name="link3" /> 5 <link name="link4" /> 6 7 <joint name="joint1" type="fixed"> 8 <parent link="link1"/> 9 <child link="link2"/> 10 <origin xyz="5 3 0" rpy="0 0 0" /> 12 </joint> 13 14 <joint name="joint2" type="continuous"> 15 <parent link="link1"/> 16 <child link="link3"/> 17 <origin xyz="-2 5 0" rpy="0 0 1.57" /> 18 <axis xyz="-0.707 0.707 0" /> 19 </joint> 20 21 <joint name="joint3" type="revolute"> 22 <parent link="link3"/> 23 <child link="link4"/> 24 <origin xyz="5 0 0" rpy="0 0 -1.57" /> 25 <axis xyz="0.707 -0.707 0" /> 26 <limit effort="300" lower="-2.617" upper="1.983" velocity="1"/> 28 </joint> 29 </robot>

3.5 顯示URDF圖形
  設定完成之後,可以呼叫urdf_tutorial中提供的display.launch開啟rviz的3D模型,確認是否設定正確
$ roslaunch urdf_tutorial display.launch model:=/home/seven/dev/rosbook/seven_moveit_config/urdf/RCK100.urdf

3.6 載入mesh模型
  在URDF <geometry>中,除了使用預設的幾何圖形外,亦可載入3D模型圖像


參考資料
<ROS> 機器人描述--URDF和XACRO

2017年5月24日 星期三

ROS - MoveIt 快速搭建機器人運動規劃平台

  MoveIt是由ROS中一系列運動操作的功能包组成,包含運動規劃、操作控制、3D感知、運動學、碰撞檢測等等,並包含GUI控制介面。另外,MoveIt官網上還有相當詳細的教學與API說明。
  MoveIt官網:http://moveit.ros.org/


MoveIt架構

下圖是MoveIt的系統架構圖


move_group是MoveIt的核心部分,可以綜合機器人的各獨立組件,為用戶提供一系列需要的動作指令和服務。從架構圖中我們可以看到,move_group類似於一個積分器,本身並不具備豐富的功能,主要做各功能包、插件的集成。它通過消息或服務的形式接收機器人上傳的點雲信息、joints的狀態消息,還有機器人的tf tree,另外還需要ROS的參數服務器提供機器人的運動學參數,這些參數會在使用setup assistant的過程中根據機器人的URDF模型文件,創建生成(SRDF和配置文件)。

一、安裝

sudo apt-get install ros-kinetic-moveit
 以下將使用《master ros for robotics programming》的案例進行學習,tutorial source code如下
git clone https://github.com/qboticslabs/mastering_ros.git

二、Setup Assistant Tutorial

1. To start the MoveIt Setup Assistant:
roslaunch moveit_setup_assistant setup_assistant.launch

開啟MoveIt Setup Assistant」之後,選擇「Create New MoveIt Configuration Package」建立新的Configuration Package。

這裡有兩個選擇,一個是新建一個配置功能包,一個是使用已有的配置功能包。這裡我們選擇新建配置功能包,並在程式碼中找到urdf文件(seven_dof_arm.urdf)。如果已有配置功能包,那麼新建後會覆蓋原有的文件。

2. Generate Self-Collision Matrix
然後點擊左側的第二項配置步驟,配置自碰撞矩陣,MoveIt!可以讓我們設置一定數量的隨機採樣點,根據這些點生成配裝參數,可想而知,過多的點會造成運算速度慢,過少的點會導致參數不完善,默認的採樣點數量是10000個,官方稱經過實踐,要獲得不錯的效果,10000是最低要求,我們就按照這個預設值生成碰撞矩陣。

3. Add Virtual Joints
虛擬關節主要是用來描述機器人在world坐標系下的位置,如果機器人是移動的,虛擬關節可以與移動基座關聯,不過一般的機械臂都是固定不動的,所以也可以不需要虛擬關節。

4. Add Planning Groups
Planning Group用於描述機器人的不同部分,例如定義手臂或末端夾具部分。這一步可以將機器人的多個組成部分(links,joints)集成到一個Planning Group當中。之後Motion Planning會針對個別的Planning Group完成運動規劃,在規劃的過程中還可以選擇運動學解析器( kinematic solver)。

這裡創建兩個組,一個是機械臂部分(arm),一個是夾具部分(gripper)。

5. Add Robot Poses
Setup Assistant允許在配置中添加某些固定的姿勢(Pose),例如機器人的零點位置(Home)、初始位置等等,當然這些位置是用戶根據場景自定義的,不一定要和機器人本身的零點位置、初始位置相同。這樣做的好處就是我們使用MoveIt的API時,可以直接調用這些位置。

6. Label End Effectors
在添加了夾具的Planning Group之後,將這些群組指定為end-effectors可以在內部進行一些特殊操作。

7. Add Passive Joints
機器人上的某些關節可能在規劃控制的過程中不會使用到,可以先宣告出來。這裡沒有就不用管了。

8. Generate Configuration Files
最後一步,生成配置文件。一般會取名[robot_name]_moveit_config。這裡,會提示覆蓋已有的配置文件。

MotionPlanning

在完成配置之後即可退出 Setup Assistant,接著執行「demo.launch」看看:
$ roslaunch seven_moveit_config/launch/demo.launch


*若是要執行Motion Planning的話,還需要再執行「move_group.launch」,導入Planning Library:
$ roslaunch seven_moveit_config/launch/move_group.launch
  
這個介面是在rviz的基礎上加入了MoveIt Plugin,通過左下角的Plugin,我們可以選擇機械手臂的目標位置,進行運動規劃。或者拖動機械臂的前端,也可以改變機械臂的姿態。
在規劃頁面點擊「Plan and Execute」,MoveIt即會開始路徑規劃,並且可以看到機械臂開始向目標位置移動!


參考資料:
ROS MoveIt - tutorials
古月居 ROS探索总结—MoveIt基础
运动规划 (Motion Planning): MoveIt! 与 OMPL


apt-get update異常處理

1. 問題描述 系統環境:Ubuntu 18.04.3 LTS 執行apt-get update更新時遇到如下狀況 錯誤訊息: Err:1 http://security.ubuntu.com/ubuntu bionic-security InRe...