机器人制作开源方案 | 桌面级机械臂--运动控制

news2024/11/16 19:54:32

1. 调整总线舵机的模式

      实现思路:

      机械臂包括转台、大臂、小臂三部分,先设置好总线舵机每个ID的工作模式。下图是计划给舵机的各部分设置的ID号:

接下来为各部分设置相应的舵机模式(见下表),并在程序里进行编程设置。

器材准备:

PC机或笔记本电脑(windows操作系统、Arduino IDE)、以及下图所示的其它器材。

1.1修改转台的舵机模式

第一步:按下图所示连接好电路。

第二步:打开文末资料内的”总线舵机ID及模式更改资料\串口调试助手\sscom5.13.1.exe”(如下图所示)。

第三步:选择端口号、波特率,并打开串口。

先在菜单栏:串口设置---打开串口设置,选择端口号、波特率,点击“ok”即可。

接着点击“打开串口”,并点击“扩展”。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图6

这里我们已经把命令设置好了,只需要依次点击描红的命令(如下图所示),就可以完成转台模式的设置,即可观察到转台转动到指定角度。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图7

1.2 修改大臂的舵机模式

第一步:按下图所示把大臂的舵机线与小模块进行电路连接(注意:请先把小模块断电)。

其中,大臂的舵机线如下图所示。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图9

第二步:在串口调试助手里,选择端口号、波特率并打开串口。

第三步:依次点击下边描红的命令,就可完成大臂模式的设置,同时可观察到大臂转动。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图10

1.3 修改小臂的舵机模式

第一步:按下图所示把小臂的舵机线与小模块进行电路连接(注意:请先把小模块断电)。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图11

第二步:在串口调试助手里,选择端口号、波特率并打开串口。

第三步:依次点击下边描红的命令,就可完成小臂模式的设置,同时可观察到小臂转动。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图12

这样就完成了总线舵机模式的修改工作。

2. 机械臂运动学控制

      控制机械臂最基本的方法是对其建立运动学模型,对于3轴的串联机械臂来说,运动学模型其本质就是给定空间3D坐标,利用运动学算法进行控制。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图13

2.1分析-串联的运动学

      串联的运动学有两种:一种是正运动学,一种是逆运动学。

      串联的正运动学,简单来说是指确定每个关节舵机转动的角度,从而确定端点位置。这种方法在调试时对于少量自由度的机械臂比较实用,但是当自由度增加时,调试复杂程度也会随之增加。比如下方这个3自由度(不含执行器),我们只需要确定其3个关节上的舵机转动角度α,θ,β,即可确定执行端的位置(暂时不考虑臂长的因素)。

     串联的逆运动学,简单来说是指确定端点的位置,然后通过算法计算出各关节需要转动的角度,自动调整到合适的位置。结合本项目中的3轴机械臂(见下图),我们将采用逆运动学算法进行设计,控制运动。

2.2设计-逆运动学算法

      这里给大家介绍一种3自由度(不含执行器)逆运动学算法。

      为方便大家的理解,算法总共分为5步:第一步为建立空间坐标系;第二步、第三步为简化模型运动学计算;第四步为末端坐标变换的补偿计算;第五步为总体总结。

      第一步:将以转台旋转中心为原点建立空间坐标系如下:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图16

从上图可知:O点为转台旋转轴和大臂旋转轴的交点,A点为大臂的末端,C点为小臂的旋转中心,AC方向为小臂的旋转轴,B点为小臂的末端。

      第二步:为了方便计算,我们这里将AC段压缩为0,这样可以简化模型如下:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图17

关于AC段运动的计算,我们在后面的步骤中通过简单的坐标变化进行计算。

      第三步:进行简化模型的运动学计算。通过前面的了解,我们知道逆运动是通过坐标来计算出各个关节转动的角度。这里我们可以通过以下步骤建立几何模型和建立运动学算法:

      ① 将末端B点坐标设置为(x,y,z),作B点在xy平面的投影B1(x,y,0),如下所示:

      ② 计算转台旋转角度与末端坐标的关系。作O点到B1点的辅助线OB1(下图中两点距离为d),则OB1为OA和AB在xy平面的投影。这里我们假设OX为转台的初始角度,则∠XOB(即图中α)为转台旋转角度,如下所示:

