机器人夹爪的选型与ROS通讯——机器人抓取系统基础系列(六)

article/2025/6/26 11:15:52

文章目录

  • 前言
  • 一、夹爪的选型
    • 1.1 任务需求分析
    • 1.2 软体夹爪的选型
  • 二、夹爪的ROS通讯
    • 2.1 夹爪的通信方式介绍
    • 2.2 串口助手测试
    • 2.3 ROS通讯节点实现
  • 总结
  • Reference:


前言

本文将介绍夹爪的选型方法和通讯方式。以鞋子这类操作对象为例,将详细阐述了对应的夹爪选型过程及其ROS通讯控制方法。


一、夹爪的选型

1.1 任务需求分析

夹爪选型的第一步是确定任务需求,然后根据任务需求逐步确定夹爪的要素。
任务需求能够用两类宏观的参数进行概括 [1]:

第一类是描述物体的属性,包括物理属性和几何属性。
1)物理属性包括诸如尺寸、重量、刚度等,对于一些特殊行业可能还要考虑电导率(3C行业)和卫生性(食品行业);
2)几何属性包括形状、粗糙度、结构等。

第二类是描述物体的操作需求,比如
1)放置(例如高精度对准);
2)上料(例如上料物体的定向/非定向状态);
3)搬运(例如提升、移动、重定向)。

以鞋子打包任务为例,被操作对象为鞋子(图1),分析如下:
物体属性:鞋子可变形而且形状不规则,鞋子的重量虽轻,但是其尺寸各异。
操作需求:鞋子的放置虽然不需要高精度,但是从任意初态到打包状态,需要对物体进行重定向。
鞋子的属性

图1:某品牌单只运动鞋的属性。

综合上述两类宏观参数,软体夹爪为优先选择。首先,软体夹爪对于鞋子的形状、刚度、尺寸都具有较好的适应性;其次,在重定向过程中,软体夹爪的柔顺性也能够保护鞋面不被划伤。尽管软体夹爪的夹持力较小并且精度有限,但能够满足该任务的需求。

1.2 软体夹爪的选型

对于软体夹爪,国内的厂家主要有Rochu [2] 和SRT [5] 两家。对于该任务,两家的产品均能满足需求,本文以Rochu夹爪为例,简单展示其选型过程。

根据上述分析,鞋子的长度较长,为了稳定地抓取,最好选择两指并拢的四指布局。同时,Rochu的末端执行器是模块化的,所以要按照模块逐步选择(图2)。

柔触抓取系统

图2:柔触抓取系统 [3]。左:完整的机器人抓取系统。右:机器人末端执行器模块。

针对鞋子打包任务,各模块选择的主要依据如下:
1)手指模块选型的主要依据是鞋子的高度,确保能够有效包络鞋子;
2)滑移安装板选型的主要依据是鞋子的宽度,确保其指间距足够大;
3)法兰连接模块需要考虑其长度对安装的便携性;
4)快换模块对于此任务暂不需要;

综合上述因素,最终确定的柔触夹爪的型号为GC-4FMA6V5/LS1-SMP2L-FCMR03。

温馨提示:
1)柔触夹爪的选型手册下载地址:https://www.rochu.com/fileDownload。
2)对于各模块的选型,相关销售也会辅助决策。

二、夹爪的ROS通讯

2.1 夹爪的通信方式介绍

当机器人的末端执行器确定之后,需要确定其对应的驱动器。本案例选择无源驱动器PCU(图3),其输入包括来自气泵的气体和电脑的控制信号,其输出气体直接控制着夹爪的状态 [4]。
柔触夹爪驱动器

图3:柔触驱动器(PCU)的功能示意图 [4]。

根据驱动器手册 [4],驱动器的控制方式有以下两种:
1)I/O控制方式:通过24VDC电平信号和DB25端口进行控制。
2)Modbus通信方式:通过TCP/RTU-485协议进行通信。

如果要集成到ROS系统,推荐使用Modbus通信方式,因为它提供了更灵活的控制方式,并且可以通过网络进行通信,适合ROS环境中的分布式控制。

在进行通讯测试之前请确保所有的气路连接和通讯连接都已完成。如图3所示,包括进气口和出气口,还有Modbus通信连接线。如果使用Modbus TCP,就准备网线,如果使用Modbus RTU-485,就准备好USB转485的通讯数据线。

