机械臂学习实验篇

一.前言   

        大家好呀,本小节开始我将记录一下我使用的机械臂所完成的项目过程,最终计划是在ros小车组装上机械臂然后进行物体的投掷,如果有同样目标的伙伴可以私信我,大家一起探讨。好了,话不多说,马上开始!

二.机械臂学习

1.机械臂介绍

我先来简单介绍一下我是用的机械臂

Armpi FPV(7.5V 6A)

2.常见问题及解决

2.1 摄像头不清晰

2.2 摄像头打不开

输入“ sudo systemctl stop start_node.service ”关闭 ROS 服务。
输入“ sudo systemctl start start_node.service ”开启 ROS 服务,若不开启则会造成
后续 ROS 框架下的玩法无法运行。

2.3 ArmPi FPV机械臂舵机安装方法

3.相机标定棋盘格

在 终 端 界 面 输 入 开 启 相 机 标 定 的 指 令

rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.015 image:=usb_cam/image_raw camera:=/usb_cam/

square”参数是每个方格的单边边长,单位为米,我们可以使用尺子量取方格的单边
边长,本节所用棋盘单格边长测量后为 1.5 厘米,因此将 square 的数值设定成 0.015

开启标定程序后,将棋盘横置于镜头正前方,在镜头前保持棋盘横置并快速移动和 倾斜棋盘图片,当棋盘格出现多种颜色线条,并且右侧参数进度条有变化时,则表明正在标定中,在标定过程中,我们需要重复多次此操作,直至右侧参数进度条全部变绿。

其中,参数“x”是图像视野中的左和右,我们需要将棋盘左右移动;参数“y”是图像视 野中的上和下,我们需要将棋盘上下移动;参数“size”是图像朝向和相机的距离,我们需 要将棋盘拿远或拿近;参数“scale”是图像的倾斜程度,我们需要将图像在横置的状态下随 机角度的倾斜。

直到右边 x,y,size 和 scale 参数进度都变绿色,并且“CALIBRATE”图标显示绿 色,此时表示标定完成,如下图所示:

然后点击“calibrate”按钮,开始计算标定

注意:计算标定的时常会根据标定图片的数量而定,需要的图片越多则时间越长。

程序计算标定完后,可以尝试在画面中移动棋盘图像,查看图像是否笔直显示,确认没问题后即可点击“commit”按钮提交保存标定数据

4.颜色阈值调节实验

        不同光源下会对物体颜色造成不同的影响,因此在进行颜色相关的功能时, 会存在识别上的差异。如果这种差异影响到功能的实现,需要进行差异消除。

启动 LAB_Tool

进入软件后,我们可以看到 LAB_Tool 的界面,如下图所示:

LAB_Tool 的界面分布及说明

调节默认颜色效果

这里以调节红色为例,其它颜色亦可参考,具体调节步骤如下:

1) 在识别调节区的颜色选择栏中选择 “red”

2) 将摄像头对准需要进行效果调节的颜色物体,拖动识别调节区的 L、A、B 分量滑杆进行阈值调节,直至画面显示区左侧的颜色物体区域变为白色,其它区域变为黑色。

3) 最后点击识别调节区的“Save”按键,将调节后的参数数值保存。

增加新的识别颜色

除了内置的三种识别颜色,我们还可以增设其它可识别的颜色,直接将默认颜色选项的 LAB 数值调整为实际颜色

        以橙色为例进行设置,具体步骤如下:

1) 在识别调节区的颜色选择栏中选择 “red”,将摄像头对准需要识别的橙色物体,拖动 L、A、B 分量滑杆调整阈值,直到画面 显示区左侧画面中的橙色物体所在区域变为白色,其他区域变成黑色。

2) 点击识别调节区的“Save”按键,将修改后的 L、A、B 参数数值保存。

5.颜色识别实验

/home/ubuntu/Ai_FPV/CV2_ColorDiscern.py

实现流程:

第一步,调取摄像头的图像: 通过 OpenCV 处理摄像头的实时图像。

第二步,图像的二值化: OpenCV 将图像中的所有像素以 0 和 1 来表示,将值为 0 的像素点用黑色显示,值为 1 的用白色显示。

第三步,腐蚀和膨胀: 腐蚀处理的目的是去除图像边缘的毛刺。膨胀处理会将图像的边缘扩大,用以填充目标 物体边缘或内部的非目标像素点。

第四步,找出轮廓的位置: 通过对黑、白区域进行分界来找出目标物体的轮廓位置。

