参考文章:grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现_ourkix的博客-CSDN博客
这次的项目主要是做了两个部分的工作。
一、机械臂的逆解
1.机械臂逆解顾名思义就是通过机械臂末端与机械臂原点的相对坐标,来求解机械臂两个臂的转动角度。
原理就是通过末端坐标(X,Y)得到斜边长度,再根据余弦公式
算出角1和角2
2.既然二维机械臂逆解已经解决,那么转到三维环境,不过就是底座的转动角度而已。可以通过一个简单的反正切求解。
二、强化学习控制机械臂
这部分的内容主要是跟着莫烦大神学的
从头开始做一个机器手臂4 加入强化学习算法 - 机器学习实战 | 莫烦Python
1.超参数的设置,给随机生成的点设计限制
(1) 在强化学习训练模型时,为了得到较快的收敛效果和更好的泛化性能,超参数设置的好尤为重要。
在用DDPG算法对机械臂进行训练的时候,遇到的第一个问题是,机械臂一直无法抓取到物体,甚至在500轮的训练结束后还是没有收敛。经过排查后,发现是因为有些随机生成的点是机械臂末端无法达到的范围,这导致模型一直学不到东西。
遇到的第二个问题是,机械臂的学习效率很慢,要600个回合才能收敛。这有两个方面的原因,一是学习效率的设置,学习效率设置的过小,模型会一直学不到东西;但是学习效率设置的太大,会导致收敛后出现震荡,不稳定(也就是会一下子抓得到东西,一下子抓不到)。二是记忆池大小的设置,记忆池设置的太大,会导致收敛速度慢。
2. 因为我平常会比较关注国际形式,不禁想到如果强化学习等类似优化方法能用于分析国际形式,做出有利于全体国民利益的决策吗?好像需要的输入量会非常多诶
三、配置Linux、vscode和opencv的环境
关于opencv的安装,可以参考这篇博客
Ubuntu18.04安装Opencv4.5(最新最详细)_向日葵骑士的博客-CSDN博客
vscode配置opencv可以参考这篇博客
Ubuntu vscode(c++)配置opencv4.1.0_xingtianyao的博客-CSDN博客
主要就是修改launch.json文件、tasks.json文件、c_cpp_properties.json文件这三个文件。
四、修复虚拟机
说到环境配置,真是最折磨入门新手的事情了,特别是你最开始安装软件就出了一些问题的时候。就比如Linux调用笔记本摄像头这么一个小毛病,困扰了我非常之久。在我配置完opencv环境,进行测试时,发现显示屏出现了hello opencv的字样,然而我的摄像头并没有正常开启。开始我以为是opencv没安装好的缘故,在我第二次重装仍然出现了同样的问题之后,我意识到应该是摄像头的缘故。
然后我在csdn上看到VMware启动笔记本摄像头的博客Ubuntu16.04使用笔记本电脑摄像头操作方式_a921026768的博客-CSDN博客_ubuntu打开笔记本摄像头
- 使用“win+R”快捷键,打开win10电脑的运行端口,然后输入:services.msc,打开服务设置
- 在服务页面找到“VMUSBArbService”服务,并将其启动。
- 打开VMware,编辑虚拟机设置,在usb控制器中使用use3.0
- 启动虚拟机Ubuntu,待Ubuntu启动成功后,连接Ubuntu与笔记本的摄像头。(因我的摄像头已和虚拟机Ubuntu连接,所以这里显示的是断开连接。又或者显示的是XXXX Camera)
我发现我在执行第二步的时候出了一些问题 ,我的“VMUSBArbService”服务,无法启动。
出现了 VMware USB Arbitration Service 错误2 这个错误。
在我百度之后,说是VMware安装的时候没有安装完整,竟然离谱的要我重装VMware,这相当于要我把全部的东西都再装一遍啊。于是我不死心的一直找,终于找到了这篇博客关于windows无法启动VMware USB Arbitration Service 错误2_蜻落指尖的博客-CSDN博客
只要控制面板里面右键点【更改】,然后点击下一步,再点击修复,即可 。
五、摄像头标定
摄像头标定其实学了挺久的,为了弄懂他的原理,去一个个看他的矩阵转换、公式推导、参数意义等,发现那些东西到现在存在于脑海中的已经所剩无几。所以只要知道摄像头标定怎么用就好了,流程大概就是,找到张正友标定法的程序,打印一张标准标定板,然后在程序中修改标定板的角点数量(角点就是黑白方块相交的那个点)。然后运行程序,标定大概16次,程序会根据平均值输出相机的参数。
六、双目摄像头实现二维空间到三维空间的转换
双目相机这里的话感觉也是学了一点概念,可以参考这边博客。双目视觉三维重建_tiemaxiaosu的博客-CSDN博客_双目相机三维重建
我的理解的话,三维空间变换可分为三步。
1.确定两幅图像之间的视差(视差是同一个三维点从两个不同的摄像头角度拍摄的图像位置的差异,可以通过图像中找到对应点在两张图中的坐标X轴差值d,根据公式得到X、Y)
2.将投影矩阵分解为相机内部矩阵K,外部参数R, t
3.使用我们在前两个步骤中收集到的信息来估计深度
空间变换困扰了我挺久的,一开始一直想不通二维空间怎么转换到三维空间中来,并且由于摄像头是装在机械臂上的,三维空间原点的设置是一个很大问题。后面我队友给的解决方案是,直接建立一个以摄像头光心为原点的坐标轴,物体与摄像头的距离为Z坐标,与摄像头光轴偏差为X坐标和Y坐标。开始我一度以为这样的坐标轴设置是没法做逆解,后来老师点拨后发现逆解可以解出机械臂旋转角度。我队友想让我控制机械臂一步步减小物体到光轴的偏差,经过我的论证,没法计算机械臂角度来一步步减小偏差。
七、物体轮廓检测
轮廓检测的话大概是这么几个步骤,跑了一个python的案例,效果还是不错的。
1.从摄像头读取数据
2.对工业相机生成的变形图像进行校正
采用短焦距相机,图像发生了畸变,图像靠近边框的部分发生了明显的弯曲,需要进行校正,
3.把图像转化成灰度图
将彩色图像img转成灰度图矩阵
4.对灰度图进行边界增强处理。
边界增强处理的目的就是让物体的边界分明,便于轮廓查找
5.对边界增强处理过的图像进行二值化
二值化处理的目的是让轮廓黑白分明,
6.对二值图像进行形态学处理
形态学处理的目的实现消除噪声,分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
7.遍历集合取出各个元素进行处理
8.从集合中取出轮廓点进行处理
计算出异型卡轮廓的重心点坐标,外接圆半径,最小外接矩形4个点。
八、力控机械臂和示教型机械臂
力控机械臂和示教型机械臂是我在调研机械臂时发现机械臂可做的两个方向,但是由于力控机械臂需要力传感器,示教型机械臂需要角度传感器(用图像识别也能做)。最后还是放弃了