结合大象机器人六轴协作机械臂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)# 绘制检测到的标记及其IDstag.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'):breakcap.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 offsetreturn rvec,tvecdef convert_pose_to_arm_coordinates(rvec, tvec):# 将旋转向量和平移向量转换为机械臂坐标系统中的x, y, z, rx, ry, rzreturn x, y, z, rx, ry, rzdef convert_grab(object_coord_list):#Do some calculations to convert the coordinates into grasping coordinates for the robotic armreturn grab_positioncap = cv2.VideoCapture(0)
while cap.isOpened():ret, frame = cap.read()if not ret:breakmaker = (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.mzph.cn/news/723069.shtml

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

相关文章

四桥臂三相逆变器动态电压恢复器(DVR)MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 简介 四桥臂三相逆变器 电路 的一般形式如图 1,为 便于分析 ,将其等效成图所示的电路 。以直流母线电压Ud的 1/2处为参考点 ,逆变器三相和零线相 输 出可等效成…

[数据结构]队列

1.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 2…

基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数(可选) 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…

mac电脑版MATLAB R2023b for Mac中文激活版

MATLAB R2023b for Mac:科学计算的终极工具 软件下载:MATLAB R2023b for Mac中文激活版下载 🔬 探索科学,无限可能 MATLAB R2023b for Mac,助您深入挖掘科学计算的奥秘。从数据分析、算法设计到可视化展示,…

基于GitBucket的Hook构建ES检索PDF等文档全栈方案

背景 之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo,预期建设方案是使用触发器类型从公共的文档源拉取最新的文件,然后调用Java将文件转Base64后入ES建索引,再提供封装接口给前端做查询之用。 由于全部内容过长&#xff…

YOLO算法改进Backbone系列之:RepViT

摘要:近年来,与轻量级卷积神经网络(cnn)相比,轻量级视觉变压器(ViTs)在资源受限的移动设备上表现出了更高的性能和更低的延迟。这种改进通常归功于多头自注意模块,它使模型能够学习全局表示。然而,轻量级vit和轻量级cn…

《操作系统真相还原》读书笔记四:安装nasm

下载链接:https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/ 下载-解压-安装 tar zxvf nasm-2.13.03.tar.gz ./configure --prefix/home/truthos/nasm/toolchain/make && makeinstall执行make install export PATH/home/truthos/nasm/toolchain/bin:…

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

html标签之表格标签,资料分享

二.准备工作 与中国大部分在校生一样,从不考虑多多参加社会活动为自己铺路,直到找工作时才发现自己一无所有。 是的,一无所有。对于求职来说,如果不找对口工作,那么你的专业知识已经无用武之地。能证明你能力的实践活…

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中,需要对接三方websocket协议数据或者连接并存储线上websocket协议数据,需要使用websocket客户端 连接线上的websocket服务端获取并存储数据,然后将数据存储成文件格式可移植,并将数据复制 到本地,…

MATLAB知识点:while循环的注意事项

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自​第4章:MATLAB程序流程控制 在使用while循…

docker 安装rabbitmq并配置hyperf使用

这里我想完成的是 制作消息(多个协程制造)——》推送到rabbitmq——》订阅消息队列——》消费消息(ws协程客户端【一次消费多条】/ws前端) 利用 WebSocket 协议让客户端和服务器端保持有状态的长链接,保存链接上来的客…

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线?阿里云服务器网账号下的2核4G服务器支持20人同时在线访问,然而应用不同、类型不同、程序效率不同实际并发数也不同,2核4G服务器的在线访问人数取决于多个变量因素: 2核4G:2核CPU和4G内存对…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记02_大数据

1. 大数据分析 1.1. 随着“大数据军备竞赛”与定价算法的广泛应用,线上购物平台与实体商铺的界限也变得越来越模糊 1.2. 在沃尔玛疯狂扩张的时代,它给地区性商业带来的伤害不亚于一场地震 1.2.1. 当地的小型商铺往往…

浏览器工作原理与Javascript高级(异步)

总体介绍 浏览器运行是多进程的,包括主进程、渲染进行、网络进程和GPU进程等等 解析HTML时(渲染进程)用到两大引擎,一个是渲染引擎(用于渲染页面)、一个是JS引擎用于解析JS代码。又JS引擎运行是单线程的,所以渲染和 …

Dubbo基础入门一

1、什么是Dubbo3 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。 “Dubbo3 已在阿里巴巴内部微服务集群全面落地,成功取代运行多年的 HSF 框架。” 2、…

5G 网络切片VLAN ID配置错误导致业务不可用

【摘要】随着电联5G共建共享工作的开展,无法及时有效观测到单逻辑站点的相关指标,导致单运营商用户业务出现异常。本案例中着重对单运营商用户无法使用网络进行相关参数排查,从KPI性能指标结合故障告警发生时间,从而分析由于网络切…

稀碎从零算法笔记Day6-LeetCode:长度最小的子数组

前言:做JD的网安笔试题,结果查找子串(单词)这个操作不会。痛定思痛,决定学习滑动数组 题型:数组、双指针、滑动窗口 链接:209. 长度最小的子数组 - 力扣(LeetCode) 来…

(学习日记)2024.03.06:UCOSIII第八节:空闲任务+阻塞延时+main函数修改

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

CSS字体样式值,前端开发基础学习

元素特点: 块状元素: 在页面中以矩形区域显示。自上而下排列,独占一行可以直接添加宽高一般情况下,作为其他元素或内容的容器 行内元素: 在页面中最小单位也是矩形。在一行内逐个排列。不可以直接添加宽高&#xf…