结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(下)

Limo Pro 小车建图导航

引言

前景提要:我们在上文介绍了使用LIMO cobot 实现一个能够执行复杂任务的复合机器人系统的应用场景的项目,从以下三个方面:概念设计、系统架构以及关键组件。

本文主要深入项目内核的主要部分,同样也主要分为三个部分:机械臂的视觉抓取,LIMO Pro在ROS中的功能,建图导航避障等,以及两个系统的集成。

设备准备

  1. myCobot 280 M5stack
  2. myCobot Adaptive Gripper
  3. myCobot Camera Flange 2.0
  4. LIMO PRO

机械臂视觉抓取

这是机械臂安装 Adaptive Gripper,和 camera flange 2.0之后的样子。

我们是用的camera flange 2.0是一款2D的相机,他并不能够依靠他相机本身来获取到一个物体的三维(长宽高),但我们可以使用标记物来获得到目标物体的都长宽高。常见的有ArUco,STag,AR码,AprilTags。今天我们用STag算法来做视觉识别。

STag标记系统

STag是一个为了高稳定性和精确的三位定位而设计的标记系统。它特别适用于环境中有遮挡和光照变化的情况。

下面有一个视频展示了STag标记码,ARToolKit+,ArUco,RUNE-Tag码在同一个环境下的识别效果。

https://www.youtube.com/watch?v=vnHI3GzLVrY

可以从视频中看出来STag对环境变化的强大适应性和在复杂场景下的高可靠性,使其成为在要求高精度跟踪和定位的应用中的首选。还有一篇论文专门讲解STag稳定的基准标记系统,感兴趣的可以自己点击链接去了解一下。

https://arxiv.org/abs/1707.06292

STag系统可以是适配与ROS,有ROS软件包,用的是c++编写的,也能够支持python进行使用。

C++/ROS:GitHub - bbenligiray/stag: STag: A Stable Fiducial Marker System

Python:GitHub - ManfredStoiber/stag-python: Python Package for STag - A Stable, Occlusion-Resistant Fiducial Marker System

用python 简单写一个例子

import cv2
import stag
import numpy as np

# 加载相机参数
camera_params = np.load("camera_params.npz")
mtx, dist = camera_params["mtx"], camera_params["dist"]

# 初始化STag检测器
stag_detector = stag.detectMarkers(mtx, dist)

# 初始化视频捕获
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    # 应用相机校正(可选)
    frame_undistorted = cv2.undistort(frame, mtx, dist, None, mtx)
    # 检测STag标记
    (corners, ids, rejected_corners) = stag.detectMarkers(frame_undistorted, 21)
    # 绘制检测到的标记及其ID
    stag.drawDetectedMarkers(frame_undistorted, corners, ids)
    # 绘制被拒绝的候选区域,颜色设为红色
    stag.drawDetectedMarkers(frame_undistorted, rejected_corners, border_color=(255, 0, 0))

    # 显示结果
    cv2.imshow("STag Detection", frame_undistorted)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

标记了STag码之后可以获得标记码四个角的参数,

(array([[[257., 368.],
        [185., 226.],
        [345., 162.],
        [420., 302.]]], dtype=float32),)

给定坐标过后,可以用opencv的‘cv2.solvePnP'函数来计算标记相对于相机的旋转和偏移量。这个函数需要标记的3D坐标(在物理世界中的位置)和相应的2D图像坐标(即检测到的角点),以及相机的内参和畸变系数。solvePnP会返回旋转向量(rvec)和平移向量(tvec),它们描述了从标记坐标系到相机坐标系的转换。这样,就可以根据这些参数计算出标记的位置和朝向。

以下是伪代码方便理解

def estimate_pose(corners):
    #Do some calculations with PnP, camera rotation and offset
    return rvec,tvec
    
def convert_pose_to_arm_coordinates(rvec, tvec):
    # 将旋转向量和平移向量转换为机械臂坐标系统中的x, y, z, rx, ry, rz
    return x, y, z, rx, ry, rz
    
def convert_grab(object_coord_list):
    #Do some calculations to convert the coordinates into grasping coordinates for the robotic arm
    return grab_position
    
    
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
        
    
    maker = (corners, ids, rejected_corners) = stag.detectMarkers(image, 21)
    
    rvec, tvec = stag.estimate_pose(marker)
    
    object_coord_list = convert_pose_to_arm_coordinates(rvec, tvec)
    grab_position = convert_grab(object_coord_list)
    mycobot.move_to_position(grab_position)

