引言
有沒有遇到過這樣的情況:當(dāng)你手持手機(jī)或相機(jī)準(zhǔn)備拍攝視頻時(shí),心中已經(jīng)構(gòu)想了完美的畫面,但卻因?yàn)閷?shí)際的限制無法捕捉到理想中的角度?這種情況可能會(huì)讓人感到挫折。例如,如果想要從地面一只螞蟻的視角拍攝,鏡頭需要與螞蟻處于同一水平線上,這在操作上不僅困難,而且往往難以實(shí)現(xiàn)。
盡管目前市場(chǎng)上有許多穩(wěn)定設(shè)備如平衡環(huán)架(gimbal)來輔助拍攝,以求達(dá)到穩(wěn)定和多角度的拍攝效果,但在此篇文章中,我將探索一種獨(dú)特的解決方案:通過將手機(jī)安裝在機(jī)械臂的末端來進(jìn)行拍攝,以實(shí)現(xiàn)那些傳統(tǒng)方法難以捕捉的特殊視角。此次嘗試不僅旨在克服拍攝過程中的物理限制,而且也期望通過技術(shù)的創(chuàng)新來開拓我們對(duì)攝影角度的想象和實(shí)踐。
設(shè)備
myCobot 320 M5stack
myCobot 320,一款具備六自由度的協(xié)作型機(jī)械臂,憑借其獨(dú)特的設(shè)計(jì)和高精度伺服電機(jī)成為了領(lǐng)域內(nèi)的亮點(diǎn)。這款機(jī)械臂擁有最大350mm的工作半徑和最大1000g的末端負(fù)載能力,使其適用于廣泛的應(yīng)用場(chǎng)景。myCobot 320不僅支持靈活的視覺開發(fā)應(yīng)用,還提供了深入的機(jī)械運(yùn)動(dòng)原理解析,為用戶帶來了12個(gè)標(biāo)準(zhǔn)的24V工業(yè)IO接口,滿足不同的開發(fā)需求。

它的開放性極高,兼容大多數(shù)主流操作系統(tǒng)和編程語言,包括Python和ROS等,為開發(fā)者提供了極大的靈活性和自由度。無論是在教育、研發(fā)還是工業(yè)應(yīng)用中,myCobot 320都能提供強(qiáng)大支持,使創(chuàng)新和應(yīng)用開發(fā)更加便捷高效。
myCobot Pro phone holder
它可以安裝在myCobot 320,myCobot pro 630機(jī)械臂的末端,能夠穩(wěn)定的固定住手機(jī)。


以上就是我們需要使用到的設(shè)備了。
初次嘗試
安裝手機(jī)支架
整體安裝的效果圖片

基礎(chǔ)控制測(cè)試
做一個(gè)簡(jiǎn)單的嘗試。

拍攝視頻
給機(jī)械臂進(jìn)行關(guān)節(jié)控制的編程,讓我們一起看看效果如何。
盡管視頻中展示的機(jī)械臂運(yùn)動(dòng)軌跡看似簡(jiǎn)單,但實(shí)際上,調(diào)整這些軌跡點(diǎn)位仍需耗費(fèi)大量時(shí)間,且效果未必理想。因此,我在考慮是否存在更優(yōu)解決方案,例如,通過設(shè)定幾種運(yùn)動(dòng)模式和預(yù)先規(guī)劃?rùn)C(jī)械臂的拍攝路徑。這不僅能夠有效利用機(jī)械臂輔助拍攝,同時(shí)也提供了一種更為高效的部署方式。
編程挑戰(zhàn)
開發(fā)需求分析
確定使用的設(shè)備如下

