0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何完成機械臂的運動控制模塊

大象機器人科技 ? 來源:大象機器人科技 ? 作者:大象機器人科技 ? 2023-02-10 16:07 ? 次閱讀

使用一個桌面型的六軸機械臂,在機械臂的末端安裝一個攝像頭,來進行人臉識別和跟蹤的一個功能。該功能分為兩個模塊,一個是人臉識別模塊,另一個是機械臂的運動控制模塊

在前文有介紹到怎么控制機械臂的基本運動和人臉識別是如何實現(xiàn)的,在這里就不再復(fù)述了,本篇的內(nèi)容主要是介紹是如何完成運動控制模塊的。

使用到的設(shè)備

mechArm 270 -Pi ,適配的攝像頭

poYBAGPl-0GABAlBAAFYH_5d57w716.jpg

設(shè)備的詳情可以了解前文

機械臂的運動控制模塊

接下來介紹運動控制的模塊。

控制模塊,常見的運動控制輸入的是笛卡爾空間的絕對位置,想要獲得絕對位置需要做相機和手臂的手眼標(biāo)定算法,這個涉及的未知參數(shù)就有十幾個了,我們略過了這個步驟,選擇使用相對位移做運動控制,這就需要設(shè)計一套采樣運動機制,確保一次控制周期能完整地獲得人臉的偏移并實施跟蹤。

所以我想要整個功能能夠快速呈現(xiàn)出來,就沒有選擇用手眼標(biāo)定的算法來處理相機和手臂的關(guān)系。因為手眼標(biāo)定的工作量是相當(dāng)龐大的。

下面的代碼是:從人臉識別算法中得到的信息來獲取參數(shù)。

code


_, img = cap.read()
# Converted to grey scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detecting faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Drawing the outline
for (x, y, w, h) in faces:
if w > 200 or w < 80:?
#Limit the recognition width to between 80 and 200 pixels
continue
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 3)
center_x = (x+w-x)//2+x
center_y = (y+h-y)//2+y
size_face = w


將獲取到的 center_x,center_y ,size_face這幾個變量用來計算位置。

下面是處理數(shù)據(jù)來控制運動的算法的代碼


run_num = 20 #Control cycle of 20 frames
if save_state == False:
# Save a start point (save_x, save_y)
save_x = center_x
save_y = center_y
save_z = size_face
origin_angles = mc.get_angles()
print("origin point = ", save_x, save_y, origin_angles)
time.sleep(2);
current_coords = mc.get_coords()
save_state = TRUE
else:
if run_count > run_num: # Limit the control period to 20 frames
run_count = 0
# Recording relative offsets
error_x = center_x - save_x
error_y = center_y - save_y
error_z = size_face - save_z

# Pixel differences are converted into actual offsets, which can be scaled and oriented
trace_1 = -error_x * 0.15
trace_z = -error_y * 0.5
trace_x = -error_z * 2.0

# x/z axis offset, note that this is open loop control
current_coords[2] += trace_z
current_coords[0] += trace_x

#Restricting the Cartesian space xz range
if current_coords[0] < 70:
current_coords[0] = 70

if current_coords[0] > 150:
current_coords[0] = 150

if current_coords[2] < 220:
current_coords[2] = 220

if current_coords[2] > 280:
current_coords[2] = 280

# Inverse kinematic solutions
x = current_coords[0]
z = current_coords[2]
# print(x, z)

L1 = 100;
L3 = 96.5194;
x = x - 56.5;
z = z - 114;

cos_af = (L1*L1 + L3*L3 - (x*x + z*z))/(2*L1*L3);
cos_beta = (L1*L1 - L3*L3 + (x*x + z*z))/(2*L1*math.sqrt((x*x + z*z)));
reset = False
# The solution is only applicable to some poses, so there may be no solution
if abs(cos_af) > 1:
reset = True
if reset == True:
current_coords[2] -= trace_z
current_coords[0] -= trace_x
print("err = ",cos_af)
continue

af = math.acos(cos_af);
beta = math.acos(cos_beta);

theta2 = -(beta + math.atan(z/x) - math.pi/2);
theta3 = math.pi/2 - (af - math.atan(10/96));
theta5 = -theta3 - theta2;
cof = 57.295 #Curvature to angle

move_juge = False
# Limits the distance travelled, where trace_1 joint is in ° and trace_x/z is in mm
if abs(trace_1) > 1 and abs(trace_1) < 15:
move_juge = True
if abs(trace_z) > 10 and abs(trace_z) < 50:
move_juge = True
if abs(trace_x) > 25 and abs(trace_x) < 80:
move_juge = True