第五步,将识别到的颜色物体框出: 将识别到的颜色物体(红绿蓝三种)转换为未缩放前的坐标,进而判断是否为最大的颜 色物体

这里因为我的3号舵机盘坏了所以注释掉了初始位姿的代码

识别对应颜色后两个led灯也会变化对应颜色

颜色识别实验主要用到 cv2 库中的 inRange()、findContours()和 morphologyEx()函数,以及Board 库中的 setPixelColor()函数。其中:

inRange()函数用于对输入图像进行二值化处理。括号内的第一个参数是输入图像。第二个、第三个参数分别是阈值的下限和上限。当像素点 RGB 的颜色数值处于上、下限之间时, 该像素点被赋值为 1,否则为 0。 findContours()函数用于查找图像中的目标轮廓。括号内的第一个参数是输入图像。第二 个参数是轮廓的检索模式,第三个参数是轮廓的近似方法。

morphologyEx()函数用于进行形态学的变换。该函数的第一个参数为输入的图像数据, 第二个参数为进行变化的方式,第三个参数表示方框的大小。 setPixelColor()函数用于控制扩展板上的RGB 彩灯。以代码“Board.RGB.setPixelColor(0, Board.PixelColor(255, 0, 0))”为例,括号内的参数含义如下: 第一个参数“0”是 RGB 灯序号,“0”代表 RGB1,而“1”则代表 RGB2; 第二个参数“Board.PixelColor(255, 0, 0)”是 RGB 的颜色通道参数,“255”、“0”、 “0”分别代表 R、G、B 通道的数值,此处为红色。

这里我又在前方放了一个红色的桶在下方可以成功识别出来

接下来我创建了一个test.py 在识别对应颜色后可添加对应动作



6.AprilTag 识别

/home/ubuntu/Ai_FPV/ApriltagDetect.py