则通过三角函数可得出以下关系:

公式1:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图20

d为OB1,可通过两点距离公式得出如下关系:

公式2:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图21

将“公式1”与“公式2”结合,可得转台旋转角度α与末端坐标的关系如下:

公式3:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图22

      ③ 计算大臂和小臂夹角与坐标之间的关系。作O点和B点之间的辅助线OB(图中两点距离为e),则可知∠OAB(即图中β)为大臂小臂的夹角,如下所示:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图23

从图示关系中,利用三角函数可得以下关系:

公式4:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图24

上式中注意a,b分别为大臂和小臂的长度,可通过实际的进行测量,为已知量;

其中e可根据空间两点距离公式可得:

其中e可根据空间两点距离公式可得:

公式5:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图25

将“公式4”与“公式5”结合可得大小臂夹角β与末端坐标之间的关系如下:

公式6:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图26

④ 计算大臂旋转角度与末端坐标之间的关系。从图中可知∠AOB1(即图中θ)为大臂旋转角度:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图27

如图所示可得以下关系:

公式7:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图28

其中∠AOB在△AOB中利用三角函数求出:

公式8:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图29

其中e的值可通过“公式5”得出;

“公式7”的∠AOB1在△OBB1用三角函数求出:

公式9:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图30

其中z为BB1长度;

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图31

综上“公式7”、“公式8”、“公式9”可得大臂转动角度θ与末端坐标关系:

公式10:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图32

⑤ 接下来计算小臂转动角度与末端坐标之间的关系。求小臂转动角度,我们需要先来看下小臂的0°所在位置,如下所示:

      由上图可知,复位时大臂与小臂夹角θ=90°;而实际的小臂初始角度为Z轴正方向,则此时小臂转动角度λ=90°。那么进行运动后,可如下图所示得出小臂转动与末端坐标之间的关系:

如图可知:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图36

其中θ为大臂角度,β关系满足

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图37

图中θ为大臂转动角度,图中进行了一个简单的几何关系变化。

最后得到简化模型的运动算法:

转台:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图38

大臂:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图39

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图40

小臂:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图41

其中θ为大臂角度,β关系满足

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图42

      注意:a为大臂长度,b为小臂长度,可通过利用配套游标卡尺测量得出;x,y,z为末端需要达到的实际坐标值。

      第四步:接下来计算AC段在运动过程中对各关节角度的影响,这里采用一种利用坐标变化的补偿计算。

这里我们先来说下补偿计算的作用。在第二步中我们说到第三步的算法是将AC段压缩为0进行的计算,那么我们在第三步中利用真实的坐标点来计算各关节角度将会有一定的误差。补偿算法就是将实际的坐标转化为与第三步中所得算法一致的坐标,得出变换后的坐标之后,在带入到第三步的算法中进行计算,这样就可以获得准确的各个关节转动的角度。接下来我们详细了解一下具体的计算:

      ① 我们先在xy平面进行投影,如下所示:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图43

图中0A为大臂,AC为大臂末端与小臂旋转中心的间距,CB为小臂;末端点B坐标为(x,y)。

② 为方便计算,作OA延长线AB1,且作B点在该延长线的垂线BB1,相交于点B1,设B1坐标为(x1,y1);

则从图中可知,转台转动角度为γ(这里默认OX为转台初始位置,因为我们这里通过坐标点求角度,所以γ为未知量);

③ 如下图所示作辅助线,B1点、B点作x轴平行线,且B1点作与B点平行线的垂线,如下所示:

通过平行线定理和余角定理可得:

公式11:∠B1=γ;

④ 接下来作连接OB、及B点在X轴垂线的辅助线,计算转台转动角度,如下图所示:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图46

图中c为大臂末端和小臂旋转中心间距,可通过配套游标卡尺测量,为已知量;