if (move_juge == True):
print("trace = ", trace_1, trace_z, trace_x)
origin_angles[0] += trace_1
origin_angles[1] = theta2*cof
origin_angles[2] = theta3*cof
origin_angles[4] = theta5*cof
mc.send_angles(origin_angles, 70)
else:
#Due to the open-loop control, if no displacement occurs the current coordinate value needs to be restored
current_coords[2] -= trace_z
current_coords[0] -= trace_x
else:
# 10 frames set aside for updating the camera coordinates at the end of the motion
if run_count < 10:
save_x = center_x
save_y = center_y
save_z = size_face
run_count += 1

在算法模塊中,獲得相對位移后如何進行手臂移動,為了確保運動效果我們并沒有直接采用mecharm提供的坐標(biāo)運動接口,而是在python中添加了逆運動學(xué)部分,針對應(yīng)用場景計算了特定姿態(tài)下的機械臂逆解,將坐標(biāo)運動轉(zhuǎn)化成了角度運動,避免了奇異點等影響笛卡爾空間運動的因素。結(jié)合上人臉識別部分的代碼,整個項目就算是完成了。

正常來說人臉識別會對算力有比較高的要求,它的算法機制是針對相鄰像素做重復(fù)計算從而增加識別精度,我們使用的mechArm 270-Pi它的主控是以樹莓派4B 為處理器,來進行人臉識別的算力處理。

樹莓派的算力是400MHZ。我們用的樹莓派算力不足所以簡化了這個過程,把識別機制改成了只算幾次的模糊識別,在我們應(yīng)用的時候就需要背景簡單一些。

總結(jié)

這個人臉識別和機械臂跟蹤項目到目前就算是做完了。

總結(jié)項目一些關(guān)鍵信息:

1 在對于低算力的情況下,設(shè)定簡單的使用場景,實現(xiàn)流暢的效果

2 將復(fù)雜的手眼標(biāo)定算法換成選擇相對位置移動,使用采樣運動機制,確保每一控制周期能完整的獲得人臉的偏移并跟蹤

3 在python中添加了逆運動學(xué)部分,針對應(yīng)用場景計算了特定姿態(tài)下的機械臂逆解,將坐標(biāo)運動轉(zhuǎn)化成了角度運動,避免了奇異點等影響笛卡爾空間運動。

項目一些不足的地方:

在使用的場景有一定的要求,需要干凈的背景才能運行成功。(通過固定的場景,簡化了很多參數(shù))

前面也有提到,樹莓派的算力是不足的,更換其他控制主板的,運行起來會更加流暢,例如用jetsonnano (600MHZ),高性能圖像處理的電腦

另外就是運動控制模塊,因為沒有做手眼標(biāo)定所以只能用相對位移,控制分為“采樣階段”“移動階段”,目前盡量要求采樣的時候鏡頭是靜止的,但實際上比較難保證鏡頭靜止,就會出現(xiàn)在采樣的時候鏡頭同時還在運動,導(dǎo)致讀到的坐標(biāo)會有偏差。

最后,在這里特別感謝大象機器人在項目的開發(fā)時提供的幫助,能夠讓項目完成。這次使用的mechArm是一款中心對稱結(jié)構(gòu)的機械臂,在關(guān)節(jié)運動上有所限制,如果將程序運用在活動范圍更加靈活的mycobot上可能是不一樣情況。

如果你對項目有啥想要了解更多的地方請在下方給我留言。

審核編輯黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機器人
    +關(guān)注

    關(guān)注

    210

    文章

    27839

    瀏覽量

    204596
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84079
  • 機械臂
    +關(guān)注

    關(guān)注

    12

    文章

    502

    瀏覽量

    24298
