机械臂学习实验篇

一.前言   

        大家好呀,本小节开始我将记录一下我使用的机械臂所完成的项目过程,最终计划是在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。

相关推荐

  1. TCP机械测试

    2024-03-24 13:46:01       11 阅读
  2. baxter机械校准

    2024-03-24 13:46:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 13:46:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 13:46:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 13:46:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 13:46:01       18 阅读

热门阅读

  1. 【MySQL】覆盖索引

    2024-03-24 13:46:01       19 阅读
  2. 【LeetCode-394.字符串解码】

    2024-03-24 13:46:01       16 阅读
  3. 24.3.24 《CLR via C#》 笔记10

    2024-03-24 13:46:01       13 阅读
  4. 优化 - 数据结构

    2024-03-24 13:46:01       18 阅读
  5. 100268. 最长公共后缀查询(字典树查询)

    2024-03-24 13:46:01       16 阅读
  6. 重新了解一下之前的單對象變化問題

    2024-03-24 13:46:01       16 阅读
  7. Bom,事件对象

    2024-03-24 13:46:01       18 阅读
  8. extern c 和extern c++

    2024-03-24 13:46:01       16 阅读
  9. cookie、session和token的区别

    2024-03-24 13:46:01       21 阅读
  10. 读《舞!舞!舞!》有感

    2024-03-24 13:46:01       19 阅读