AprilTag 识别主要用到 cv2 库中的 drawContours() putText() 函数。其中:
drawContours() 函数用于绘制标签轮廓,以“ cv2.drawContours(img, [np.array(corners,
np.int)], -1, (0, 255, 255), 2) ”为例,其括号内的参数含义如下:
第一个参数“ img ”是绘制轮廓的图像;
第二个参数“ [np.array(corners, np.int)] ”是轮廓本身,在 Python 中为 list
第三个参数“ -1 ”是指定轮廓 list 内进行绘制的轮廓,此处数值代表绘制其中的所有轮
廓;
第四个参数“ (0, 255, 255) ”是轮廓颜色,其顺序为 B G R ,此处为黄色;
第五个参数“ 2 ”是轮廓宽度,“ -1 ”代表用指定颜色填充轮廓。
putText() 函数用于在图像上显示文字内容。以“ cv2.putText(img, "tag_id: " + str(tag_id),
(10, img.shape[0] - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.65, [0, 255, 255], 2) ”为例:
第一个参数“ img ”是输入图像;
第二个参数“ "tag_id: " + str(tag_id) ”是添加的文字;
第三个参数“ (10, img.shape[0] - 30) ”是添加内容的左上角坐标;
第四个参数“ cv2.FONT_HERSHEY_SIMPLEX ”是添加内容的字体;
第五个参数“ 0.65 ”是字体大小;
第六个参数“ [0, 255, 255] ”是字体颜色,其顺序为 B G R ,此处为黄色;
第七个参数“ 2 ”是字体宽度。
        程序运行后,机械臂会对视觉范围内的标签进行识别。当识别到标签,回传画面内会将
其框出,并在左下角打印 ID 信息。每检测到一次标签,蜂鸣器就会响起一声。

7.形状识别实验

/home/ubuntu/Ai_FPV/ShapeRecognition.py
这里因为我的3号舵机盘坏了所以注释掉了初始位姿的代码

形状识别实验主要用到 cv2 库内的 approxPolyDP() morphologyEx() 函数。其中:
approxPolyDP() 函 数 用 于 将 一 个 连 续 光 滑 曲 线 折 线 化 。 以 代 码 “ approx =
cv2.approxPolyDP(areaMaxContour_max, epsilon, True) ”为例,括号内的参数含义如下:
第一个参数“ areaMaxContour_max ”是输入的形状轮廓;
第二个参数“ epsilon ”是距离值,表示多边形的轮廓接近实际轮廓的程度,值越小,越
精确;
第三个参数“ True ”表示轮廓为闭合曲线。
morphologyEx() 函 数 用 于 进 行 形 态 学 的 变 换 , 以 代 码 “ closed =
cv2.morphologyEx(opened, cv2.MORPH_CLOSE, np.ones((6,6),np.uint8)) ”为例,括号内的
参数含义如下:
第一个参数“ opened ”是输入图像;
第二个参数“ cv2.MORPH_CLOSE ”是使用的形态学方法,此处为闭操作;
第三个参数“ np.ones((6,6),np.uint8) ”是形态学运算的内核,此处指采用 3 × 3 的方形结
构元素。
        程序运行后,机械臂会对视觉范围内的图案进行识别。当识别到对应图案时,回传画面
会框出图案,且终端会打印形状名称。(识别黑色)

8.AprilTag 定位

/home/ubuntu/Ai_FPV/ApriltagCoordinate.py

9.movelt

9.1 环境搭建及建立连接

获取虚拟机桥接模式下的 IP

在VMware虚拟机界面点击“编辑”,选择“虚拟网络编辑器”

选择“VMnet0”,然后选择合适的桥接模式(根据实际情况选择网卡类型),点击“应用”,然后再点击“确定”。(如果没有“VMnet0”桥接模式,可以点击“还原默认设置”)

查看网卡类型的方法如下所示

选择完成后,再点击“虚拟机”,选择“设置”,点击“硬件”,点击“网络适配器”,选择“桥接模式”,勾选“复制物理网络连接状态”,点击“确定”。修改虚拟机网络配置

打开ubuntu的命令行终端,输入指令“ifconfig”,查看虚拟机IP,将虚拟机IP记录下来。

获取机械臂 IP

需要确保机械臂与虚拟机在同一局域网下

在机械臂中添加虚拟机 IP

在机械臂终端输入指令“sudo vim /etc/hosts”,按下回车,进入网络配置文件。

将第2行注释,在第2行下面添加机械臂IP和虚拟机IP。(注意:IP后面的名称不可随意更改)

在虚拟机中添加 IP

输入指令“sudo vim /etc/hosts”,按下回车,进入网络配置文件。(如果提示“password for ubuntu”,输入“ubuntu”回车即可)。

将第2行注释,在第2行下面添加虚拟机IP和机械臂IP。(注意:IP后面的名称不可随意更改)

输入指令“sudo vim ~/.bashrc”,按下回车,进入网络配置文件。

第一行改为机械臂IP  第二行改为虚拟机IP

返回后,在ubuntu命令行界面输入“source ~/.bashrc”指令,让更改的部分生效。

在ubuntu的命令行界面输入“rostopic list”,若出现ArmPi FPV机械臂开启的节点,则说明配置联网成功。

9.2 MoveIt 运动学设计

1.运动学介绍

        正运动学是给定关节变量的取值来确定末端执行器的位置和姿态,就是从舵机旋转的角度来确定机器人最终的位置和姿态。
        逆运动学是给定的末端执行器的位置和姿态来确定机器人关节变量的取值,就是从机器人最终的位置和姿态,反向推算舵机需要旋转的角度。

2.正运动学简析

        DH 参数就是一个用四个参数表达两对关节连杆之间位置角度关系的机械臂数学模型
和坐标系确定系统。

1) link length(连杆长度):两个关节的轴(旋转关节的旋转轴,平移关节的平移轴)之
间的公共法线长度
2) link twist(连杆扭转):一个关节的轴相对于另一个关节的轴绕它们的公共法线旋转的
角度
3) link offset(连杆偏移):一个关节与下一个关节的公共法线和它与上一个关节的公共
法线沿这个关节轴的距离
4) joint angle(关节转角):一个关节与下一个关节的公共法线和它与上一个关节的公共
法线绕这个关节轴的转角

3.逆运动学简析

据此我们可以求出θ1 的角度,同理我们也可以求出θ2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Head First Design Patterns -模板方法模式

什么是模板方法模式 在一个方法中定义一个算法的骨架,而把一些步骤延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。 这些算法步骤中的一个或者多个被定义为抽象的,由子类实现。 类图 代码 书中用泡茶和…

pytest之yaml格式测试用例读写封装

pytest之yaml格式测试用例读写封装 pytest之parametrize()实现数据驱动YAML格式测试用例读/写/清除/封装结构类型Maps类型数组类型 pytestparametrizeyamltest_api.pyget_token.yaml pytest之parametrize()实现数据驱动 pytest.ma…

在Sequence中缓存Niagara粒子轨道

当Sequence中粒子特效较多时,播放检查起来较为麻烦,而使用Niagara缓存功能可将粒子特效方便的缓存起来,并且还可以更改播放速度与正反播放方向,便于修改。 1.使用Niagara缓存需要先在插件里打开NiagaraSimCaching 2.创建一个常…

