Hanjie's Blog

一只有理想的羊驼

环境

  • 系统: Ubuntu 16.04.4 LTS
  • 内核: 4.13.0-36-generic
  • CUDA: 9.0.176
  • 显卡: 940mx
  • 显卡驱动: 384.13
  • GCC: 5.4.0
  • python: 2.7.12

Dependences

1
2
3
sudo apt-get install python-pip python-dev python3-pip python3-dev cuds-command-line-tools

sudo pip install testresources enum34 mock
1
sudo edit ~/.bashrc

添加:

1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64

刷新:

1
source ~/.bashrc

安装CUDA 9.0

官网下载CUDA cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb。

注意,使用.run文件安装cuda的话,在安装TensorRT时会发生错误!

1
2
3
4
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

重启,配置环境:

1
sudo edit ~/.bashrc

添加:

1
2
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

刷新:

1
source ~/.bashrc

重启:

1
2
3
4
5
6
nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuba compilation tools, release 9.0, V9.0.176
1
2
3
4
dpkg-query -W | grep cuda-cubla

cuda-cublas-9-0 9.0.176-1
cuda-cublas-dev-9-0 9.0.176-1
Building Samples (optional)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cd /NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery
make
./deviceQuery

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce 940MX"
CUDA Driver Version / Runtime Version 9.0 / 9.0
CUDA Capability Major/Minor version number: 5.0
Total amount of global memory: 2003 Mbytes (2100232192 bytes)
( 3) Multiprocessors, (128) CUDA Cores/MP: 384 CUDA Cores
GPU Max Clock rate: 1242 MHz (1.24 GHz)
Memory Clock rate: 1001 Mhz
Memory Bus Width: 64-bit
L2 Cache Size: 1048576 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Supports Cooperative Kernel Launch: No
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 2 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.0, CUDA Runtime Version = 9.0, NumDevs = 1
Result = PASS

cuDNN

下载cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0:

  • cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
  • cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
  • cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)

Navigate to your directory containing cuDNN Deb file:

1
2
3
sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb 
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.1.4.18-1+cuda9.0_amd64.deb
Verifying
1
2
3
4
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN
1
2
3
4
5
6
7
8
9
cudnnGetVersion() : 7005 , CUDNN_VERSION from cudnn.h : 7005 (7.0.5)
Host compiler version : GCC 5.4.0
There are 1 CUDA capable devices on your machine :
device 0 : sms 3 Capabilities 5.0, SmClock 1241.5 Mhz, MemSize (Mb) 2002, MemClock 1001.0 Mhz, Ecc=0, boardGroupID=0
Using device 0

...

Test passed!

NVIDIA TensorRT 3.0.4(optional)

官网下载nv-tensorrt-repo-ubuntu1604-ga-cuda9.0-trt3.0.4-20180208_1-1_amd64.deb1

1
2
3
4
5
6
7
sudo dpkg -i nv-tensorrt-repo-ubuntu1604-ga-cuda9.0-trt3.0.4-20180208_1-1_amd64.deb
sudo apt-get update
sudo apt-get install tensorrt

sudo apt-get install python-libnvinfer-doc python-libnvinfer python-libnvinfer-dev swig3.0 # python 2.7

sudo apt-get install python3-libnvinfer-doc # python 3.5
Verifying
1
2
3
4
5
6
7
8
9
10
11
12
dpkg -l | grep TensorRT

ii libnvinfer-dev 4.0.4-1+cuda9.0 amd64 TensorRT development libraries and headers
ii libnvinfer-samples 4.0.4-1+cuda9.0 amd64 TensorRT samples and documentation
ii libnvinfer4 4.0.4-1+cuda9.0 amd64 TensorRT runtime libraries
ii python-libnvinfer 4.0.4-1+cuda9.0 amd64 Python bindings for TensorRT
ii python-libnvinfer-dev 4.0.4-1+cuda9.0 amd64 Python development package for TensorRT
ii python-libnvinfer-doc 4.0.4-1+cuda9.0 amd64 Documention and samples of python bindings for TensorRT
ii python3-libnvinfer 4.0.4-1+cuda9.0 amd64 Python 3 bindings for TensorRT
ii python3-libnvinfer-dev 4.0.4-1+cuda9.0 amd64 Python 3 development package for TensorRT
ii python3-libnvinfer-doc 4.0.4-1+cuda9.0 amd64 Documention and samples of python bindings for TensorRT
ii tensor

