0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用myCobot 280 Jeston Nano进行物体精确识别追踪

大象机器人科技 来源:大象机器人科技 作者:大象机器人科技 2023-05-24 18:20 次阅读

前言

我们在YouTube上看到有人使用机械臂实现物体跟踪功能的视频时,深受启发,对这个项目产生了浓厚的兴趣,并决定独立开发一个类似的程序。

我们的目标是开发一个能够准确识别和跟踪物体的机械臂系统,以便在实际应用中发挥作用,这个项目涉及到许多技术和算法,包括视觉识别、手眼协同和机械臂控制等方面。

机械臂的介绍 mycobot280-JetsonNano

操作使用的机械臂是myCobot280-Jetson Nano

这是一款大象机器人公司生产的小六轴机械臂,以JetsonNano为微处理器ESP32为辅助控制,UR协作形结构。myCobot280 JetsonNano,本体重量1030g, 负载250g,工作半径280mm,设计紧凑便携,小巧但功能强大,操作简单,能与人协同、安全工作。

Jetson Nano

Jetson Nano是英伟达推出的一款嵌入式人工智能计算机,它采用了NVIDIA Maxwell GPU和四核ARM Cortex-A57处理器,性能强大。Jetson Nano支持多种人工智能框架和工具,如TensorFlow、PyTorch、Caffe和MXNet等。此外,Jetson Nano还具有多种输入输出接口,如HDMIUSB、GPIO等,方便开发人员进行硬件连接和控制。

由于Jetson Nano具有强大的计算性能和专门为人工智能开发设计的特点,支持多种深度学习框架,如TensorFlow、PyTorch和Caffe等,可以更方便地进行人工智能应用开发,它成为了开发人员进行人工智能应用开发的理想平台之一。

开发过程

下图是项目的开发流程图

相机捕捉目标

在我开始开发之前,我首先进行了一些调研和实验。我使用了一个相机来捕捉物体的图像,并使用OpenCV库来识别和跟踪Aruco码。尝试过多种的方法,物体的识别需要让机器进行学习,我们要识别的目标,这样会增加项目开发的时间,最后决定用aruco码来进行识别,这样可以快速捕捉到aruco码,进行下一步开发。

Aruco码

下面是实现的代码:

def show_video_v2(self):
        # self.robot.init_robot()
        xyz = np.array([0,0,0])
        LIST = []
        num_count = 0
        list_len = 5
        # cmax = [180, 80, 240]
        # cmin = [130, -80, 200]
        cmax = [150, -150, 300]
        cmin = [-150, -250, 200]

        while cv2.waitKey(1) < 0:
            success, img = self.cap.read()
            if not success:
                print("It seems that the image cannot be acquired correctly.")
                break
            # transfrom the img to model of gray
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # Detect ArUco marker.
            corners, ids, rejectImaPoint = cv2.aruco.detectMarkers(
                gray, self.aruco_dict, parameters=self.aruco_params
            )

            if len(corners) > 0:
                if ids is not None:
                    # get informations of aruco
                    ret = cv2.aruco.estimatePoseSingleMarkers(
                        # '''https://stackoverflow.com/questions/53303730/what-is-the-value-for-markerlength-in-aruco-estimateposesinglemarkers'''
                        corners, 0.025, self.camera_matrix, self.dist_coeffs
                    )
                    # rvec:rotation offset,tvec:translation deviator
                    (rvec, tvec) = (ret[0], ret[1])

                    (rvec - tvec).any()
                    xyz = tvec[0, 0, :] * 1000
                    rpy = rvec[0,0,:]

                    camera = np.array([xyz[0], xyz[1], xyz[2]])

                    if num_count > list_len:
                        target = model_track(camera)
                        print("target", target)

                        for i in range(3):
                            if target[i] > cmax[i]:
                                target[i] = cmax[i]
                            if target[i] < cmin[i]:
                                target[i] = cmin[i]

                        pose = np.array([-103, 8.9, -164])
                        coord = np.concatenate((target.copy(), pose), axis=0)

                        # q1 = math.atan(xyz[0] / xyz[2])*180/np.pi
                        mc.send_coords(coord,50,0)


                        # print('target', coord)
                        num_count = 1
                    else:
                        num_count = num_count + 1


                    for i in range(rvec.shape[0]):
                        # draw the aruco on img
                        cv2.aruco.drawDetectedMarkers(img, corners)
            cv2.imshow("show_video", img)