从图中可得:

公式12:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图47

依余弦定理可得:

公式13:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图48

在△BOB1中,依余弦定理可得:

公式14:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图49

其中OB依两点距离公式可得:

公式15:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图50

合并“公式14”、“公式15”,可得:

公式16:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图51

合并“公式12”、“公式13”、公式16,可计算出γ角度:

公式17:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图52

⑤ 接下来如下图所示,在△HBB1中,利用三角函数计算出B1(x1,y1):

公式18:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图54

公式19:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图55

      ⑥ 通过前面的步骤,我们已经计算出第一象限的中的坐标变换,但是在第一象限中的转动范围只有0-90°,实际转动范围是0-180°,所以接下来我们计算第二象限的坐标变换,同前面的步骤,可做如下图:

从图中可知,当位于90°-180°之间时(即图中第二象限),可得转台旋转角度关系如下:

公式20:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图57

公式21:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图58

通过上面步骤,不难在第二象限中得出B点经过坐标变换后得到的B1坐标关系如下:

公式22:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图59

公式23:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图60

⑦ 这里咱们将补充中需要的公式进行总结,如下:

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图61

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图62

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图63

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图64

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图65

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图66

      到这里我们完成了坐标变化的补偿计算。

      第五步:大家已经了解了运动学计算和补偿计算,那么这两个算法如何搭配使用呢?如何利用算法进行机械臂的逆运动控制呢?这里我们可以通过一个简单的流程来理解。

2.3 实验操作

    实现思路:在上位机上通过软件串口监视器,键盘输入机械臂的目标坐标位置,将从起始位置转到目标位置。

    如从串口输入坐标(60,60,60),从坐标点(90,90,90)转动到坐标点(60,60,60)。程序中设置起始位置为(90,90,90)。

  【备注:上面的坐标点单位为mm】

    器材准备:机械臂本体、主控盒、显示屏、键盘、鼠标(如下图所示)

操作步骤:

① 下载文末资料内的参考程序color_experiment_ws\src\InputPoit_By_SerialPort\InputPoit_By_SerialPort.ino:

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-08-10 https://www.robotway.com/

  ------------------------------*/

/*

-----------------------------------------------------------------------------------------------------------------

实验功能:通过arduino的窗口监视器控制机械臂运动。

实验思路:首先编写机械臂三轴运动的逆运动算法(即通过坐标点计算舵机运动的角度);

          之后编写接收arduino串口监视器中的数据,并对该数据进行简单的处理(即数据转换);

          最后,将处理后的数据与机械臂运动算法结合。

实现操作:将该程序下载到arduino开发版,接着按照实验教程连接线路。

        上电后,打开arduino软件的串口监视器,波特率选择115200。

        等待程序运行,直到串口监视器中显示:Please input your poit:

        此时,在串口监视器中输入相应的坐标,观察机械臂是否转到目标点。

        例如:在窗口监视器中输入:60,60,60

                   

实验接线:(主要接线)

        机械臂通信口-------------(机械臂)电控箱

        机械爪(舵机)---------------(执行器)电控箱

        其他线路按照教材图片连接。

Created 2020.7.16     By:Boris.yuan

-----------------------------------------------------------------------------------------------------------------

*/

#include <Arduino.h>

#include <stdio.h>

#include <string.h>

#define CTL_BAUDRATE 115200 //总线舵机波特率

#define SERIAL_PRINTLN Serial1

#define SerialBaudrate 115200

#define Bus_servo_Angle_inits 1500

String receive_string = "";

enum{CATCH=1,REALIZE};

int catch_red_numbers=0;

int catch_blue_numbers=0;

unsigned long old_time = millis();

unsigned long new_time = millis();

unsigned long old_time_blue = millis();

unsigned long new_time_blue = millis();

int value_move[3]={1500,1500,1500};

int last_value[3]={0,0,0};

int poit_sqrt = 0;

int catch_number = 0;