机械臂控制

以上的代码就是大概的抓取的流程,比较复杂的部分解决了,接下来我们处理机械臂的运动控制,用到的是pymycobot库

from pymycobot import MyCobot

#Create an instance and link the robotic arm
mc = MyCobot('com3',115200)

#Control the robotic arm with angle
mc.send_angles(angles_list,speed)

#Control the robotic arm using coordinates
mc.send_coords(coords_list,speed,mode)

#Control gripper,value-0~100
mc.set_gripper_value(value,speed)

因为机械臂的开放接口比较多,我们只需要使用坐标控制,夹爪控制就好了。

Limo Pro 建图导航

完成了机械臂抓取部分的功能,接下来我们要实现小车的建图导航模块了。

首先我们要见图,有了地图之后才能够在地图上进行导航,定点巡航等一些的功能,目前有多种建图的算法,因为我们搭建的场景并不是很大,环境相对于静态我们选择使用gmapping算法来实现。

建图

Gmapping是基于滤波SLAM框架的常用开源SLAM算法。Gmapping有效利用了车轮里程计信息,对激光雷达的频率要求不高,在构建小场景地图时,所需的计算量较小且精度较高。这里通过使用ROS封装了的GMapping功能包来实现limo的建图。

注:以下的功能都是封装好的可以直接使用

首先需要启动雷达,打开一个新终端,在终端中输入命令:

roslaunch limo_bringup limo_start.launch pub_odom_tf:=false

然后启动gmapping建图算法,打开另一个新终端,在终端中输入命令:

roslaunch limo_bringup limo_gmapping.launch

成功启动之后会打开rviz可视化工具,这时候看到的界面如图

这时候就可以把手柄调为遥控模式,控制limo建图了。

构建完地图之后,需要运行以下命令,把地图保存到指定目录:

1、切换到需要保存地图的目录下,这里把地图保存到~/agilex_ws/src/limo_ros/limo_bringup/maps/,在终端中输入命令:

cd ~/agilex_ws/src/limo_ros/limo_bringup/maps/

2、切换到/agilex_ws/limo_bringup/maps 之后,继续在终端中输入命令:

rosrun map_server map_saver -f map1

map1为保存地图的名称,保存地图时应避免地图的名称重复

导航

前面我们用了gmapping来进行建图,我们现在来进行导航。导航的关键是机器人定位和路径规划两大部分。针对这两个核心,ROS提供了以下两个功能包。

(1)move_base:实现机器人导航中的最优路径规划。

(2)amcl:实现二维地图中的机器人定位。

在上述的两个功能包的基础上,ROS提供了一套完整的导航框架,

机器人只需要发布必要的传感器信息和导航的目标位置,ROS即可完成导航功能。在该框架中,move_base功能包提供导航的主要运行、交互接口。为了保障导航路径的准确性,机器人还要对自己所处的位置进行精确定位,这部分功能由amcl功能包实现。

在导航的过程中,运用了两种算法DWA和TEB算法,这两种算法分别处理全局路径和局部路径规划,来保证小车能够安全的前进到目的地,避免与障碍物发生碰撞。

(1)首先启动雷达,在终端中输入命令:

roslaunch limo_bringup limo_start.launch pub_odom_tf:=false

(2)启动导航功能,在终端中输入命令:

roslaunch limo_bringup limo_navigation_diff.launch

启动成功之后会打开rviz界面,如图

我们需要把刚才建的地图给导进去,请打开limo_navigation_diff.launch 文件修改参数, 文件所在目录为:~/agilex_ws/src/limo_ros/limo_bringup/launch。把map02修改为需要更换的地图名称。

开启导航之后,会发现激光扫描出来的形状和地图没有重合,需要我们手动校正,在rviz中显示的地图上矫正底盘在场景中实际的位置,通过rviz中的工具,发布一个大概的位置,给limo一个大致的位置,然后通过手柄遥控limo旋转,让其自动校正,当激光形状和地图中的场景形状重叠的时候,校正完成。操作步骤如图 :

校正完成后

通过2D Nav Goal 设置导航目标点

路径巡检

如果要在一条路上来回运动的话,我们要启用路径巡检功能,后续会使用上这个功能。

(1)首先启动雷达,开启一个新的终端,在终端中输入命令:

roslaunch limo_bringup limo_start.launch pub_odom_tf:=false

(2)启动导航功能,开启一个新的终端,在终端中输入命令:

roslaunch limo_bringup limo_navigation_diff.launch

注:如果是阿克曼运动模式,请运行

roslaunch limo_bringup limo_navigation_ackerman.launch

(3)启动路径记录功能,开启一个新的终端,在终端中输入命令:

roslaunch agilex_pure_pursuit record_path.launch

路径记录结束之后终止路径记录程序,在终端中输入命令为:Ctrl+c

(4)启动路径巡检功能,开启一个新的终端,在终端中输入命令:

注:把手柄调至指令模式

roslaunch agilex_pure_pursuit pure_pursuit.launch

两个系统的集成

上面分布完成了myCobot机械臂视觉的抓取,LIMO的建图导航,路径巡检功能,现在我们需要把它们集成在ROS系统上。我们预设的场景是,LIMO进行定点的巡检,当遇到了标志物的时候停止运动,等待机械臂执行抓取物体,完成之后LIMO移动到下一个点位。

功能节点分布

在ROS(Robot Operating System)中实现一个功能的流程涉及到多个步骤和组件,包括节点(nodes)、话题(topics)、服务(services)、参数服务器(parameter server)和动作(actions)。根据ROS的功能节点架构,我们确定了节点的分布和它们交互的方式:

1. 图像识别节点(Image Recognition Node)

  • 职责:持续接收来自摄像头的图像流,使用图像识别算法(如OpenCV或深度学习模型)来检测特定的标记物。
  • 输入:来自摄像头的图像流。
  • 输出:当检测到标记物时,发布一个消息到一个特定的话题(如/marker_detected)。

2. 控制节点(Control Node)

  • 职责:管理机器人的移动,包括启动、停止和继续巡检。
  • 输入:订阅/marker_detected话题以监听图像识别节点的输出。也可能订阅一个专门用于接收手动控制指令的话题(如/control_commands)。
  • 输出:向机器人底层控制系统(如驱动电机的节点)发送控制命令。

3. 任务执行节点(Task Execution Node)

  • 职责:执行遇到标记物后的特定任务,这些任务可以是数据采集、状态报告等。
  • 输入:监听来自控制节点的指令,这些指令指示何时开始执行任务。
  • 输出:任务完成的状态反馈,可能会发送到控制节点或一个专门的状态话题(如/task_status)。

4. 导航和路径规划节点(Navigation and Path Planning Node)

  • 职责:处理机器人的路径规划和导航逻辑,确保机器人可以在环境中安全移动。
  • 输入:接收来自控制节点的指令,用于启动、停止或调整导航路径。
  • 输出:向机器人底层控制系统发送导航指令,如目标位置、速度和方向。

总结

这个场景算是初步完成了,其实还可以添加许多细节的,比如说在行径的过程中增添一些移动的障碍物,又或者设定一个红绿灯之类的物体,更加接近真实的场景。如果你们觉得有什么需要改善的地方,又或者说你想用 LIMO cobot 来做一些什么,尽管畅所欲言,你的回复和点赞就是我们更新最大的动力!

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

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

相关文章

python自动化管理和zabbix监控网络设备(zabbix部署监控网络设备以及验证部分)

目录 前言 一、Zabbix搭建 二、FW1 三、python脚本 四、core-sw1 五、core-sw2 六、DMZ-sw1 前言 详细配置视频解析访问:白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 一、Zabbix搭建 sed -i s/SELINUXenforcing/SELINUXdisable/ /etc/selinux/config…

力扣——盛最多水的容器

题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:…

【论文笔记】Gemma: Open Models Based on Gemini Research and Technology

Gemma 日期: March 5, 2024 平台: CSDN, 知乎 状态: Writing Gemma: Open Models Based on Gemini Research and Technology 谷歌最近放出的Gemma模型【模型名字来源于拉丁文gemma,意为宝石】采用的是与先前Gemini相同的架构。这次谷歌开源了两个规模的模型&…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的,但是在看的一个资料过程中发现他有错…并且一系列,复制粘贴他的,也都错了。 错误文章指路 很显然,Copy是深拷贝啊!!! Copy功能 copy的代码很少&#xff0c…

MySQL基础-----SQL语句之DQL数据查询语句(上篇)