安装TensorFlow 1.8 2

For python 2.7

1
2
3
4
5
sudo apt-get install python-pip python-dev

pip install pip==9.0 # Don't use pip > 9.0 !!!!
sudo pip install --upgrade https://download.tensorflow.google.cn/linux/gpu/tensorflow_gpu-1.8.0-cp27-none-linux_x86_64.whl
sudo pip install --upgrade pip

For python 3.5

1
2
3
sudo apt-get install python3-pip python3-dev

sudo pip3 install --upgrade https://download.tensorflow.google.cn/linux/gpu/tensorflow_gpu-1.8.0-cp35-cp35m-linux_x86_64.whl

卸载指令: sudo pip uninstall tensorflow or sudo pip3 uninstall tensor flow

Verifying
1
python

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Python
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

config = tf.ConfigProto(allow_soft_placement=True)

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)

config.gpu_options.allow_growth = True
sess = tf.Session(config=config)

hello = tf.constant('Hello, TensorFlow!')
print(sess.run(hello))

输出:

1
Hello, TensorFlow!

罗汉杰. 一种机械臂的运动轨迹规划方法、装置及机器人:中国,201610453116[P/OL]. 2016-06-20 [2018-08-22]. https://patentimages.storage.googleapis.com/1c/c7/07/cb789c3bd3adfc/CN105922265A.pdf

Introduction

机械臂的轨迹规划程序中,程序会接受用户提供的起点,终点位置信息,然后程序会在两点之间生成一系列的插补点来描述机械臂应该运行的轨迹。

示教功能是一种可重复再现通过示教编程存储起来的作业程序的功能,是机械臂的基础功能之一。示教编程有很多种实现方式,其中一种是人工利用示教盒对机械臂发送指令,使得机械臂完成预期动作来完成动作编程。

在这些指令中,最常用的就是令机械臂一直沿某个给定的方向走直线运动,直到用户发送停止指令或者超出工作范围为止。但在示教功能中,终点位置是由用户实时决定的,所以轨迹规划程序不能将整个运动过程提前规划。由于机械臂的速度和加速度总是从零开始,然后在终点又恢复为零,所以在示教功能中,轨迹规划程序单接收到停止指令后,需要马上规划出一段平滑的减速轨迹。

在普通的轨迹规划中,大多使用简单的三次多项式插值的方法,该方法的缺点是插值出来的轨迹在加速度上不连续,使得机械臂运行时会产生震动,从而影响精度和使用寿命。 而传统的基于S型(Double S)速度规划算法所得的轨迹在加速度上连续, 所以运行时十分平稳,已经广泛使用在机床,机械臂等的轨迹规划功能上。

本文提出了一种用于示教的减速阶段的基于S型速度规划算法,令机械臂能够平稳并且迅速地停止下来。

S型(Double S)速度规划算法

下图显示了一种经典的S型速度规划的行程\(q\),速度\(v\),加速度\(a\),加速度的导数(\(jerk\))\(j\)曲线图。在S型速度规划算法中,一般会有以下假设:

\[\begin{aligned} j_{min}=-j_{max}, a_{min}=- a_{max}, v_{min}=- v_{max} \end{aligned}\]

min和max分别表示为最小值和最大值。

S型速度规划中整个行程的时间\(t\)可分为3个阶段: 1. 加速阶段:\(t∈[0,T_a ]\),在这阶段中,加速度会从0开始,以恒定的\(j_{max}\)比例线性增加到最大值然后有下降回0。 2. 匀速阶段:\(t∈[T_a,T_a+T_v]\),此阶段保持匀速。 3. 减速阶段:\(t∈[T_a+T_v,T]\),其中\(T=T_a+T_v+T_d\),此阶段是跟加速度阶段相反的减速阶段,最终加速度回到0。