需求:需求優(yōu)化:
目標(biāo)是為靜態(tài)物體拍攝場(chǎng)景設(shè)計(jì)一系列創(chuàng)新的視頻拍攝方式,初步計(jì)劃采用三種方法:
1. 利用機(jī)械臂末端固定的手機(jī),實(shí)現(xiàn)物體360°全景視頻拍攝。
2. 創(chuàng)建一種畫面效果,從遠(yuǎn)處平緩?fù)七M(jìn)至物體近前,模擬“拉近鏡頭”的效果。
3. 實(shí)現(xiàn)機(jī)械臂末端的快速旋轉(zhuǎn)與移動(dòng),捕捉動(dòng)感十足的畫面。
為了精準(zhǔn)控制拍攝過程,計(jì)劃利用OpenCV機(jī)器視覺算法和AVFoundation iOS框架,通過Python腳本控制機(jī)械臂的精確運(yùn)動(dòng)。我們將通過手機(jī)攝像頭識(shí)別物體的尺寸,進(jìn)而計(jì)算出機(jī)械臂末端與物體之間的理想距離。根據(jù)這個(gè)距離,設(shè)計(jì)相應(yīng)的機(jī)械臂運(yùn)動(dòng)算法,確保拍攝過程中能夠獲得最佳畫面效果。

YOLO視覺算法
為了節(jié)省時(shí)間,我們將不會(huì)自行訓(xùn)練機(jī)器視覺算法來識(shí)別特定物體。相反,我們直接采用其他開發(fā)者已經(jīng)訓(xùn)練優(yōu)化的YOLOv5庫,以實(shí)現(xiàn)對(duì)目標(biāo)物體的準(zhǔn)確檢測(cè)。
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()

保留識(shí)別物體的尺寸的數(shù)據(jù),之后要用在別的地方上。
機(jī)械臂運(yùn)動(dòng)控制算法
機(jī)械臂的控制方法
# 這個(gè)方法控制機(jī)械臂的關(guān)節(jié)進(jìn)行運(yùn)動(dòng) mc.send_angles([angle_list],speed) # 這個(gè)方法用坐標(biāo)控制機(jī)械臂在空間上進(jìn)行運(yùn)動(dòng) 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)
獲得物體的尺寸數(shù)據(jù)之后,定義機(jī)械臂末端距離物體的合理位置
def calculate_angles_for_distance(distance): # 根據(jù)理想距離計(jì)算機(jī)械臂的關(guān)節(jié)角度 # 這里的計(jì)算需要根據(jù)實(shí)際情況和物理參數(shù)進(jìn)行調(diào)整 return [0, -10, distance * 0.1, 0, 30, 0] def calculate_adjusted_angles(action_angles): # 基于特定動(dòng)作后可能需要的坐標(biāo)調(diào)整計(jì)算新的角度 # 這里僅為示例,具體邏輯根據(jù)需要調(diào)整 return [angle * 1.1 for angle in action_angles]
再選擇模式對(duì)應(yīng)的運(yùn)動(dòng)控制
#360全景拍攝 # 定義具體的拍攝模式 def shoot_mode_360(ideal_distance): print("執(zhí)行360°全景拍攝模式") # 首先,移動(dòng)到理想拍攝位置 move_to_ideal_position(ideal_distance) # 處理理想距離 ideal_ratio = ratio # 執(zhí)行360°全景拍攝的特定動(dòng)作 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)
手機(jī)相機(jī)的調(diào)用
在開發(fā)過程中,嘗試調(diào)用手機(jī)攝像頭接口以實(shí)現(xiàn)自動(dòng)化拍攝功能,我遇到了一系列挑戰(zhàn)。作為我的第一次深入探索AVFoundation iOS框架,目標(biāo)是激活并控制手機(jī)的攝像頭,我發(fā)現(xiàn)自己還未能完全成功實(shí)現(xiàn)這一功能。當(dāng)前的難點(diǎn)主要集中在如何準(zhǔn)確調(diào)用攝像頭進(jìn)行視頻拍攝,以及在拍攝過程中如何通過軟件調(diào)整來補(bǔ)償圖像的可能拉伸,這需要對(duì)機(jī)械臂的運(yùn)動(dòng)進(jìn)行精細(xì)控制。
這些問題標(biāo)志著我后續(xù)研究的重點(diǎn)方向,需要我繼續(xù)深入學(xué)習(xí)AVFoundation框架的使用,特別是其控制攝像頭的具體方法,并探索如何將這些控制整合到機(jī)械臂的運(yùn)動(dòng)調(diào)整中,以確保最終拍攝出的視頻質(zhì)量符合預(yù)期。
總結(jié)
隨著這次項(xiàng)目記錄的結(jié)束,我意識(shí)到雖然項(xiàng)目尚有諸多不足,但這次嘗試將兩個(gè)獨(dú)立設(shè)備在不同的框架下協(xié)同工作,對(duì)我來說仍是一次寶貴的經(jīng)驗(yàn)。確實(shí),整個(gè)項(xiàng)目目前尚未達(dá)到我心中的理想狀態(tài)。然而,我認(rèn)為這個(gè)項(xiàng)目探索的方向極具潛力,考慮到市面上已經(jīng)存在能夠拍攝出令人贊嘆效果的專業(yè)攝影機(jī)械臂,這強(qiáng)化了我對(duì)項(xiàng)目潛在價(jià)值的信念。
機(jī)械臂的應(yīng)用已經(jīng)廣泛滲透到我們的日常生活中,無論是在工業(yè)生產(chǎn)、日常服務(wù),還是在藝術(shù)創(chuàng)作領(lǐng)域,都發(fā)揮著越來越重要的作用。隨著人工智能技術(shù)的不斷進(jìn)步和普及,AI與機(jī)器人的結(jié)合無疑將成為未來技術(shù)發(fā)展的重要趨勢(shì)。我對(duì)機(jī)器人技術(shù)的未來發(fā)展抱有極大的期待,相信未來它們將在更多領(lǐng)域發(fā)揮出驚人的能力和創(chuàng)造力。
如果你對(duì)我的項(xiàng)目感興趣,或者有任何想法和建議,非常歡迎與我交流。你的反饋將對(duì)我繼續(xù)改進(jìn)和完善這個(gè)項(xiàng)目提供寶貴的幫助。
審核編輯 黃宇
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29563瀏覽量
211925 -
開源
+關(guān)注
關(guān)注
3文章
3632瀏覽量
43578 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86355 -
機(jī)械臂
+關(guān)注
關(guān)注
13文章
547瀏覽量
25272 -
大象機(jī)器人
+關(guān)注
關(guān)注
0文章
85瀏覽量
76
發(fā)布評(píng)論請(qǐng)先 登錄
大象機(jī)器人攜手進(jìn)迭時(shí)空推出 RISC-V 全棧開源六軸機(jī)械臂產(chǎn)品