void setup() {

  // put your setup code here, to run once:

  delay(1555);

 

  Serial.begin(SerialBaudrate);delay(1000);

  SERIAL_PRINTLN.begin(CTL_BAUDRATE);delay(1000);

  Bus_servo_angle_init();delay(3000);

  Pneumatic_raw_init();delay(1000);

  Serial.println("Please input your poit:");

}

void loop() {

  Input_poit_by_Serial();

}

void Input_poit_by_Serial()

{

  while(Serial.available()>0)

  {

    Serial.println("------------------------------------------");

    String receive_string ="";

    String string_division = "";

    int comma_first,comma_second;

    int receive_data[3]={0,0,0};

    int string_test = 0;

    receive_string = Serial.readStringUntil('\n');

    string_test = receive_string.toInt();

    comma_first = receive_string.indexOf(',');

    receive_data[0] = receive_string.substring(0,comma_first).toInt();

    string_division = receive_string.substring(comma_first+1);

    comma_second = string_division.indexOf(',');

    receive_data[1] = string_division.substring(0,comma_second).toInt();

    receive_data[2] = string_division.substring(comma_second+1).toInt();

    poit_sqrt = sqrt(receive_data[0] * receive_data[0] + receive_data[1] * receive_data[1] + receive_data[2]*receive_data[2]);

    Serial.println("The coordinates you entered are:");

    Serial.print("(");Serial.print(receive_string);Serial.println(")");Serial.println(" ");

    if( (comma_first>0) && (comma_second>0) )

    {

       if( (receive_data[0] >220) ||   (receive_data[1] >220) || (receive_data[2] >230) || (poit_sqrt>220) )

       {

          Serial.println("Sorry,The poit is wrong!!!");

       }

      else{

          calculate_postion(receive_data[0],receive_data[1],receive_data[2]);delay(2000);

       }     

    }

    else{

          Serial.println("Sorry,The poit is wrong!!!");

    }Serial.println(" ");

  }  

}

 ② 打开串口,选择好波特率和结束符(如下图所示)。

输入机械臂的目标坐标点,查看返回的结果值。【提示:坐标点的范围为0-220】

③ 现在希望机械臂转动到空间位置点(60,60,60),具体的操步骤如下(注意坐标间隔用英文字符“,”,最后一个坐标没有字符):

点击“发送”后,可以观察到机械臂从原位置转动到目标位置点,同时串口显示目标位置,如下图所示:

当然大家也可以尝试让机械臂转动到(80,80,80),看看效果。

3. 机械臂气动搬运

实现思路:利用串联机械臂的逆运动学算法,实现机械臂的气动搬运。实验场景如下图所示,其中两个物块代表所需要搬运的物品。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图71

操作步骤

① 下载文末资料内的参考程序color_experiment_ws\src\Pneumatic_manipulator_handling\Pneumatic_manipulator_handling.ino:

/*------------------------------------------------------------------------------------
  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
           Distributed under MIT license.See file LICENSE for detail or copy at
           https://opensource.org/licenses/MIT
           by 机器谱 2023-08-10 https://www.robotway.com/
  ------------------------------*/
/*
-----------------------------------------------------------------------------------------------------------------
实验功能:实现气动搬运物体(抓取两个物体,并放置两个物体)。

实验思路:通过三自由度机械臂算法求出机械臂的逆运动算法(通过坐标点计算出机械臂转动角度),接着
                结合气动吸盘,规划机械臂运动路径(即添加坐标点),将物块抓取并搬运到指定目标点。搬运
                结束后,在打开的窗口中可自行输入机械臂要要运行的轨迹点坐标。

实验接线:(主要接线)
          机械臂通信口-------------(机械臂)电控箱
          气动机械臂---------------(执行器)电控箱
          其他线路按照教材图片连接。
Created 2020.7.16     By:Boris.yuan
-----------------------------------------------------------------------------------------------------------------         
*/

#include <Arduino.h>
#include <stdio.h>
#include <string.h>

#define CTL_BAUDRATE 115200 //总线舵机波特率
#define SERIAL_PRINTLN Serial1
#define SerialBaudrate 115200
#define Bus_servo_Angle_inits 1500