手眼标定

手眼标定是指在机器人领域中,确定机器人末端执行器(例如机械手臂)相对于机器人基座坐标系的位置和姿态。这个过程涉及到将机器人末端执行器与相机进行配对,然后通过捕捉执行器在相机视野中的位置和姿态来确定它在机器人基座坐标系中的位置和姿态。

手眼标定通常涉及到在机器人末端执行器和相机之间进行一系列的运动,以便收集足够的数据来计算出它们之间的变换矩阵。这个变换矩阵描述了机器人末端执行器相对于相机的位置和姿态,从而可以用来控制机器人的运动,使其能够准确地执行所需的任务。

在"eye-to-hand"手眼标定中,相机被视为一个不动的观察者("eye"),而机器人末端执行器则被视为在相机视野中移动的物体("hand")。机器人末端执行器在相机周围移动时,会收集到一系列的图像,这些图像包含了机器人末端执行器在不同位置和姿态下的图像信息。通过分析这些图像,可以计算出机器人末端执行器相对于相机的位置和姿态,从而完成手眼标定。

下面是处理坐标之间转换数据的代码

#函数用于计算相机间的相似性
def calculate_similarity(camera):
    n = camera.shape[0]
    total_similarity = 0
    for i in range(n):
        for j in range(i+1, n):
            vector_a = camera[i]
            vector_b = camera[j]
            dot_product = np.dot(vector_a, vector_b)
            norm_a = np.linalg.norm(vector_a)
            norm_b = np.linalg.norm(vector_b)
            similarity = dot_product / (norm_a * norm_b)
            total_similarity += similarity
    return total_similarity/n
#函数用于计算相似性的变化率
def similarity_change_rate(new_similarity):
    global prev_similarity
    if prev_similarity is None:
        prev_similarity = new_similarity
        return 0
    else:
        change_rate = (new_similarity - prev_similarity) / prev_similarity
        prev_similarity = new_similarity
        return change_rate

#函数用于将旋转矩阵转换为欧拉角
def CvtRotationMatrixToEulerAngle(pdtRotationMatrix):
    pdtEulerAngle = np.zeros(3)

    pdtEulerAngle[2] = np.arctan2(pdtRotationMatrix[1, 0], pdtRotationMatrix[0, 0])

    fCosRoll = np.cos(pdtEulerAngle[2])
    fSinRoll = np.sin(pdtEulerAngle[2])

    pdtEulerAngle[1] = np.arctan2(-pdtRotationMatrix[2, 0], (fCosRoll * pdtRotationMatrix[0, 0]) + (fSinRoll * pdtRotationMatrix[1, 0]))
    pdtEulerAngle[0] = np.arctan2((fSinRoll * pdtRotationMatrix[0, 2]) - (fCosRoll * pdtRotationMatrix[1, 2]), (-fSinRoll * pdtRotationMatrix[0, 1]) + (fCosRoll * pdtRotationMatrix[1, 1]))

    return pdtEulerAngle
#函数用于将欧拉角转换为旋转矩阵
def CvtEulerAngleToRotationMatrix(ptrEulerAngle):
    ptrSinAngle = np.sin(ptrEulerAngle)
    ptrCosAngle = np.cos(ptrEulerAngle)

    ptrRotationMatrix = np.zeros((3, 3))
    ptrRotationMatrix[0, 0] = ptrCosAngle[2] * ptrCosAngle[1]
    ptrRotationMatrix[0, 1] = ptrCosAngle[2] * ptrSinAngle[1] * ptrSinAngle[0] - ptrSinAngle[2] * ptrCosAngle[0]
    ptrRotationMatrix[0, 2] = ptrCosAngle[2] * ptrSinAngle[1] * ptrCosAngle[0] + ptrSinAngle[2] * ptrSinAngle[0]
    ptrRotationMatrix[1, 0] = ptrSinAngle[2] * ptrCosAngle[1]
    ptrRotationMatrix[1, 1] = ptrSinAngle[2] * ptrSinAngle[1] * ptrSinAngle[0] + ptrCosAngle[2] * ptrCosAngle[0]
    ptrRotationMatrix[1, 2] = ptrSinAngle[2] * ptrSinAngle[1] * ptrCosAngle[0] - ptrCosAngle[2] * ptrSinAngle[0]
    ptrRotationMatrix[2, 0] = -ptrSinAngle[1]
    ptrRotationMatrix[2, 1] = ptrCosAngle[1] * ptrSinAngle[0]
    ptrRotationMatrix[2, 2] = ptrCosAngle[1] * ptrCosAngle[0]

    return ptrRotationMatrix

