大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

引言

有没有遇到过这样的情况:当你手持手机或相机准备拍摄视频时,心中已经构想了完美的画面,但却因为实际的限制无法捕捉到理想中的角度?这种情况可能会让人感到挫折。例如,如果想要从地面一只蚂蚁的视角拍摄,镜头需要与蚂蚁处于同一水平线上,这在操作上不仅困难,而且往往难以实现。

尽管目前市场上有许多稳定设备如平衡环架(gimbal)来辅助拍摄,以求达到稳定和多角度的拍摄效果,但在此篇文章中,我将探索一种独特的解决方案:通过将手机安装在机械臂的末端来进行拍摄,以实现那些传统方法难以捕捉的特殊视角。此次尝试不仅旨在克服拍摄过程中的物理限制,而且也期望通过技术的创新来开拓我们对摄影角度的想象和实践。

设备

myCobot 320 M5stack

myCobot 320,一款具备六自由度的协作型机械臂,凭借其独特的设计和高精度伺服电机成为了领域内的亮点。这款机械臂拥有最大350mm的工作半径和最大1000g的末端负载能力,使其适用于广泛的应用场景。myCobot 320不仅支持灵活的视觉开发应用,还提供了深入的机械运动原理解析,为用户带来了12个标准的24V工业IO接口,满足不同的开发需求。

它的开放性极高,兼容大多数主流操作系统和编程语言,包括Python和ROS等,为开发者提供了极大的灵活性和自由度。无论是在教育、研发还是工业应用中,myCobot 320都能提供强大支持,使创新和应用开发更加便捷高效。

myCobot Pro phone holder

它可以安装在myCobot 320,myCobot pro 630机械臂的末端,能够稳定的固定住手机。

以上就是我们需要使用到的设备了。

初次尝试

安装手机支架

整体安装的效果图片

基础控制测试

做一个简单的尝试。

拍摄视频

给机械臂进行关节控制的编程,让我们一起看看效果如何。

尽管视频中展示的机械臂运动轨迹看似简单,但实际上,调整这些轨迹点位仍需耗费大量时间,且效果未必理想。因此,我在考虑是否存在更优解决方案,例如,通过设定几种运动模式和预先规划机械臂的拍摄路径。这不仅能够有效利用机械臂辅助拍摄,同时也提供了一种更为高效的部署方式。

编程挑战

开发需求分析

确定使用的设备如下

产品

功能

备注

myCobot 320 M5Stack

整个项目的核心搭载手机进行拍摄。

myCobot Pro Phone Holder

在机械臂的末端安装,能够保持手机的稳定

 Smart Phone

进行拍摄的设备

ios或者,安卓系统的手机

Computer

编写代码,控制机械臂,调动程序

需求:需求优化:

目标是为静态物体拍摄场景设计一系列创新的视频拍摄方式,初步计划采用三种方法:

1. 利用机械臂末端固定的手机,实现物体360°全景视频拍摄。

2. 创建一种画面效果,从远处平缓推进至物体近前,模拟“拉近镜头”的效果。

3. 实现机械臂末端的快速旋转与移动,捕捉动感十足的画面。

为了精准控制拍摄过程,计划利用OpenCV机器视觉算法和AVFoundation iOS框架,通过Python脚本控制机械臂的精确运动。我们将通过手机摄像头识别物体的尺寸,进而计算出机械臂末端与物体之间的理想距离。根据这个距离,设计相应的机械臂运动算法,确保拍摄过程中能够获得最佳画面效果。

YOLO视觉算法

为了节省时间,我们将不会自行训练机器视觉算法来识别特定物体。相反,我们直接采用其他开发者已经训练优化的YOLOv5库,以实现对目标物体的准确检测。

import cv2
import torch
from pathlib import Path
from models.experimental import attempt_load
from utils.general import non_max_suppression, scale_coords
from utils.torch_utils import select_device, time_synchronized

