前言
参考链接: 【机械臂入门教程】机械臂视觉抓取从理论到实战
机械臂手眼标定原理及代码
https://github.com/cgohlke/imagecodecs
GRCNN
通过神经网络,先进行模型训练,在进行模型评估。
机械臂逆运动学求解
所有串联型6自由度机械臂均是可解的,但这种解通常只能通过数值解法得到,计算难度大,复杂度高。因此,在确定逆运动学解法前,我们有必要探究机械臂逆运动学问题的解析解是否存在,Pieper判据是机器人领域常用的一种用于判断解析解存在性的判据。
Pieper在其论文中指出:6自由度机械臂存在解析解的充分条件是相邻的三个关节旋转轴相交于一点。为满足这一条件并降低控制成本,市面上的大部分机械臂均依此设计,具有特定的结构,如带有球形腕的机械臂,如下图所示。
1.遇到的问题
1.安装conda失败
因为jeston nano是arm64的架构,网上关于这个相关的都是在amd64下安装的,所以大部分的教程不合适。经过一番尝试,安装未成功,所以放弃安装这个。
6-5号更新:conda网上有Anaconda_aarch64的版本和Miniconda_aarch64版本。在jetson4.4+python3.6的环境下,conde版本4.10及以下的可以安装成功,但是运行的时候显示Illegal instruction(cpre dumped),就是创建环境成功之后显示Illegal instruction(cpre dumped)。所以放弃。
最新建议使用miniforge: miniforge有miniforge和mambaforge两个版本,建议安装miniforge,mambaforge已经不更新了。
2.安装torch和torchvision失败
遇到的问题跟上面的一样,架构不同,大部分的安装教程不使用,相应的安装包太少了,所以要去下载专用的安装包才可以。
sudo apt-cache show nvidia-jetpack // 查看nano 的jetpack版本
jtop // 在终端输入 查看系统版本
3.Jetson平台执行Python时命令的出现“Illegal instruction(cpre dumped)” 错误
gedit ~/.bashrc // 打开.bashrc文件
export OPENBLAS_CORETYPE=ARMV8 // 输入内容
source ~/.bashrc // 关闭文件并执行
4.ModuleNotFoundError: No module named ‘numpy.testing.nosetester’
numpy.testing.nosetester 这个在numpy1.18时已被弃用。
更新scipy模块的版本即可
pip3 install --upgrade --user scipy
5.RuntimeError: DataLoader worker (pid 10010) is killed by signal: Kill
将num_workers设置为0; // 在train_network.py中
## AttributeError: module ‘numpy’ has no attribute ‘float’.
np.folat 改为 np.folat64
6.nano SD卡扩容
sudo gparted // 然后点击 Resize/Move
7.nano 增加交换空间
sudo fallocate -l 4G /var/swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile
sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'
2. 经验教训
只写到了现象,没有往下一步分析。应该由原因写到现象再进而到出现问题。
这个思维导图,没有划分层次,摄像头是硬件,但是OpenCV是软件知识。
3.环境搭建
硬件参数:jeston nano 4G
ubuntu: ubuntu18.04
安装好程序之后测试:
// train
python3 train_network.py --dataset jacquard --dataset-path '/home/****/Desktop/Jacquard_Samples' --description training_jacquard --use-dropout 0 --input-size 300
// evaluate
python3 evaluate.py --network '/home/****/Desktop/grcnn/trained-models/jacquard-rgbd-grconvnet3-drop0-ch32/epoch_48_iou_0.93' --dataset jacquard --dataset-path '/home/***/Desktop/Jacquard_Samples' --iou-eval --input-size 300
对比之后发现,B站UP主小五哥 实验室用的是 2080ti 评估一张照片大概需要150ms
我用nano 进行模型训练时会卡死。评估一张照片大概需要25s。将交换空间从4G增加到8G,评估一张照片从25S变到了5-10S;关闭图形界面后,评估时间变为3-5s;
参数 | 2080ti-10G | jeston nano-4G |
---|---|---|
处理时间 | 150ms | 25000 ms |
增加swpa到8G\16G | \ | 5-10s |
关闭图形界面 | \ | 3-5s |
算力 FP16 | 53.8 TFLOPS | 472 GFLOPS |
5.手眼标定
基本原理
内参包括:焦距(fx,fy)、主点坐标(cx,cy)、畸变参数。
外参:把相机的旋转、平移(相机的位姿由它的旋转矩阵R和平移向量t来描述),外参会随着相机运动发送改变。
内参作用:从相机坐标系转换到像素坐标系中。
外参作用:从世界坐标系转换到相机坐标系。
标定:在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。这个求解参数的过程就称之为相机标定(或摄像机标定)。
换个说法就是相机标定的意义是为了将图像中的点能够还原到真实三维空间中,真实的反应各点之间的实际相对空间关系。
手眼标定原理 右乘连体左乘基
math.sqrt(); // 求平方根;
// ros下的相机标定
sudo apt-get install ros-melodic-uvc-camera;// 安装驱动 或者ros-melodic-usb-cam
roscore;
roslaunch uvc_camera camera_node.launch // 启动相机程序
rostopic list; // 查看节点信息;我们需要关注的是 camera_info和image_raw节点的信息
// size:标定棋盘格的内部角点个数,这里使用的棋盘一共有6行,每行有8个内部角点;square:这个参数对应每个棋盘格的边长,单位是米。image和camera:设置摄像头发布的图像话题。
rosrun camera_calibration cameracalibrator.py --size 11*8 --square 0.03 image:=/image_raw camera:=/camera_info
// 1)X:标定靶在摄像头视野中的左右移动。2)Y:标定靶在摄像头视野中的上下移动。3)Size:标定靶在摄像头视野中的前后移动。4)Skew:标定靶在摄像头视野中的倾斜转动。
b
a
s
e
e
n
d
∏
{_{base}^{end} {\huge {\LARGE } } \prod}
baseend∏ 机械臂末端坐标系到机械臂基地坐标系的旋转矩阵。可以理解为base/end,后面乘end坐标系下的一点endp,就变为base坐标系下的一点basep。
关于齐次变换矩阵的左乘右乘问题。当以全局坐标系为参照做变换时用左乘,以当前坐标系为参照做变换时用右乘。举例:
若执行器当前的位姿为
T
A
T_{A}
TA ,若其绕全局坐标系xyz下做了一个变换,变换矩阵为
T
B
T_{B}
TB ,则其当前位姿为
T
B
∗
T
A
T_{B} *T_{A}
TB∗TA
若执行器当前的位姿为
T
A
T_{A}
TA ,若其绕当前坐标系,下做了一个变换
n
A
,
o
A
,
a
A
n_{A},o_{A},a_{A}
nA,oA,aA,变换矩阵为
T
B
T_{B}
TB ,则其当前位姿为
T
A
∗
T
B
T_{A} *T_{B}
TA∗TB