大象機(jī)器人攜手進(jìn)迭時(shí)空推出 RISC-V 全棧開源六軸機(jī)械臂產(chǎn)品
大象機(jī)器人×進(jìn)迭時(shí)空聯(lián)合發(fā)布全球首款RISC-V全棧開源小六軸機(jī)械臂

大象機(jī)器人攜手地瓜機(jī)器人打造全國產(chǎn)輕量級(jí)教育協(xié)作機(jī)械臂新標(biāo)桿

大象機(jī)器人推出myCobot 280 RDK X5,攜手地瓜機(jī)器人共建智能教育機(jī)

開源項(xiàng)目!教你如何制作一個(gè)開源教育機(jī)械臂
大象機(jī)器人以科技治愈人心
專為機(jī)器人教育而設(shè)計(jì)的創(chuàng)客友好型機(jī)械臂

如何使用PLC控制myCobot 320機(jī)械臂

使用myCobot 280機(jī)械臂結(jié)合ROS2系統(tǒng)搭建機(jī)械分揀站

大象機(jī)器人11月大事件回顧
大象機(jī)器人10月大事件回顧
開源六軸協(xié)作機(jī)器人myCobot 320結(jié)合人臉表情識(shí)別情緒!

大象機(jī)器人開源協(xié)作機(jī)械臂機(jī)械臂接入GPT4o大模型!

評(píng)論