def detect_apples(img_path):
    device = select_device('')
    weights = 'yolov5s.pt'
    model = attempt_load(weights, map_location=device)
    img0 = cv2.imread(img_path)  # BGR
    img = img0[:, :, ::-1]  # RGB
    img = torch.from_numpy(img).to(device)
    img = img.float()  # uint8 to fp16/32
    img /= 255.0  # 0 - 255 to 0.0 - 1.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    # Inference
    t1 = time_synchronized()
    pred = model(img)[0]
    # Apply NMS
    pred = non_max_suppression(pred, 0.4, 0.5, classes=None, agnostic=False)
    t2 = time_synchronized()
    print(f'Inference time: {(t2 - t1):.3f}s')

    # Process detections
    for i, det in enumerate(pred):  # detections per image
        gn = torch.tensor(img0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
        if len(det):
            det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img0.shape).round()
            for *xyxy, conf, cls in reversed(det):
                label = f'{model.names[int(cls)]} {conf:.2f}'
                plot_one_box(xyxy, img0, label=label, color=(255, 0, 0))
    return img0

def plot_one_box(xyxy, img, color=None, label=None, line_thickness=None):
    # Plots one bounding box on image img
    tl = (
        line_thickness or round(0.002 * max(img.shape[0:2])) + 1
    )  # line/font thickness
    color = color or [random.randint(0, 255) for _ in range(3)]
    c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
    cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
    if label:
        tf = max(tl - 1, 1)  # font thickness
        t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
        c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
        cv2.rectangle(
            img, c1, c2, color, -1, cv2.LINE_AA
        )  # filled
        cv2.putText(
            img,
            label,
            (c1[0], c1[1] - 2),
            0,
            tl / 3,
            [225, 255, 255],
            thickness=tf,
            lineType=cv2.LINE_AA,
        )
    return img