String receive_string = "";
enum{CATCH=1,REALIZE};
int catch_red_numbers=0;
int catch_blue_numbers=0;
unsigned long old_time = millis();
unsigned long new_time = millis();
unsigned long old_time_blue = millis();
unsigned long new_time_blue = millis();

int value_move[3]={1500,1500,1500};
int last_value[3]={0,0,0};
int poit_sqrt = 0;
int catch_number = 0;
void setup() {
  // put your setup code here, to run once:
  delay(1555);
  Serial.begin(SerialBaudrate);delay(1000);
  SERIAL_PRINTLN.begin(CTL_BAUDRATE);delay(1000);
  Bus_servo_angle_init();delay(3000);
  Pneumatic_raw_init();delay(1000);
}


void loop() {
  raw_translation();
  delay(8000);
}


void raw_translation()
{
  //catch the first sth
  calculate_postion(60,130,40);delay(3000);
  catch_and_realize_something(0);delay(3000);//catch
  calculate_postion(60,110,80);delay(3000);
  calculate_postion(-120,110,80);delay(3000);
  calculate_postion(-120,130,2);delay(3000);
  catch_and_realize_something(1);delay(3000);//relize
  calculate_postion(-120,130,70);delay(3000);
  calculate_postion(-100,90,70);delay(3000);
 
  //catch the second sth
  calculate_postion(60,100,70);delay(3000);
  calculate_postion(60,130,10);delay(3000);//down
  catch_and_realize_something(0);delay(3000);//catch
  calculate_postion(60,110,80);delay(3000);
  calculate_postion(-120,110,80);delay(3000);
  calculate_postion(-120,130,37);delay(3000);
  catch_and_realize_something(1);delay(3000);//relize
  calculate_postion(-120,130,70);delay(3000);
  calculate_postion(-100,90,70);delay(3000);
  Bus_servo_angle_init();delay(2000);
  delay(1000);  
}

      ② 程序下载完成后,观察气动搬运效果。正常情况下机械臂会先搬运上边的物块,放置在一侧;接着再搬运下边的物块,并把其放置在刚才的第一个物块上。

4. 机械臂手爪搬运

      实现思路:利用串联机械臂的逆运动学算法,实现机械手爪搬运两个物块。实验场景如下图所示,其中两个物块代表所需要搬运的物品。

操作步骤

① 下载文末资料内的参考程序color_experiment_ws\src\Manipulator_handling\Manipulator_handling.ino:

/*------------------------------------------------------------------------------------
   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
           Distributed under MIT license.See file LICENSE for detail or copy at
           https://opensource.org/licenses/MIT
           by 机器谱 2023-08-10 https://www.robotway.com/
   ------------------------------*/
/*
-----------------------------------------------------------------------------------------------------------------
实验功能:实现气动搬运物体(抓取两个物体,并放置两个物体)。

实验思路:通过三自由度机械臂算法求出机械臂的逆运动算法(通过坐标点计算出机械臂转动角度),接着
                结合气动吸盘,规划机械臂运动路径(即添加坐标点),将物块抓取并搬运到指定目标点。搬运
                结束后,在打开的窗口中可自行输入机械臂要要运行的轨迹点坐标。

实验接线:(主要接线)
          机械臂通信口-------------(机械臂)电控箱
          气动机械臂---------------(执行器)电控箱
          其他线路按照教材图片连接。
Created 2020.7.16     By:Boris.yuan
-----------------------------------------------------------------------------------------------------------------         
*/

#include <Arduino.h>
#include <stdio.h>
#include <string.h>

#define CTL_BAUDRATE 115200 //总线舵机波特率
#define SERIAL_PRINTLN Serial1
#define SerialBaudrate 115200
#define Bus_servo_Angle_inits 1500

String receive_string = "";
enum{CATCH=1,REALIZE};
int catch_red_numbers=0;
int catch_blue_numbers=0;
unsigned long old_time = millis();
unsigned long new_time = millis();
unsigned long old_time_blue = millis();
unsigned long new_time_blue = millis();