JVM堆(虚拟机堆)的分区

JVM堆分为:新生代(young)和老年代(old) 新生代分为:伊甸园(eden)和幸存区(survivor) 幸存区分为:from区和to区 from和to通常大小相等 伊甸园 eden,最初对象都分配到这里,与幸存区合称新生代幸存区survivor,当eden内存…

CSS3 中的盒模型:标准与IE盒模型的差异

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

鸿蒙开发实战:网络请求库【axios】

简介 [Axios] ,是一个基于 promise 的网络请求库,可以运行 node.js 和浏览器中。本库基于[Axios]原库v1.3.4版本进行适配,使其可以运行在 OpenHarmony,并沿用其现有用法和特性。 http 请求Promise APIrequest 和 response 拦截器…

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法:在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后,将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置,产生排序好的子…

HTTPS协议的工作原理:保护网络通信的安全盾牌

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

深度分析鸿蒙应用开发的准确红利期、前景、未来发展方向

近年来,随着互联网技术的不断发展,鸿蒙生态开发逐渐成为热门话题。作为一种新兴的操作系统,其发展趋势备受关注。同时,鸿蒙生态开发的价值、就业岗位需求以及相关学习方面也引起了广泛关注。 那么就目前的形势来看,鸿…

【计算机网络篇】数据链路层(1)数据链路层的地位,问题

文章目录 🍔数据链路层在网络体系结构中的地位🍔链路,数据链路,帧🍔数据链路层的三个重要问题🥚封装成帧和透明传输🥚差错检测🥚可靠传输 🍔数据链路层在网络体系结构中的…

C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy,memmove,memset和memcmp。都在头文件string.h里面。 一.memcpy函数的使用 一提到这个函数,我们可能会联想到strcpy函数,但strcpy函数是针对字符串的拷贝。但是我们在写代码的…

【2024第十二届“泰迪杯”数据挖掘挑战赛】B题基于多模态特征融合的图像文本检索—解题全流程(持续更新)

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛B题 解题全流程(持续更新) -----基于多模态特征融合的图像文本检索 一、写在前面: ​ 本题的全部资料打包为“全家桶”, “全家桶”包含:数据、代码、模型、结果csv、教程…

信号处理之快速傅里叶变换(FFT)

信号处理之快速傅里叶变换FFT 历史溯源欧拉公式傅里叶级数(FS)傅里叶变换(FT)离散傅里叶级数(DFS)离散时间傅里叶变换(DTFT)离散傅里叶变换(DFT)快速傅里叶变换(FFT)MATLAB中常用的FFT工具FFT中常见的问题 历史溯源 相信很多人知道傅里叶变换,但是很多人对傅里叶变…

React中 类组件 与 函数组件 的区别

类组件 与 函数组件 的区别 1. 类组件2. 函数组件HookuseStateuseEffectuseCallbackuseMemouseContextuseRef 3. 函数组件与类组件的区别3.1 表面差异3.2 最大不同原因 1. 类组件 在React中,类组件就是基于ES6语法,通过继承 React.component 得到的组件…

用Unidbg实现阿里系x-sign签名, 成功实现长x-mini-wua

本篇文章仅供学习讨论。 文章中涉及到的代码、实例,仅是个人日常学习研究的部分成果。 如有不当,请联系删除。 阿里系的签名算法,一直让人好奇的心痒痒。所以在空的时候,都会去扣其逻辑,一边学习逆向,一边学…

jmeter之接口功能自动化

一、接口测试简述 接口:用来连接前端,后端还有移动端的程序模块。由于不同端的工作进度不一样,需要对最开始出来的接口进行接口测试。 接口分类:POST,GET,PUT,DELETE。 POST请求的数据是放在…

极简自建web视频会议,私有云,rtmp/rtsp/webrtc一键参会直播会议互动方案

随着视频互动深入工作日常,很多客户需要自建一个会议,监控的交互平台,目前外面不管是开源还是非开源的平台,都是极为复杂,一般linux安装库关联部署复杂,非技术人员根本没办法使用,不方便集成部署…

基于springboot+vue的宠物商城网站

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

AAC相关知识

一、AAC音频格式种类有哪些 AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIF(Audio Data Interchange Format音频数据交换格式)和ADTS(Audio Data transport Stream音频数据传输流)。 ADIF 特点…

38 mars3d 对接地图图层 绘制点线面员

前言 这里主要是展示一下 mars3d 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;"><div class"mars3dClas…