【如何使用ROS和Arduino控制机器人手臂】

1. 前言

在本系列关于机械臂控制的这一部分中,学习使用 Arduino 和 ROS 构建一个非常简单的机械臂。
在这里插入图片描述

机器人操作系统(ROS)是领先的机器人控制中间件/软件。完整的 ROS 生态系统提供了实现机器人运动学、动力学、运动控制、运动规划、感知和仿真算法所需的所有工具。在上一篇文章《如何将Arduino与机器人操作系统(ROS)一起使用》中,我们学习了如何将ROS与Arduino一起使用,并使用ROS模拟虚拟机器人手臂上的随机运动序列。

本文又迈出了一步,使用 Arduino 构建一个非常简单的机器人手臂,并使用 ROS 进行实时机器人控制和运动。

Robotic_Arm_AK_MP_image1.png

本文又迈出了一步,使用 Arduino 构建一个非常简单的机器人手臂,并使用 ROS 进行实时机器人控制和运动。

2. 设计机械臂

我建造了一个简单的5自由度机器人手臂。该机器人只有由SG90低扭矩和廉价的爱好伺服电机驱动的蜗壳关节。这些电机是位置控制的,需要PWM信号才能运动。对于伺服系统的低级控制,使用Arduino Uno。

你可以在我的GitHub上找到代码。此处使用的硬件组件包括:

  1. SG90伺服电机 (5)
  2. Arduino Uno R3 开发板
  3. 用于制造机器人手臂链接的支架
    我构建了机器人的3D CAD模型,用于测量和3D打印。我用纸板制作了机器人,但鼓励读者使用CAD模型并3D打印零件。CAD文件可以在Github存储库中找到。

Robotic_Arm_AK_MP_image5.png

机器人3D模型。第一张图片是机器人的原位(图片来源-原图)

上一篇文章中关于机器人操作系统(ROS)中的机械臂仿真的机器人手臂URDF是一个非常基本的设计。对于这个项目,我使用伺服和接头的粗略近似创建了一个 URDF。读者可以尝试使用存储库中提供的 STL 文件创建 URDF。机器人的虚拟模型具有相同的视觉和碰撞链接。机器人关节被命名为joint_0、joint_1、joint_2、joint_3,并在机器人底座上joint_4 joint_0。

注意: 第一个用于joint_0的伺服器位于圆盘平台内。它在 URDF 中不可见,但可以在 CAD 模型的分解视图中看到。

Robotic_Arm_AK_MP_image4.png

机器人URDF模型。伺服器表示为合并的斑点,蓝色末端执行器仅用于可视化目的。- (图片来源 - 原始)

3. 构建机器人硬件

为了便于制造,我使用了容易获得的纸板。只有几个部分是我用强力胶剪下来组装在一起的。您可以参考 CAD 文件进行测量。

这里使用的SG90伺服电机的角度范围为0-200°。URDF文件中的关节角度限制在家乡以±“90°”为中心。归位偏移量在Arduino代码中完成。

注意: 将连杆安装到舵机时,请确保将舵机驱动到90°的原始位置,以使连杆在任一旋转方向上具有±“90°”运动。

4. 将机械臂与Arduino连接

伺服电机需要PWM信号进行运动,Arduino Uno上的几个数字引脚能够产生PWM信号。这些数字引脚用于连接伺服系统。下图显示了连接。

Robotic_Arm_AK_MP_image6.png

伺服电机与Arduino的连接(图片来源 - Fritzing的原始内容)

5. 设置基础结构

ROS包的文件结构-(图片来源-原始)

cad - 3D 机器人模型的所有 STL 文件。
CMakeLists.txt - CMake 元构建系统的脚本
robot-arm-control-arduino - 与ROS节点通信的Arduino代码
启动 - 包含 Rviz 模拟器的启动文件
src - 包含将联合指令发布到 Arduino 的节点
urdf - 包含机器人的 URDF 模型
rviz - 包含 Rvix 模拟器的默认配置

6. 代码和说明

Robotic_Arm_AK_MP_image3.png

ROS指令流水线(图片来源-原文)

6.1 启动文件

启动文件类似于上一篇文章中使用的启动文件。它启动robot_state_publisher节点,并在 Rviz 上可视化 URDF 模型。它还启动joint_state_publisher节点,该节点创建一个带有滑块的GUI,以控制伺服的每个关节。这些关节指令通过便于通信以控制真实机器人的serial_node发布到robot_state_publisher以及Arduino(以了解机器人所需的关节角度)使用的joint_states主题。

6.2 Arduino Code

Arduino 代码是不言自明的,并且注释很好,但对于想要扩展代码的读者,这里有一些建议:

  • 在 loop() 函数中,调用 node_handle.spinOnce() 是为了确保 ROS 处理所有消息、订阅者回调和其他缓冲区。读者可以使用 node_hanlde.spin() 在 Arduino loop() 方法之外进行无限循环。
  • 在 setup() 方法中,在 node_handle() 上调用 init() 之前设置波特率很重要,否则波特率设置不正确并导致通信问题。
  • 调用 writeServos() 来更新伺服位置直接将伺服位置设置为使用所需的值,从而导致抖动。读卡器可以实现插值或轮廓运动,以实现更平滑的运动。
    此处使用的Arduino Uno具有低缓冲区和内存,当使用多个内存消耗消息时,这会导致性能问题。切换到Arduino Mega以避免这种情况。

6.3 程序执行

通过USB电缆将Arduino Uno连接到笔记本电脑,并确认该板出现在Arduino IDE的可用串行端口列表中。编译代码,选择板类型,并将其上传到板。

上传代码后,同时在机器上的多个终端中执行以下命令。

启动 ROS 主控 - roscore
在机器上运行 rosserial 客户端 - rosrun rosserial_python serial_node.py _port:=/dev/tty<USB# 或 ACM#> _baud:=115200
串行端口在运行时确定为 ttyUSB 或 ttyACM。 可以找到确切的端口号
来自 Arduino IDE 或使用 dmesg | grep tty。
运行启动文件以模拟和控制机器人。- ROS发射机器人-手臂-控制-ROS模拟发射
Arduino现在可以看到joint_states主题以及GUI发布到它的数据,从而控制机器人上的伺服系统。

7. 结论

将Arduino和ROS与实际应用程序接口是非常有趣的,它为探索ROS中的严格软件开发提供了机会。在本文之前,我们控制机器人处于联合状态以进行远程操作,但机器人手臂控制的真正本质在于使用系统的运动学和动力学。

猜你喜欢

转载自blog.csdn.net/vor234/article/details/129643319