int value_move[3]={1500,1500,1500};
int last_value[3]={0,0,0};
int poit_sqrt = 0;
int catch_number = 0;
void setup() {
   // put your setup code here, to run once:
   delay(1555);
   Serial.begin(SerialBaudrate);delay(1000);
   SERIAL_PRINTLN.begin(CTL_BAUDRATE);delay(1000);
   Bus_servo_angle_init();delay(3000);
   Pneumatic_raw_init();delay(1000);
}


void loop() {
   raw_translation();
   delay(8000);
}


void raw_translation()
{
   //catch the first sth
   calculate_postion(60,130,40);delay(3000);
   catch_and_realize_something(0);delay(3000);//catch
   calculate_postion(60,110,80);delay(3000);
   calculate_postion(-120,110,80);delay(3000);
   calculate_postion(-120,130,2);delay(3000);
   catch_and_realize_something(1);delay(3000);//relize
   calculate_postion(-120,130,70);delay(3000);
   calculate_postion(-100,90,70);delay(3000);
   
   //catch the second sth
   calculate_postion(60,100,70);delay(3000);
   calculate_postion(60,130,10);delay(3000);//down
   catch_and_realize_something(0);delay(3000);//catch
   calculate_postion(60,110,80);delay(3000);
   calculate_postion(-120,110,80);delay(3000);
   calculate_postion(-120,130,37);delay(3000);
   catch_and_realize_something(1);delay(3000);//relize
   calculate_postion(-120,130,70);delay(3000);
   calculate_postion(-100,90,70);delay(3000);
   Bus_servo_angle_init();delay(2000);
   delay(1000);   
}

② 程序下载完成后,观察搬运效果。

5. 机械臂位置反馈

      实现思路:让机械臂做3组动作,然后返回其相应的舵机的pwm值。其中机械臂包括转台、大臂、小臂三部分,实验中将分别返回控制其三部分的舵机Pwm值。

样机方案-【R332】桌面级机械臂-3.运动控制-视觉-颜色识别-气动搬运-ROS-蓝牙遥控-算法-仿真-路径规划-人工智能-机器谱robotway-开源-图73

每个总线舵机的pwm范围为:500~2500,每个舵机模式为:180度。

所以舵机的实际角度与pwm映射关系为:angle=map(要输入的pwm值:500,2500,0,180)。明白了此原理后,接下来就可以实际操作了。

操作步骤:

① 下载文末资料内的参考程序color_experiment_ws\src\Get_BusServo_Current_Angle\Get_BusServo_Current_Angle.ino:

/*------------------------------------------------------------------------------------
  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
           Distributed under MIT license.See file LICENSE for detail or copy at
           https://opensource.org/licenses/MIT
           by 机器谱 2023-08-10 https://www.robotway.com/
  ------------------------------*/
/*
-----------------------------------------------------------------------------------------------------------------
实验功能:在串口监视器中查看舵机当前转动的角度。

实验思路:首先编写驱动总线舵机驱动程序,之后,编写接收串口监视器数据的程序,接着将
        串口监视器接收的数据进行简单的处理,最后,将处理后的数据与机械臂各部位结合。
       
实验操作:将该例程下载到arduino开发版,接着按照实验教程连接线路,完成后,打开arduino
        的串口监视器,结合总线舵机使用教程,观察串口监视器中的数据是否与总线舵机教程相符。             
        例如串口监视器输出的:总线舵机000:#000P1114!表示的意思是:
                              地址为000的总线舵机(即转台)当前的pwm值为1114(即55度)。
                              度数angle与pwm的关系式为: angle = map(pwm,500,2500,0,180)
实验接线:(主要接线)
          机械臂通信口-------------(机械臂)电控箱
          其他线路按照教材图片连接。
Created 2020.7.16     By:Boris.yuan
-----------------------------------------------------------------------------------------------------------------         
*/


#include <stdio.h>
#include <string.h>