其中我们定义: \(T_{j1}\):在加速阶段中,\(jerk\)保持恒定(\(j_{max}/j_{min}\))的时间段 \(T_{j2}\):在减速阶段中,\(jerk\)保持恒定(\(j_{max}/j_{min}\))的时间段 \(T_a\):加速阶段 \(T_v\):匀速阶段 \(T_d\):减速阶段 \(T\):总用时 \(a_{lim_a}\):加速阶段最大加速度 \(a_{lim_d}\):减速阶段最小加速度 \(v_{lim}\):最大速度 \(q_0\):初始行程 \(q_1\):终点行程 \(v_0\):初始速度 \(v_1\):终点速度 \(a_0\):初始加速度 \(a_1\):终点加速度

由此可知,S型速度规划的特定是能够使得机械臂平滑加速到最大运行速度,然后又平滑地减速,而且总体用时最少。在我们实际使用中,一般会令到起点和终点的速度,加速度都为0,即\(v_0=v_1=0\)\(a_0=a_1=0\),下文我们都会采用这作为默认条件以简化公式。

在进行轨迹规划前,需要计算出曲线的参数。下图为S型速度规划的参数计算流程图:

double s-w484

其中:

\[\begin{align} T_{j1}=T_{j2}=\frac{a_{max}}{j_{max}}, \quad T_a=T_d=T_{j1}+\frac{v_{max}}{a_{max}} \end{align}\]

\[\begin{align} T_{j1}= T_{j2}=\sqrt{\frac{v_{max}}{j_{max}}}, \quad T_a= T_d=2T_{j1} \end{align}\]

\[\begin{align} T_v=\frac{q_1-q_0}{v_{max}} - T_a \end{align}\]

\[\begin{align} T_v=0, \quad T_{j1}=T_{j2}=T_j=\frac{a_{max}}{j_{max}} \newline T_a=T_d=\frac{T_j}{2} + \sqrt{\frac{T_j^2}{4} + \frac{q_1-q_0}{a_{max}}} \notag \end{align}\]

\[\begin{align} T_v=0, \quad T_{j1}=T_{j2}=T_j=\sqrt[3]{\frac{q_1-q_0}{2j_{max}}}, \quad T_a=T_d=2T_j \end{align}\]

\[\begin{align} T=T_a+T_d+T_v, \quad a_{lim_a}&=j_{max}T_{j1}, \quad a_{lim_d}=-a_{lim_a} \newline v_{lim}&=(T_a-T_j1)a_{lim_a} \notag \end{align}\]

\[\begin{align} t_0=0, \quad t_1&=T_{j1}, \quad t_2=T_a-T_{j1}, \quad t_3=T_a \newline t_4=T_a+T_v, \quad t_5&=t_4+T_{j2}, \quad t_6=T_v-T_{j2}, \quad t_7=T_v \notag \end{align}\]

所以,S型速度规划算法整个流程如下:

double s2-w284

其中: \[\begin{align} q(t) &= \begin{cases} q_0+(j_{max} t^3)/6, & t∈[t_0,t_1) \newline q_0+ a_{lim_a}(3t^3-3T_{j1}t+T_{j1}^2)/6, & t∈[t_1,t_2) \newline q_0+v_{lim}T_a/2-v_{lim}(T_a-t)-j_{min}(T_a-t)^3/6 & t∈[t_2,t_3) \newline q_0+v_{lim}T_a/2+v_{lim} (t-T_a ), & t∈[t_3,t_4) \newline q_1-v_{lim}T_d/2+v_{lim}(t-T+T_d)-j_{max}(t-T+T_d)^3/6, & t∈[t_4,t_5) \newline q_1-v_{lim}T_d/2+v_{lim}(t-T+T_d)+a_{lim_d}(3(t-T+T_d)^2 & t∈[t_5,t_6) \newline \quad -3T_{j2}(t-T+T_d)+T_{j2}^2)/6 \newline q_1-j_{max}(T-t)^3/6, & t∈[t_6,t_7) \end{cases} \end{align}\]