本文以Modbus RTU-485通讯方式为例,需要额外准备一根USB转485的通讯数据线,其端口TR+/TR-和DB25的17/18端子线(对应485通讯)连接,以保证信号的转换和传输。

2.2 串口助手测试

在进行ROS通讯之前,最好先进行串口通讯测试,一方面可以测试系统的联通性,另一方面可以熟悉系统的工作特性。其中,夹爪的状态包括open, close, nature三个状态,而夹爪的控制信号是四个,分别是open, relax_open, close, relax_close (如图5(a)所示)。

在Windows上进行串口测试时,首先确保系统的串口驱动已安装,然后再安装串口助手软件(如SSCOM,ECOM等)。串口助手的通讯参数设置如图4(左)所示,发送的十六进制指令的对应功能参考PCU驱动器手册 [4]。

串口助手

图4:串口助手界面。左:Windows中的ECOM串口助手。右:Ubuntu中的CuteCom串口助手。

对于Ubuntu系统,可安装其串口助手如cutecom(图4(右)),进行通讯测试,通讯参数设置和Windows类似。以cutecom串口助手为例,其安装和串口设置如下所示 [6]:

# 安装cutecom
sudo apt-get install cutecom# 编辑串口权限
ls -l /dev/ttyUSB* # 串口查询并设置权限
sudo chmod 777 /dev/ttyUSB0  #根据自己的设备名自行改变# 打开串口
cutecom

注意在cutecom串口中输入的16进制控制指令,要加上末尾的CRC校验码,在图4(左)的Windows串口助手中的历史数据就是包含CRC校验码的数据。这些带CRC校验码的16进制控制指令也将会用到接下来的ROS通讯中。

2.3 ROS通讯节点实现

ROS的serial功能包是一个用于ROS与串行设备进行通信的库。这个库是跨平台的,简单易用,它提供了一个C++的面向对象接口。通过安装serial功能包,可以创建一个串口对象,并通过该对象的成员函数read读取数据。serial功能包的安装指令如下:

sudo apt update
sudo apt install ros-noetic-serial # 注意替换为你的系统名称

这里创建一个专门用于ROS和串行设备通信的功能包,该功能包的消息传输路线如下图5(b)所示,该功能包包括两个节点 [7]。
夹爪不同状态切换和ROS通讯控制

图5:夹爪的不同状态切换和ROS通讯控制功能包。(a)夹爪的三个状态和控制它们之间切换的四个控制指令(通过/gripper_control话题传输给ROS通讯功能包)。(b)控制串口设备(如本文柔触驱动器)的ROS通讯功能包的话题消息传递。

第一个节点负责接受Gripper的指令,Rochu Gripper的四个指令包括open, relax_open, close, relax_close(图5(a)),然后将这些指令转换为对应的Modbus RTU协议格式16进制控制指令发布出去。具体实施代码和详细注释如下所示:

#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Bool.h>
#include <std_msgs/Empty.h>
#include "serial_msgs/serial.h"#define rBUFFERSIZE 8  // 定义接收缓冲区大小
unsigned char r_buffer[rBUFFERSIZE];  // 接收缓冲区
serial::Serial ser;  // 串口对象
std_msgs::String gripper;  // 夹爪控制消息// 订阅者回调函数,接收夹爪控制指令
void write_callback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO_STREAM("写入串口数据: " << msg->data);gripper.data = msg->data;  // 更新夹爪状态
}int main(int argc, char** argv)
{// ROS节点初始化ros::init(argc, argv, "serial_example_node1");ros::NodeHandle nh;// 创建订阅者订阅夹爪控制指令ros::Subscriber write_sub = nh.subscribe("/gripper_control", 10, write_callback);// 创建发布者发布串口消息ros::Publisher msg_pub = nh.advertise<serial_msgs::serial>("read1", 10);// 设置循环频率50Hzros::Rate loop_rate(50);while(ros::ok()){serial_msgs::serial msg;  // 创建串口消息对象msg.serial.clear();      // 清空消息内容ros::spinOnce();  // 处理回调函数// 根据接收到的指令生成对应的串口控制指令if(gripper.data == "close") {          // 闭合夹爪指令r_buffer[0] = 0x01;r_buffer[1] = 0x05;r_buffer[2] = 0x01;r_buffer[3] = 0x00;r_buffer[4] = 0xFF;r_buffer[5] = 0x00;r_buffer[6] = 0x8D;r_buffer[7] = 0xC6;}else if(gripper.data  == "relax_close") { // 松开闭合指令r_buffer[0] = 0x01;r_buffer[1] = 0x05;r_buffer[2] = 0x01;r_buffer[3] = 0x00;r_buffer[4] = 0x00;r_buffer[5] = 0x00;r_buffer[6] = 0xCC;r_buffer[7] = 0x36;}else if(gripper.data  == "open") {      // 打开夹爪指令r_buffer[0] = 0x01;r_buffer[1] = 0x05;r_buffer[2] = 0x01;r_buffer[3] = 0x01;r_buffer[4] = 0xFF;r_buffer[5] = 0x00;r_buffer[6] = 0xDC;r_buffer[7] = 0x06;}else if(gripper.data == "relax_open") { // 松开打开指令r_buffer[0] = 0x01;r_buffer[1] = 0x05;r_buffer[2] = 0x01;r_buffer[3] = 0x01;r_buffer[4] = 0x00;r_buffer[5] = 0x00;r_buffer[6] = 0x9D;r_buffer[7] = 0xF6;}// 将缓冲区数据填充到消息中for(int l=0; l<rBUFFERSIZE; l++) {msg.serial.push_back(r_buffer[l]);}msg_pub.publish(msg);  // 发布串口消息loop_rate.sleep();     // 维持循环频率}
}

第二个节点负责接受第一个节点传过来的控制指令,然后将其通过成员函数read写到串口设备。具体实施代码和详细注释如下所示:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "serial_msgs/serial.h"
#include <serial/serial.h>
#include <std_msgs/Empty.h>#define sBUFFERSIZE 8       // 定义发送缓冲区大小
unsigned char s_buffer[sBUFFERSIZE]; // 发送缓冲区
serial::Serial ser;         // 串口通信对象// 串口数据回调函数
void chatterCallback(const serial_msgs::serial::ConstPtr& msg)
{ROS_INFO_STREAM("正在写入串口数据");// 将接收到的消息数据复制到发送缓冲区for(int i=0; i<msg->serial.size(); ++i){s_buffer[i] = msg->serial[i];}// 通过串口发送二进制数据ser.write(s_buffer, sBUFFERSIZE);
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "listen1");ros::NodeHandle n;// 串口配置和初始化try {ser.setPort("/dev/ttyUSB0");    // 设置串口设备ser.setBaudrate(9600);          // 设置波特率serial::Timeout to = serial::Timeout::simpleTimeout(1000);ser.setTimeout(to);             // 设置超时时间ser.open();                    // 打开串口} catch (serial::IOException& e) {ROS_ERROR_STREAM("无法打开串口端口"); // 异常处理return -1;}// 检查串口是否成功打开if(ser.isOpen()) {ROS_INFO_STREAM("串口初始化成功");} else {return -1;}// 创建订阅者,监听read1主题ros::Subscriber sub = n.subscribe("read1", 10, chatterCallback);// 进入ROS事件循环ros::spin();return 0;
}

在调试节点时,可以使用以下常用的关于ros topic的指令来调试:

rostopic list # 列出当前所有活跃的话题。
rostopic info /topic_name # 显示指定话题的详细信息,包括发布者和订阅者。
rostopic echo /topic_name # 打印指定话题上的消息内容。
rostopic pub /topic_name message_type "message_content" # 向指定话题发布消息。message_type 是消息的类型,message_content 是消息内容。

本文中ROS和串口设备(如本文柔触驱动器)通讯的完整功能包下载地址参考博主的博客资源。
本文是以柔触的旧版驱动器(PCU-v1.2.6)开展的实验,注意和新版驱动器的区别。


总结

本文主要讲解了夹爪的选型和通讯控制。首先介绍了如何根据任务需求对夹进行选型,其次以柔触夹爪为例,讲解了其控制方式和ROS通讯控制方法,为类似的夹爪选型和通讯任务提供参考。