#define CTL_BAUDRATE 115200 //总线舵机波特率
#define SERIAL_PRINTLN Serial1
#define SerialBaudrate 115200
#define Bus_servo_Angle_inits 1500

String receive_string="";
int value_move[3]={1500,1500,1500};
int last_value[3]={0,0,0};

void setup() {
  // put your setup code here, to run once:
  delay(1100);
  Serial.begin(SerialBaudrate);
  SERIAL_PRINTLN.begin(CTL_BAUDRATE);
  Serial.println("Start!");
  Bus_servo_angle_init();delay(2000);
  int ss = map(1114,500,2500,0,180);
  Serial.println(ss);
}



void loop() {

  for(int i=0;i<3;i++)
  {
    arm_action_test(i);
    for(int j=0;j<3;j++){
      Read_get_busservo_angle_current(j);
      delay(1000);
    }
    delay(5000);
  }
}

② 打开串口,查看返回的结果值(如下图所示)。

程序源代码及总线舵机ID及模式更改资料下载地址详见 桌面级机械臂-运动控制

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划-路径问题

不同路径&#xff08;medium&#xff09; 题目链接: 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

博流RISC-V芯片Eclipse环境搭建

文章目录 1、下载 Eclipse2、导入 bouffalo_sdk3、编译4、烧录5、使用ninja编译 之前编译是通过 VSCode 编译&#xff0c;通过手工输入 make 命令编译&#xff0c;我们也可以通过 Eclipse 可视化 IDE 来编译、烧录。 1、下载 Eclipse 至 Eclipse 官网 https://www.eclipse.org…

【JavaSE专栏91】Java如何主动发起Http、Https请求?

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN学院、蓝桥云课认证讲师。 主打方向&#xff1a;Vue、SpringBoot、微信小程序 本文讲解了如何使用…

VMware标准虚拟交换机和分布式交换机

一、虚拟交换机 初期的网络虚拟化&#xff0c;是非常狭义的概念&#xff0c;主要指的是因为计算资源虚拟化&#xff0c;每台物理宿主机上安装了虚拟化软件&#xff0c;同时会部署了虚拟交换机&#xff0c;负责物理机上面承载的VM&#xff08;虚拟机&#xff09;之间与对外的通…

【Rust日报】2023-08-28 WASM 微运行时与 Rust

WASM 微运行时与 Rust 传统上&#xff0c;微控制器只能运行 C 代码。固件开发人员通常会使用 Eclipse 基于 IDE 以及定制的编译器工具链来编译代码。但是&#xff0c;MicroPython 最近变得流行起来。RaspberryPi Pico、ExpressIf 的 ESP32 是一些对 MicroPython 支持相当不错的…

直流电源开关TMI6240I/6250I——解决分立MOS开关易失效,安全更可靠

互联网时代带动了电子产品行业的发展&#xff0c;人们对电子产品的需求越来越高&#xff0c;TV、显示器、笔记本、智能家居、平板等产品只增不减&#xff0c;为生活提供了极大的便利。与此同时&#xff0c;随着拥有的电子产品增多也带来了不少”烦恼“——产品越多&#xff0c;…

标杆项目,获奖!

近日&#xff0c;第二届“光华杯”千兆光网应用创新大赛东部大区赛决赛在上海举行。天翼物联、南京港华燃气联合申报的“千兆光网融物赋智&#xff0c;赋能大型城市燃气安全及智慧运营”项目荣获三等奖并晋级全国总决赛。 今年以来&#xff0c;中国信息通信研究院联合中国通信标…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目&#xff0c;环境&#xff1a;JDK8&#xff0c;添加依赖&#xff1a;Spring Web、MyBatis FrameWork(最主要&#xff09; 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包&#xff0c;名字为core&#xff0c;表示核心类…

2023最新Python重点知识万字汇总

这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点。由于总结了太多的东西&#xff0c;所以篇幅有点长&#xff0c;这也是作者"缝缝补补"总结了好久的东西。 **Py2 VS Py3** * print成为了函数&#xff0c;python2是关键字* 不再有unicode对象…