目录 前言 select基本语法 一、基础查询 1.查询多个字段 2.字段设置别名 3.去除重复记录 案例 二、条件查询 1.语法 2.条件 案例 三、聚合函数 1.聚合函数 2.语法 案例 前言 前面我们学习了DML和DDL语句,那么本期我们学习数据查询的语句(DQ…

启英泰伦「离线自然说」:让照明语音交互更自然、更便捷

随着科技的不断发展,智能家居已经成为现代生活的一部分。其中,智能照明作为智能家居的重要组成部分,为人们带来了更加便捷、舒适的照明体验。然而,传统的离线语音交互技术在智能照明领域的应用一直受到词条存储量的限制&#xff0…

把握职场脉搏,明智选择赛道

选择比努力更重要。男怕入错行,进入IT行业的你已经成功一半了,但IT业也细分了诸多赛道,应该如何兼顾选择呢?在快速发展的科技行业中,程序员面临着众多选择。如何选择最适合自己的职业赛道,成为许多程序员关…

Verilog Coding Styles For Improved Simulation Efficiency论文学习记录

原文基于Verilog-XL仿真器,测试了以下几种方式对仿真效率的影响。 1. 使用 Case 语句而不是 if / else if 语句 八选一多路选择器 case 实现效率比 if / else if 提升 6% 。 2. 如果可以尽量不使用 begin end 语句 使用 begin end 的 ff 触发器比不使用 begin end …

校园气象站—为学校的科普教育提供有力的支持

TH-XQ3校园气象站是一种针对校园环境的气象监测设备,通过现场自动监测的方式,对雨量、风向、风速、气温、相对湿度、气压、太阳辐射、噪声等气候要素进行全天候现场监测,同时将监测数据及时传递给学生和校园管理人员。校园气象站的建设不仅可…

python使用zmail实现邮件发送

一:zmail介绍 1、Zmail的优势 自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)将一个字典映射为email,构造信件就像构造字典一样简单自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的&am…

哪款立体学习灯值得买!五款热门立体学习灯测评集锦!

大路灯作为专业的照明工具,能够帮助我们改善光线环境、提高用眼的舒适度,改善用眼疲劳,也因此备受很多群众欢迎,普及率日渐上升。但大路灯市场快速发展的背后,也涌现了大量劣质不专业产品,比如网红或跨界大…

【短时交通流量预测】基于Elman神经网络

课题名称:基于Elman神经网络的短时交通流量预测 版本时间:2023-04-27 代码获取方式:QQ:491052175 或者 私聊博主获取 模型简介: 城市交通路网中交通路段上某时刻的交通流量与本路段前几个时段的交通流量有关&#…

华为认证HCIA\HCIP\HCIE考试费用是多少?

华为认证有HCIA、HCIP、HCIE这三个等级的认证,HCIA和HCIP只考笔试,HCIE考笔试和实验。不同方向的认证考试科目和费用会有些不同。 HCIA笔试考试费用是200美元。 每个方向的HCIP考试科目不同,有的方向需要考一门,有的方向需要考…

CSDN的默认markdown教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Java实现手机库存管理

一、实验任务 编写一个程序,模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下: 1.系统的首页:用于显示系统所有的操作,并且可以选择使用某一个功能。 2.商品入库功能&…

UE4c++ 材质功能大全(想起来就补充一个)

前言:才想起写一个这个文档,前期内容较少,其他内容,我也只会想起来加一加! 材质功能大全 竖直百分比进度HSV To RGBRGB转灰度值AlphaComosote(Premultiplied Alpha)预乘 转 Translucent (sRGB与…

【linux】linux系统调用及文件IO操作

一、系统调用 1、概述 系统调用: 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时…

win中删除不掉的文件,火绒粉碎删除亲测有效

看网上的 win R 然后终端输入什么删除的,照做了都没有删掉 有火绒的可以试试: 拖进去就删掉了 很好使

NTFS Disk by Omi NTFS for mac v1.1.4中文版

NTFS Disk by Omi NTFS for Mac:NTFS文件系统的无缝桥梁 软件下载:NTFS Disk by Omi NTFS for mac v1.1.4中文版 🌐 跨平台访问,文件无阻 NTFS Disk by Omi NTFS for Mac 为您的Mac提供了对NTFS文件系统的无缝访问。无论您是在Win…

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击,又混杂精巧的Web应用层攻击时(例如SQL注入、跨站脚本攻击、命令注入等)时,推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF(Web Application Firewall)&#xff0…
最新文章