机械臂控制

参考文章:grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现_ourkix的博客-CSDN博客

一、机械臂的D-H表示

        参考博客

        机械臂——D-H参数标定_追梦者-CSDN博客_d-h参数

描述两个关节轴线之间的位置关系用他们之间的距离和角度就可以了:

1.转角α的定义是关节轴i-1绕着公垂线ai-1转动到和关节轴i平行是所转过的角度αi-1

2.杆长ai-1就是两条空间直线的公垂线。如果杆是直的,杆长就等于连杆长度;如果不是直的,杆长等于公垂线长度。

通过连杆偏距和关节角就可以将两个相邻连杆之间的相对位置描述清楚:

1.关节角θi反映了两个连杆在关节轴处的夹角

2.连杆i-1的长度ai-1移动到和连杆i的长度ai的距离叫做连杆偏距di。如果正常连接di=0,如果两个关节之间有偏移,则根据上面说的求di。

二、机械臂正解

三、机械臂的逆解

        1.机械臂逆解顾名思义就是通过机械臂末端与机械臂原点的相对坐标,来求解机械臂两个臂的转动角度。

原理就是通过末端坐标(X,Y)得到斜边长度,再根据余弦公式 

 A^2 = B^2 + C^2 - 2BC\cos(\alpha )

算出角1和角2 

\theta1 = \arccos( \frac{L1^2 + Z^2 + X^2 + Y^2 - L2^2}{2L1 \sqrt{Z^2 + X^2 + Y^2}}) + \theta T

 \theta2 = \arccos(\frac{Z^2 + X^2 + Y^2 - L1^2 - L2^2}{2L1L2})

               2.既然二维机械臂逆解已经解决,那么转到三维环境,不过就是底座的转动角度而已。可以通过一个简单的反正切求解。

\theta 3 = \arctan(\frac{Z}{X})

3.由于本次使用的机械臂为并联机械臂,应该根据平行机构连杆进一步为正解与反解添加约束

四、强化学习控制机械臂

        这部分的内容主要是跟着莫烦大神学的

从头开始做一个机器手臂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打开笔记本摄像头

  1. 使用“win+R”快捷键,打开win10电脑的运行端口,然后输入:services.msc,打开服务设置
  2. 在服务页面找到“VMUSBArbService”服务,并将其启动。启动“VMUSBArbService”服务
  3. 打开VMware,编辑虚拟机设置,在usb控制器中使用use3.0虚拟机设置
  4. 启动虚拟机Ubuntu,待Ubuntu启动成功后,连接Ubuntu与笔记本的摄像头。(因我的摄像头已和虚拟机Ubuntu连接,所以这里显示的是断开连接。又或者显示的是XXXX Camera)加载摄像头

        我发现我在执行第二步的时候出了一些问题 ,我的“VMUSBArbService”服务,无法启动。

出现了 VMware USB Arbitration Service 错误2  这个错误。

        在我百度之后,说是VMware安装的时候没有安装完整,竟然离谱的要我重装VMware,这相当于要我把全部的东西都再装一遍啊。于是我不死心的一直找,终于找到了这篇博客关于windows无法启动VMware USB Arbitration Service 错误2_蜻落指尖的博客-CSDN博客

在这里插入图片描述

只要控制面板里面右键点【更改】,然后点击下一步,再点击修复,即可 。

七、摄像头标定

        摄像头标定其实学了挺久的,为了弄懂他的原理,去一个个看他的矩阵转换、公式推导、参数意义等,发现那些东西到现在存在于脑海中的已经所剩无几。所以只要知道摄像头标定怎么用就好了,流程大概就是,找到张正友标定法的程序,打印一张标准标定板,然后在程序中修改标定板的角点数量(角点就是黑白方块相交的那个点)。然后运行程序,标定大概16次,程序会根据平均值输出相机的参数。

【一文弄懂】张正友标定法-完整学习笔记-从原理到实战_hehedadaq的博客-CSDN博客_张正友标定

八、双目摄像头实现二维空间到三维空间的转换

         双目相机这里的话感觉也是学了一点概念,可以参考这边博客。双目视觉三维重建_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个点。

十、力控机械臂和示教型机械臂

        力控机械臂和示教型机械臂是我在调研机械臂时发现机械臂可做的两个方向,但是由于力控机械臂需要力传感器,示教型机械臂需要角度传感器(用图像识别也能做)。最后还是放弃了

项目过程中存在问题及反思:

        在做得过程中,主次不分,把学东西放在了最首要的位置,把整个项目的进程抛在后面。在做好机械臂控制的部分后,并没有积极主动的推动项目进行下去(没有及时与队友交流,了解队友进度,考虑下一步的方案。做好之后就应该去考虑三边的通讯问题,调试软硬件。看了一下,发现我是10月26日才开始做通讯部分的内容,其实10月14日就做好了机械臂的控制了),导致很长一段时间其实是没有进展的。在那一段时间里,想的都是怎么把机械臂的内容做的更丰富一些,然而实际上也没有更丰富(因为并没有做到应用阶段,只停留在理论层面),那时候做的比如物体轮廓提取、强化学习机械臂、相机标定等其实对整个项目的进展都是没有帮助的。在做好基本内容之后再去延申其他功能才是更好的选择(开始还不懂老师说的和应用结合,现在发现做项目一定要联系应用和实际进度,不然很容易就迷失方向),一旦陷入那种想要做些什么,但是不知道接下来怎么做,就胡乱去学的状态就很难走出来。就比如控制机械臂,其实可以先用逆解的方法做出实验结果,再去用强化学习的方法,这样可以把两者得出的数据做对比分析,还能比较两者的优缺点(其实在这一块很多论文都没有说清楚)。

        其次在团队协作中,应当要保证充分有效的交流。在第一周和第二周,设计方案的过程中,并没有对选题进行充分的调研,那段时间我虽然花费了比较多的时间去看一些小车的设计论文,但是并没有积极的去和队友交流想法。导致最后就只是我根据之前的讨论和搜集到的资料做了方案的设计,并没有可行性论证、时间安排、各模块结合等各方面的讨论,后面的工作也是走一步算一步(在看到其他同学分享方案设计的时候我就应该想到的,可能是缺乏项目经验或者自己不够重视的原因,导致我没有把这个当成一件重要的事情推行下去)。在后续几周的工作中,大家也都是做自己负责的部分,缺乏交流和分享。由于我还负责通讯,对他两的工作可能还了解一点。后面我知道交流方面存在问题了,但是不知道怎么去解决这个问题,现在我觉得应该每周给出两个小时的时间,小组成员分享自己的收获和进展,接下来的计划(要采用什么方案),各自遇到的问题看是否有解决的方案,然后把互相之间要配合的点讨论清楚,(大家应该先要对自己交流的东西有一个准备,不然到时候想到什么说什么,最后只能是得到一个大概的方案,浪费了时间)。在交流的过程中应该要有一个记录。

        还有就是在老师讲评的过程中,没有充分理解老师对自己以及其他团队给出的建议,这个我没有很好的解决办法。暂时只能想到先做好记录,在做的过程中去思考。

        方案设计的时候并没有论证过,大家只是口头交流,导致后面做的时候没有计划,走一步算一步。做了太多重复性的工作(比如相机标定、二维到三维的转换等),走了弯路。想学的东西太多,做几天一下物体轮廓提取,学了一下力控机械臂,想到要力传感器又放弃了;做了一周强化学习机械臂,考虑到运行Python的延时又放弃了。调研的时候没有深入,全都去学,结果都没有学明白。

收获分享:

        

猜你喜欢

转载自blog.csdn.net/weixin_44129767/article/details/121057086