实时停止 S 型(Double S)速度规划算法

假设我们使用上述算法进行机械臂轨迹规划,当运行到\(𝑡\)时刻,\(0 ≤ 𝑡 ≤ 𝑇\)时,我们想让机械臂停止下来。此时需要算法在当前的运行状态下马上规划出一段合适的减速阶段,令机械臂能够平稳并且迅速地停止下来。 算法如下:

my double s
1. 如果\(t∈[t_0,t_1)\)

\[\begin{align} T_{j1}=T_{j2}= T_j =& t, \quad T_a=T_d=2T_j, \quad T_v=0 \notag\newline a_{lim_a} = j_{max}&T_{j1}, \quad a_{lim_d}=-a_{lim_a} \notag \newline v_{lim} &= T_{j1}a_{lim_a} \newline q_1 &= T_{j1}a_{lim_a}T_a \notag \newline t_1=T_{j1}, \quad t_2 &= t_1, \quad t_3=t_2+T_{j1}, \quad t_4=t_3 \notag \newline t_5=t_3+T_{j2}, \quad t_6 &= t_5, \quad t_7=t_6+T_{j2}, \quad T=t_7 \notag \end{align}\]

2. 如果\(t∈[t_1,t_2)\)

\[\begin{align} T_a=T_a-(t_2-t), \quad &T_d=T_a, \quad T_v=0 \notag \newline v_{lim}=(T_a-T_{j1}& ) j_{max} T_{j1} \notag \newline q_1=(T_a-T_{j1}&)a_{lim_a}T_a \newline t_2=t, \quad t_3&=T_a, \quad t_4=t_3 \notag \newline t_5=t_4+T_{j2}, \quad t_6=T_a+t&, \quad t_7=t_6+T_{j2}, \quad T=t_7 \notag \end{align}\]

3. 如果\(t∈[t_2,t_3)\)

\[\begin{align} q_1= q_1 &-v_{lim} T_v \notag \newline t_4=t_3, \quad t_5= t_5&-T_v, \quad t_6=t_6-T_v \newline t_7=t_7-T_v, \quad &T=t_7, \quad T_v=0 \notag \end{align}\]

4. 如果\(t∈[t_3,t_4)\)

\[\begin{align} q_1 = q_0 &+ v_{lim} t \notag \newline T_v=t-t_3, \quad t_4 &= t, \quad t_5=t_5-(t_4-t) \newline t_6=t_6-(t_4-t), \quad t_7&=t_7-(t_4-t), \quad T=t_7 \notag \end{align}\]

在示教功能中,用户会输入起始点和移动方向,并期盼机械臂一直沿该方向一直移动,直到用户下达停止指令或者已经到达边工作区域缘为止。

程序一开始,可以根据起始点\(Q_0\)和移动方向计算出该方向上的工作区域边缘位置,并将该点做为作为终点\(Q_1\)

\(Q_0\)\(Q_1\)输入到算法3中,程序会规划出一条移动轨迹,并且输出每一个时间点t时机械臂应该所在的位置\(Q_t\)

机械臂会根据\(Q_t\)进行移动。

这时有两种情况:1. 用户在机械臂移动过程中某个时刻\(t\)发送了停止指令,算法3会马上对轨迹进行修改,令到机械臂马上开始减速,并且最终停止下来。2. 用户一直没有按停止指令,则机械臂在到达边缘位置时就会自动停止下来。

在安装OpenCV 3.4.1时,发生错误:

1
relocation R_X86_64_32 against `.bss' can not be used when...

最终找到是FFMPEG的问题,按下重新编译FFMPEG:

1
2
3
4
make clean
./configure --enable-nonfree --enable-pic --enable-shared
make
sudo make install

然后重新编译OpenCV,问题解决。

0%