Reference:

[1] Fantoni G, Capiferri S, Tilli J. Method for supporting the selection of robot grippers[J]. Procedia CIRP, 2014, 21: 330-335.
[2] 柔触官网:https://www.rochu.com/.
[3] 柔触机器人选型手册V2.6版: https://www.rochu.com/fileDownload.
[4] Rochu用户手册PCU-V1.2.6版: https://www.rochu.com/fileDownload.
[5] SRT官网:https://softrobottech.com/.
[6] Linux下使用可视化的串口调试工具cutecom: https://www.cnblogs.com/Netsharp/p/16010814.html.
[7] 在ROS中与其他器件使用十六进制串口通信 - 代码下载: https://download.csdn.net/download/chduan_10/9920218.


http://www.hkcw.cn/article/EOwWPGuvHq.shtml

相关文章

003-Python-脚本学习-安装mysql数据库(CentOS7.9)

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Name: Python-脚本学习-安装mysql数据库&#xff08;CentOS7.9&#xff09;.py # Author: songp-it # Date: 2024-03-21 # Description: 在CentOS 7.9上安装MySQL数据库import subprocess import sys import osdef disable_s…

数字孪生离心泵,精准复刻泵体运行

图扑数字孪生离心泵&#xff0c;以 1:1 高精度建模&#xff0c;逼真呈现离心泵结构。动态模拟内部水流与部件运转&#xff0c;实时反馈运行参数&#xff0c;助力运维人员精准掌握泵体状态&#xff0c;高效诊断故障&#xff0c;提升离心泵运行管理水平。

这几种“奇葩果” 买了就后悔!

这几种“奇葩果”买了就后悔。“拇指西瓜”,长得像西瓜的微缩板,但压根不是西瓜。吃起来也远没有西瓜的甘甜多汁。刺角瓜,也叫火参果。很多人因为奇异的外表而好奇购买,味道酸涩。虽然富含维生素C与膳食纤维,但价格却被商家炒得过于昂贵。露兜果,也叫野菠萝,外观形似菠萝…

王楚钦与女粉丝合影手立马放背后,妥妥的男德模范生!

王楚钦与女粉丝合影手立马放背后。王楚钦现身魏桥参加活动,现场人气爆棚,大批球迷慕名而来,只为近距离目睹偶像风采。难得的机会让合影环节热度高涨,王楚钦又成了人形打卡机,耐心地满足球迷的合影请求。遇到女性球迷合影时,王楚钦的手臂自动就藏了起来,保持得体的距离,…

Java开发工具——Arthas线上查询工具

摘要 本文主要介绍了 Java 开发工具 Arthas 的安装、启动及使用。包括本地安装与启动、容器安装与启动、基础命令与使用以及常用命令与使用等内容。通过 Arthas&#xff0c;开发者可以方便地对 Java 应用进行线上排错和监控&#xff0c;提高开发效率。 1. Arthas 本地安装与启…

5.RV1126-OPENCV 图形计算面积

一.图形面积、弧长计算介绍 前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的 API 如 contourArea…

rabbitmq Topic交换机简介

1. Topic交换机 说明 尽管使用 direct 交换机改进了我们的系统&#xff0c;但是它仍然存在局限性——比方说我们的交换机绑定了多个不同的routingKey&#xff0c;在direct模式中虽然能做到有选择性地接收日志&#xff0c;但是它的选择性是单一的&#xff0c;就是说我的一条消息…

JavaSE 常见问题解析

最近正在复习Java八股&#xff0c;所以会将一些热门的八股问题&#xff0c;结合ai与自身理解写成博客便于记忆 本文将以以上问题作为基础 String 相关问题 String 底层数据类型&#xff1f; String 在 Java 9 之前底层使用 char[] 数组存储字符数据&#xff0c;Java 9 及以…

潜入水面:穿越“冰山”之旅,探寻Java鲜为人知的一面

“冰山”梗是一种网络现象&#xff0c;幽默而有时令人不安地展示了某个主题的知识或入门层次——从冰山之巅简单、广为人知的常识到只有最坚韧的老兵才能理解的黑暗、神秘深处。想象一座海洋上矗立的冰山&#xff1a;表面可见的部分只是开始&#xff0c;真正的魔法&#xff08;…