赢得明星代言:邀请明星成为品牌代言人的步骤与注意事项

在品牌推广和营销中&#xff0c;与明星合作做代言人是一种常见的策略&#xff0c;可以有效地提升品牌知名度和形象。然而&#xff0c;找明星做代言人并不是一件轻松的事情&#xff0c;需要慎重考虑和策划。媒介易拥有3000多位一二线明星合作资源&#xff0c;为您提供专业的明星…

基于java+springboot+vue的简历系统

​ 系统介绍&#xff1a; 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方…

基于Java的基数排序(详述)

基于Java的基数排序&#xff08;详述&#xff09; 原理介绍Java实现文献参考 原理介绍 一、什么是基数排序 &#xff08;1&#xff09;通过键值得各个位的值&#xff0c;将要排序的元素分配至一些桶中&#xff0c;达到排序的作用 &#xff08;2&#xff09;基数排序法是属于稳…

Mybatis1.3 查询详情

1.3 查询详情 1.3.1 编写接口方法1.3.2 编写SQL语句1.3.3 编写测试方法1.3.4 参数占位符1.3.5 parameterType使用1.3.6 SQL语句中特殊字段处理 有些数据的属性比较多&#xff0c;在页面表格中无法全部实现&#xff0c;而只会显示部分&#xff0c;而其他属性数据的查询可以通过 …

常用免费 API 接口推荐与分享,收藏备用

写在最前 各类免费 API 接口整理&#xff0c;主要是 LuckyCola上和其他各类开放平台上的一些&#xff0c;有需要的赶紧收藏备用。 一、LuckyCola免费api系列: 官网地址:LuckyCola 免费图床 | 智能对话机器人AI | 网站监控与免费API费图床是一款提供高质量图片上传与分享的平…

风丘方案助力车企升级 解决“国六”标准新难题

一 背景 尾气排放指标是衡量汽车质量和品质的主要指标之一&#xff0c;且汽车的尾气排放必须达到相应的标准才准许出厂&#xff0c;因此&#xff0c;对汽车排放的尾气进行检测是汽车生产过程的重要环节。汽车尾气检测过程是在排放实验室里进行的&#xff0c;这需要模拟汽车实际…

MySQL8.0.30一主两从复制与配置(一)

MySQL8.0.30一主两从复制与配置(一)_蜗牛杨哥的博客-CSDN博客 MySQL8.xx一主两从复制安装与配置 MySQL8.XX随未生成随机密码解决方案 本文主要对: MySQL8.xx安装与配置 的完善与补充 一: 搭建环境 主机IP 端口 节点备注192.168.1.100 …

Gazebo打不开,报错process has died[pid 7798, exit code1]解决办法

Gazebo打不开&#xff0c;报错process has died[pid 7798, exit code1]&#xff0c;如下图所示&#xff1a; 原因&#xff1a;可能是由于有gazebo进程没有终止&#xff0c;所以无法打开。 解决办法&#xff1a;依次执行下面两个命令 killall gzserver killall gzclient问题解…

算法通关村-----位运算的规则

1 数字在计算机中的表示 机器数&#xff1a;一个数在计算机中的二进制表示 真值&#xff1a;带符号位的机器数对应的真正数值 机器数可分为原码、反码和补码。 原码&#xff1a;符号位加上真值的绝对值 反码&#xff1a;正数的反码是其本身&#xff0c;负数的反码的在其原…

基于ssm医院在线挂号预约系统源码和论文

基于ssm医院在线挂号预约系统源码和论文072 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 课题研究的目的及意义&#xff1a; 专家号难求&#xff0c;是医院现场挂号存在的主要问题之一&#xff0c;每一名专…

【算法专题突破】双指针 - 有效三角形的个数(5)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;611. 有效三角形的个数 - 力扣&#xff08;Leetcode&#xff09; 我们可以根据示例1来理解这一道题目&#xff0c; 他说数组里面的数可以组成三角形三条边的个数&#x…