机械臂控制

在这之后就是物体检测和机械臂的控制,将识别到的物体的坐标转换成机械臂的运动指令,这里用到的是pymycobot库来进行对机械臂的控制。

#用于进行视觉追踪并计算目标位置
def Visual_tracking280(coord, camera):
    pose_camera = camera[:3]
    angle_camear = camera[3:]
    r = CvtEulerAngleToRotationMatrix(angle_camear)
    # r = np.array([[1, 0, 0],
    #                  [0, 1, 0],
    #                  [0, 0, 1]])
    euler = np.radians(coord[3:])
    R = CvtEulerAngleToRotationMatrix(euler)
    offset = np.array([0, 0, -250])
    Roff = np.array([[1, 0, 0],
                     [0, -1, 0],
                     [0, 0, -1]])
    # Roff = np.array([[1, 0, 0],
    #                  [0, 1, 0],
    #                  [0, 0, 1]])
    vector = pose_camera + offset
    # print("R", R)
    # print("r", r)

    move_pos = np.dot(np.dot(R, r), Roff).dot(vector)
    pos = coord[:3] + move_pos
    # angle = np.array(CvtRotationMatrixToEulerAngle(np.dot(np.dot(R, r), Roff))) * 180/np.pi
    angle =  coord[3:]
    target = np.concatenate((pos, angle))
    return target

#根据相机坐标计算目标位置
    def model_track(camera):
    model_pos = np.array([-camera[0], -camera[2], -camera[1]])
    camera_pos = np.array([-37.5, 416.6, 322.9])
    target_pos = model_pos + camera_pos
    # print("model_pos", model_pos)
    # print("target_pos", target_pos)
    return target_pos

最后整理一下项目的逻辑关系,

让我们来看下效果如何。

总结:

在调试的过程中,我们发现跟踪的效果并不是非常流畅和灵敏。我们通过控制检测周期来调整流畅性,但是需要缓慢移动被跟踪的物体目标,才能达到更好的效果。仍然还有一些不足的地方,在相机固定的情况下,机械臂的本体可能会遮挡相机的视野,导致没有办法进行下一步跟踪,想到的解决方案是相机换个位置不被遮挡的位置(坐标换算那些都得重新计算)。如果你有更好的想法欢迎跟我们沟通!感谢你的耐心观看。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    206

    文章

    27015

    浏览量

    201359
  • 人工智能
    +关注

    关注

    1776

    文章

    43796

    浏览量

    230567
  • 视觉识别
    +关注

    关注

    3

    文章

    86

    浏览量

    16504
  • 机械臂
    +关注

    关注

    9

    文章

    471

    浏览量

    23819