if __name__ == '__main__':
    img_path = 'test_image.jpg'  # 输入你的图像路径
    result_img = detect_apples(img_path)
    cv2.imshow('Result', result_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

保留识别物体的尺寸的数据,之后要用在别的地方上。

机械臂运动控制算法

机械臂的控制方法

# 这个方法控制机械臂的关节进行运动
mc.send_angles([angle_list],speed)

# 这个方法用坐标控制机械臂在空间上进行运动
mc.send_coords([coords_list],speed,mode)

example:
mc.send_angles([0,0,0,0,0,0],100)
time.sleep(2)
mc.send_coords([(-3.6), 30.32, (-45.79), (-46.84), 97.38, 0.35],100,1)

获得物体的尺寸数据之后,定义机械臂末端距离物体的合理位置

def calculate_angles_for_distance(distance):
    # 根据理想距离计算机械臂的关节角度
    # 这里的计算需要根据实际情况和物理参数进行调整
    return [0, -10, distance * 0.1, 0, 30, 0]  

def calculate_adjusted_angles(action_angles):
    # 基于特定动作后可能需要的坐标调整计算新的角度
    # 这里仅为示例,具体逻辑根据需要调整
    return [angle * 1.1 for angle in action_angles]  

再选择模式对应的运动控制

#360全景拍摄
# 定义具体的拍摄模式
def shoot_mode_360(ideal_distance):
    print("执行360°全景拍摄模式")
    # 首先,移动到理想拍摄位置
    move_to_ideal_position(ideal_distance)
    # 处理理想距离
    ideal_ratio =  ratio
    # 执行360°全景拍摄的特定动作
    mc.send_angles([0, 0, 0, 0, 0, 0], speed=15)
    time.sleep(1)
    mc.send_coords([angle * ratio for angle in angles_list]
,15)
    time.sleep(1)
    mc.send_coords([angle * ratio for angle in angles_list]
,15)
    time.sleep(1)
    mc.send_coords([angle * ratio for angle in angles_list]
,15)

手机相机的调用

在开发过程中,尝试调用手机摄像头接口以实现自动化拍摄功能,我遇到了一系列挑战。作为我的第一次深入探索AVFoundation iOS框架,目标是激活并控制手机的摄像头,我发现自己还未能完全成功实现这一功能。当前的难点主要集中在如何准确调用摄像头进行视频拍摄,以及在拍摄过程中如何通过软件调整来补偿图像的可能拉伸,这需要对机械臂的运动进行精细控制。

这些问题标志着我后续研究的重点方向,需要我继续深入学习AVFoundation框架的使用,特别是其控制摄像头的具体方法,并探索如何将这些控制整合到机械臂的运动调整中,以确保最终拍摄出的视频质量符合预期。

总结

随着这次项目记录的结束,我意识到虽然项目尚有诸多不足,但这次尝试将两个独立设备在不同的框架下协同工作,对我来说仍是一次宝贵的经验。确实,整个项目目前尚未达到我心中的理想状态。然而,我认为这个项目探索的方向极具潜力,考虑到市面上已经存在能够拍摄出令人赞叹效果的专业摄影机械臂,这强化了我对项目潜在价值的信念。

机械臂的应用已经广泛渗透到我们的日常生活中,无论是在工业生产、日常服务,还是在艺术创作领域,都发挥着越来越重要的作用。随着人工智能技术的不断进步和普及,AI与机器人的结合无疑将成为未来技术发展的重要趋势。我对机器人技术的未来发展抱有极大的期待,相信未来它们将在更多领域发挥出惊人的能力和创造力。

如果你对我的项目感兴趣,或者有任何想法和建议,非常欢迎与我交流。你的反馈将对我继续改进和完善这个项目提供宝贵的帮助。

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

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

相关文章

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

linux的压缩与备份

一、打包 格式&#xff1a;tar -参数 <打包文件名> <打包的目标> 作用&#xff1a;将文件或者目录打包 重要参数&#xff1a;-f 使用归档文件&#xff0c;一定要加上这个参数 -c 新建打包文件 -x 解包文件 -t 可以不用解包就能查看包文件内容 -v 打包和解包时显…

《Fundamentals of Power Electronics》——Boost电路及仿真

Boost电路的拓扑结构如下所示&#xff1a; 下面是在simulink中搭建的一个Boost电路的仿真实验平台&#xff0c;其中直流输入电压为100V&#xff0c;电感值为1mH(模拟电阻为1毫欧)&#xff0c;电容值为470uF&#xff0c;负载为50欧姆&#xff0c;占空比选择为0.5&#xff0c;开关…

Cmake Learn

目录 1 常用命令 &#xff08;1&#xff09;configure_file &#xff08;2&#xff09;.cmake文件 &#xff08;3&#xff09; install &#xff08;4&#xff09;include_directories &#xff08;5&#xff09; add_subdirectory &#xff08;6&#xff09; find_libr…

C#队列(Queue)的基本使用

概述 在编程中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则。在C#中&#xff0c;.NET Framework提供了Queue<T>类&#xff0c;它位于System.Collections.Generic命名空间下&#x…

Aiseesoft Blu-ray Player for Mac:蓝光播放器

Aiseesoft Blu-ray Player for Mac是一款功能强大且易于使用的蓝光播放器&#xff0c;专为Mac用户打造。它以其卓越的性能和简洁的操作界面&#xff0c;为用户带来了全新的高清蓝光播放体验。 Aiseesoft Blu-ray Player for Mac v6.6.50激活版下载 这款软件支持播放任何高质量的…

AI视频教程下载:构建一个ChatGPT股票配对交易机器人

ChatGPT及其后续版本GPT-4已经开始改变世界。人们对新机会感到兴奋&#xff0c;同时对我们社会可能受到的影响感到恐惧。这门课程结合了两个主题&#xff1a;AI和财务&#xff08;算法交易&#xff09;。 你将会学到的&#xff1a; 使用ChatGPT构建一个Python配对交易机器人 …

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 打家劫舍 II(难度⭐⭐)(67)

1. 题目解析 题目链接&#xff1a;213. 打家劫舍 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 这个问题是经典的“打家劫舍”问题的变种&#xff0c;原问题是在单排房屋中进行偷窃&#xff0c;而这个问题则是在…

Idea报错:无法访问org.springframework.boot.SpringApplication

在开发项目时&#xff0c;常常会遇到这种问题&#xff0c;报错信息如下图所示 版本号与jdk版本号存在对应关系&#xff0c;61.0对应jdk17&#xff0c;52.0对应jdk8 所以是某个依赖的版本太高&#xff0c;降低该依赖的版本即可 具体步骤&#xff1a; ①修改pom.xml中spring b…

Redis基本數據結構 ― String

Redis基本數據結構 ― String 介紹常用命令範例1. 為字串鍵設值/取得字串鍵的值2. 查看字串鍵的過期時間3. 如何為key設置時間?4. 如何刪除指定key?5. 如何增加value的值?6. 獲取value值的長度 介紹 字串鍵是Redis中最基本的鍵值對類型&#xff0c;這種類型的鍵值對會在數據…

Working with Design Patterns in Go (Golang)

introduction&#xff1a; 1、go及GoLand的下载安装&#xff1a; 安装包下载地址为&#xff1a;https://golang.org/dl/ 推荐使用国内地址:Go下载 - Go语言中文网 - Golang中文社区 2、Docker Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜…

算法学习(5)-图的遍历

目录 什么是深度和广度优先 图的深度优先遍历-城市地图 图的广度优先遍历-最少转机 什么是深度和广度优先 使用深度优先搜索来遍历这个图的过程具体是&#xff1a; 首先从一个未走到过的顶点作为起始顶点&#xff0c; 比如以1号顶点作为起点。沿1号顶点的边去尝试访问其它未…

pycharm 安装“通义灵码“并测试

过程&#xff1a;“File>setting>Plugins” 提示&#xff1a; 翻译之后&#xff1a; 点击"接受"之后&#xff0c;提示一下图片&#xff0c;点击ok 安装完成&#xff1a; 安装完"通义灵码"之后&#xff0c;需要登陆&#xff0c;登陆后测试 参考…

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自&#xff1a;Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…

FPGA高端项目:FPGA帧差算法多目标图像识别+目标跟踪,提供11套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA帧差算法单个目标图像识别目标跟踪 3、详细设计方案设计原理框图运动目标检测原理OV5640摄像头配置与采集OV7725摄像头配置与采集RGB视频流转AXI4-StreamVDMA图像缓存多目标帧差算法图像识别目标跟踪模块视频输出Xilinx系列FPGA工程源…

STM32之HAL开发——ADC入门介绍

ADC简介 模数转换&#xff0c;即Analog-to-Digital Converter&#xff0c;常称ADC&#xff0c;是指将连续变量的模拟信号转换为离散的数字信号的器件&#xff0c;比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101&#xff0c;这样ADC就建立了模拟世界的传感器和…

机器学习每周挑战——百思买数据

最近由于比赛&#xff0c;断更了好久&#xff0c;从五一开始不会再断更了。这个每周挑战我分析的较为简单&#xff0c;有兴趣的可以将数据集下载下来试着分析一下&#xff0c;又不会的我们可以讨论一下。 这是数据集&#xff1a; import pandas as pd import numpy as np impo…

leetcode_38.外观数列

38. 外观数列 题目描述&#xff1a;给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1…

bugku-ok

打开文件发现有很多ok的字符 转在线地址解码

基于3D机器视觉的注塑缺陷检测解决方案

注塑检测是对注塑生产过程中的产品缺陷进行识别和检测的过程。这些缺陷可能包括色差、料流痕、黑点&#xff08;包括杂质&#xff09;等&#xff0c;它们可能是由多种因素引起&#xff0c;如原料未搅拌均匀、烘料时间过长、工业温度局部偏高、模具等问题造成的。不仅影响产品的…