收藏 人收藏

    評論

    相關(guān)推薦

    通過檢測手臂運動控制機械

    /id_XNTkxNjgwMDg=.html這里有一個我搜到的 做得挺好的,但是我不知道怎么實現(xiàn)。首先要求是用PIC單片機來做檢測手臂運動控制機械。就是手臂
    發(fā)表于 12-23 11:48

    基于LabVIEW和SolidWorks改進機械的設(shè)計流程

    和移動殘骸、檢查車輛車盤和完成大部分現(xiàn)在使用的機器人所無法完成的其他任務(wù)。這就是約束區(qū)域機器人手臂(CARMA)開發(fā)。 CARMA機械成品  將這個項目作為提高設(shè)計流程效率并大幅擴展
    發(fā)表于 02-12 15:56

    基于LabVIEW的四自由度機械運動控制系統(tǒng)設(shè)計

    實行位置伺服和編碼器反饋,對直流電機利用線性電位器反饋電壓的方式實現(xiàn)了角度的反饋控制。借助LabVIEW8.2 的強大功能,我們得以在短時間內(nèi)完成控制系統(tǒng)的開發(fā),同時保證了機械
    發(fā)表于 02-12 16:10

    采用LabVIEW實現(xiàn)四自由度機械運動控制系統(tǒng)設(shè)計

    LabVIEW8.2的強大功能,我們得以在短時間內(nèi)完成控制系統(tǒng)的開發(fā),同時保證了機械運動精度與負(fù)載能力。四自由度
    發(fā)表于 05-06 09:26

    STM32與樹莓派交互控制機械

    (并不)常見的五自由度機械。盡管商家稱它為六自由度。這里使用STM32F407VGT6的6路PWM輸出通道來控制6個舵機的運動,樹莓派(上位機)通過USB轉(zhuǎn)TTL
    發(fā)表于 07-01 10:24

    基于單片機的三軸機械控制怎么實現(xiàn)

    文章目錄三軸機械控制原理三軸機械接線三軸機械
    發(fā)表于 12-13 07:14

    機械的相關(guān)資料分享

    [四]機械手臂的逆運動學(xué)解正運動學(xué)分析是已知每個關(guān)節(jié)的姿態(tài)的前提下,解算出末端執(zhí)行器的姿態(tài)。而逆運動學(xué)研究的問題是,要求控制末端執(zhí)行器到達某
    發(fā)表于 01-20 06:46

    基于STC8H1K28雙軸機械驅(qū)動模塊設(shè)計

    、肩關(guān)節(jié)以及上下移動關(guān)節(jié)的機械平臺可以完成這項設(shè)計。在基于STC8H1K28雙軸機械驅(qū)動模塊 給出了對肩關(guān)節(jié)、肘關(guān)節(jié)上的步進電機、角度傳感
    發(fā)表于 02-18 06:01

    機械控制學(xué)習(xí)

    機械向前運動1cm,就是運動1cm)。這種控制在涉及到接觸作業(yè)時就會產(chǎn)生麻煩,因為現(xiàn)實環(huán)境是充滿各種誤差的,位置上很小的誤差,經(jīng)過大剛度的
    發(fā)表于 02-23 07:49

    六自由度機械運動規(guī)劃

    為了使六自由度機械完成特定的動作, 需要設(shè)計計算相應(yīng)的指令序列. 首先計算了機械位姿與指尖位置之間的關(guān)系公式, 然后針對
    發(fā)表于 02-17 16:55 ?193次下載
    六自由度<b class='flag-5'>機械</b><b class='flag-5'>臂</b>的<b class='flag-5'>運動</b>規(guī)劃

    機械運動軌跡優(yōu)化方法

    機械運動軌跡是指通過給定的路徑的起點與終點,以及機構(gòu)本身或者機構(gòu)運行所存在的約束條件,求出每個關(guān)節(jié)的位移S,速度v,加速a的完整過程。 文中采用笛卡爾空間的網(wǎng)弧插值法使得機械
    發(fā)表于 11-03 10:26 ?10次下載
    雙<b class='flag-5'>機械</b><b class='flag-5'>臂</b><b class='flag-5'>運動</b>軌跡優(yōu)化方法

    DSP的機械預(yù)測控制

    針對機械的實時控制問題,基于約束預(yù)測控制,提出了一種機械實時
    發(fā)表于 03-26 09:33 ?1次下載
    DSP的<b class='flag-5'>機械</b><b class='flag-5'>臂</b>預(yù)測<b class='flag-5'>控制</b>

    使用Zio模塊控制機械(第4部分)

    電子發(fā)燒友網(wǎng)站提供《使用Zio模塊控制機械(第4部分).zip》資料免費下載
    發(fā)表于 12-30 10:15 ?0次下載
    使用Zio<b class='flag-5'>模塊</b><b class='flag-5'>控制</b><b class='flag-5'>機械</b><b class='flag-5'>臂</b>(第4部分)

    實現(xiàn)使用語音控制機械運動

    使用語音控制myCobot機械運動
    的頭像 發(fā)表于 03-17 18:13 ?1113次閱讀
    實現(xiàn)使用語音<b class='flag-5'>控制</b><b class='flag-5'>機械</b><b class='flag-5'>臂</b><b class='flag-5'>運動</b>

    【開源獲獎案例】四軸機械控制系統(tǒng)

    ——來自迪文開發(fā)者論壇本期為大家推送迪文開發(fā)者論壇獲獎開源案例——四軸機械控制系統(tǒng)。工程師采用T5L智能屏,基于DGUS軟件“旋轉(zhuǎn)指示”控件實現(xiàn)機械
    的頭像 發(fā)表于 12-23 08:13 ?901次閱讀
    【開源獲獎案例】四軸<b class='flag-5'>機械</b><b class='flag-5'>臂</b><b class='flag-5'>控制</b>系統(tǒng)