如何配置mvn镜像源为华为云

如何配置mvn镜像源为华为云 # 查找mvn 配置文件 mvn -X help:effective-settings | grep settings.xml# 配置mvn镜像源为华为云&#xff0c;/home/apache-maven-3.9.5/conf/settings.xml文件路径需要根据上一步中查询结果调整 cat > /home/apache-maven-3.9.5/conf/setting…

【DAY37】早停策略和模型权重的保存

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a; 对信贷数据集训练后保存权…

TASK OA 案例hook

TASK OA 案例hook 定义的状态 useRef & useForm ref使用&#xff1a; xxx 尽可能使用组件库antd内部提供的方法 两大稍微比较难的组件&#xff1a;table 和 form 服务器通信 使用async/await 不用想配套使用 try/catch 初次渲染拉取query。useEffect(..., []) 状态更新useE…

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot

Kafka集成Flume Flume生产者 ③、安装Flume&#xff0c;上传apache-flume的压缩包.tar.gz到Linux系统的software&#xff0c;并解压到/opt/module目录下&#xff0c;并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…

Linux指令:

我们今天来学习一下linux的一些相关的指令L&#xff1a; 1. 快速认识6~8个指令&#xff1a; 第一条&#xff1a;pwd pwd指令表示的是我当前在哪条路径下&#xff1b;我当前在哪里&#xff1b; 我们看这个第二句话&#xff0c;因为在windows环境下&#xff0c;当我们登录进入到…

网络攻防技术五:网络扫描技术

文章目录 一、网络扫描的基础概念二、主机发现三、端口扫描1、端口号2、端口扫描技术3、端口扫描隐秘策略 四、操作系统识别五、漏洞扫描六、简答题1. 主机扫描的目的是什么&#xff1f;请简述主机扫描方法。2. 端口扫描的目的是什么&#xff1f;请简述端口扫描方法及扫描策略。…

win32相关(虚拟内存和物理内存)

虚拟内存和物理内存 在win32操作系统下&#xff0c;每个进程都有它自己独立的4GB空间&#xff0c;是window给它分配的一个虚拟空间&#xff0c;并不是真正的物理空间&#xff0c;这4GB空间中&#xff0c;分为高2G和低2G&#xff0c;高2G是应用程序的&#xff0c;低2G空间是给内…

00后新人“整顿”婚礼 简简单单更实在!

00后新人“整顿”婚礼简简单单更实在!婚礼当天,宾客们刚坐下,新郎新娘就手拉手走上台。新郎咧嘴一笑:“感谢各位来捧场,我俩今天正式领证了!”新娘接茬:“废话不多说,大家吃好喝好,菜不够再加,吃不完打包带走!”台下瞬间爆发出欢呼声,这场婚礼从开始到宣布开席,总…

德约科维奇vs诺里 法网百胜里程碑

北京时间6月2日,法网男单第四轮比赛中,赛会六号种子德约科维奇以6-2、6-3、6-2的比分击败诺里,成功晋级八强。首盘开始,德约连保带破取得2-0领先。尽管诺里随后回破,但德约在第四局再次破发,掌控了比赛节奏。最终在诺里的关键发球局中,德约再次破发,以6-2赢得首盘。第二…

地磁暴又来了!这些地方受影响 我国北部或现极光

中国气象局国家空间天气监测预警中心报告称,北京时间5月31日太阳爆发了耀斑,地球可能连续三天发生地磁暴,我国北部有机会出现较为明显的极光。具体来说,5月31日7点45分左右,太阳活动区14100开始爆发耀斑,软X射线流量快速上升,8点05分达到峰值——M8.1级中等耀斑强度。伴…

北京今天晴朗伴大风 阵风可达6至7级 明起炎热升级 气温将明显升高

今天6月3日,北京天气以晴朗为主,北风加大,阵风可达6至7级。未来两天,北京将继续保持晴朗,气温显著升高。昨天,北京大部分地区晴朗,北部和西部出现分散性阵雨或雷阵雨,但雨量不大。多地北风强劲,阵风达到6至7级。据北京市气象台预计,今天白天晴间多云,北风从2级左右逐…