收藏 人收藏

    评论

    相关推荐

    【VEML6040环境颜色检测试用申请】识别跟踪具有色块物体

    物体模块从双色、三色到较为复杂的多色进行测试自动跟踪[跟踪物体移动、追踪物移动]4.写出每一步的实验结果、分享代码和资料共同学习提高。
    发表于 03-20 18:09

    机器视觉识别追踪

    对运动过程中的物体进行实时识别追踪。对于1080p的图像理论速度可以达到330帧每秒对于720p的图像理论速度则可以达到550帧每秒。镜头可以穿过热成像仪清楚的拍出人像图像。这项技术
    发表于 08-21 11:23

    OpenMV简单实现物体追踪

    工智能摄像头,自带很多ai算法,有很多应用的场景,今天我来教大家如何使用open_mv实现物体追踪、色块识别,并且把识别到的物品坐标信息通过串口传输给单片机等处理器。如果你还没用过Op
    发表于 11-30 06:59

    使用LabVIEW进行物体追踪图像处理分析

    使用LabVIEW进行物体追踪图像处理分析 近年来,伴随着科技的进步,生物科技也成为一个相当热门的研究,其中包含了药物学、行为科学…等多项领域。而不论是哪一项领域的研究,都必须由大量的动物实验来探讨
    发表于 02-22 20:10

    CSK6011与NVIDIA Jetson Nano开发板对比

    TensorFlow、Keras、PyTorch、Caffe等,支持NVIDIA JetPack,支持多个神经网络并行运行实现图像分类、人脸识别、语音处理、目标检测及物体识别追踪等,适
    发表于 02-14 14:19

    怎么用OV5640进行识别特定颜色物体

    怎么用 OV5640进行识别特定颜色物体
    发表于 10-13 06:04

    英伟达:发布Jeston Nano计算模块,追逐树莓派市场

    在机器人领域,英伟达发布了一款小巧便宜的基于Tegra X1的Jetson计算模块——Jeston Nano,模块本身只不过是SoC,RAM,NAND和VRM组合。它不同之前发布的嵌入式高性能利器
    的头像 发表于 03-21 18:06 1.2w次阅读

    OpenMV追踪物体应用教程(无需自写代码)

    工智能摄像头,自带很多ai算法,有很多应用的场景,今天我来教大家如何使用open_mv实现物体追踪、色块识别,并且把识别到的物品坐标信息通过串口传输给单片机等处理器。如果你还没用过Op
    发表于 11-21 19:51 29次下载
    OpenMV<b class='flag-5'>追踪</b><b class='flag-5'>物体</b>应用教程(无需自写代码)

    使用myCobot280 M5Stack控制器

    电子发烧友网站提供《使用myCobot280 M5Stack控制器.zip》资料免费下载
    发表于 10-18 17:28 0次下载
    使用<b class='flag-5'>myCobot280</b> M5Stack控制器

    使用 Python 和可视化编程控制树莓派机械臂myCobot

    进行编程,简单易用,功能丰富。适合那些有兴趣学习如何对机械臂进行编程控制和项目开发的人。 myCobot 280 Pi开箱 myCobot
    的头像 发表于 11-30 14:56 3801次阅读
    使用 Python 和可视化编程控制树莓派机械臂<b class='flag-5'>myCobot</b>

    大象机器人myCobot 280 2023版全新功能展示

    大象机器人mycobot 280 2023版全新功能
    的头像 发表于 03-10 18:46 920次阅读
    大象机器人<b class='flag-5'>myCobot</b> <b class='flag-5'>280</b> 2023版全新功能展示

    探索 Jetson NanomyCobot 280 提供的强大功能

    。机器人已经成为我们生活中必不可少的一部分,从送货机器人到智能家居语音助手。 在本文中,我们将讨论myCobot 280 Jetson Nano,这是一种能够进行科学实验和教育方面的机
    的头像 发表于 04-06 15:46 639次阅读
    探索 Jetson <b class='flag-5'>Nano</b> 为 <b class='flag-5'>myCobot</b> <b class='flag-5'>280</b> 提供的强大功能

    基于未知物体进行6D追踪和3D重建的方法

    如今,计算机视觉社区已经广泛展开了对物体姿态的 6D 追踪和 3D 重建。本文中英伟达提出了同时对未知物体进行 6D 追踪和 3D 重建的方
    的头像 发表于 07-03 11:24 332次阅读
    基于未知<b class='flag-5'>物体</b><b class='flag-5'>进行</b>6D<b class='flag-5'>追踪</b>和3D重建的方法

    myCobot Pro600六轴机械臂与3D深度视觉:物体精确识别抓取堆叠

    myCobot pro 600机械臂,我主要是想要用它来学习机械臂相关得控制以及机器视觉的项目,给以后的实践中在本文中,我将记录使用myCobot pro 600结合深度相机来实现物体得跟踪以及抓取。 接下来
    的头像 发表于 09-12 10:51 613次阅读
    <b class='flag-5'>myCobot</b> Pro600六轴机械臂与3D深度视觉:<b class='flag-5'>物体</b><b class='flag-5'>精确</b><b class='flag-5'>识别</b>抓取堆叠

    开源六轴机械臂myCobot 280末端执行器实用案例解析

    Intrduction 大家好,今天这篇文章的主要内容是讲解以及使用一些myCobot 280 的配件,来了解这些末端执行器都能够完成哪些功能,从而帮助大家能够正确的选择一款适合的配件来进行
    的头像 发表于 10-16 16:28 548次阅读
    开源六轴机械臂<b class='flag-5'>myCobot</b> <b class='flag-5'>280</b>末端执行器实用案例解析