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

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

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

對(duì)弈人工智能!myCobot 280開源六軸機(jī)械臂Connect 4 四子棋對(duì)弈下篇

大象機(jī)器人科技 ? 來源:大象機(jī)器人科技 ? 作者:大象機(jī)器人科技 ? 2023-06-16 17:16 ? 次閱讀

前言

在上篇文章中,我們探討了如何創(chuàng)造一個(gè)能夠進(jìn)行Connect4的對(duì)弈大腦。簡單的介紹了幾種對(duì)弈算法,例如極小化極大算法,Alpha-Beta剪枝算法等,最關(guān)鍵的是目前最流行的神經(jīng)網(wǎng)絡(luò)算法和深度學(xué)習(xí)。神經(jīng)網(wǎng)絡(luò)算法,讓計(jì)算機(jī)也有一個(gè)想人類一樣能夠思考的大腦,設(shè)置獨(dú)特的場景來進(jìn)行學(xué)習(xí)下棋。在本篇文章中,我們將進(jìn)一步探討如何讓機(jī)械臂來實(shí)現(xiàn)下棋動(dòng)作,將想法給實(shí)現(xiàn)出來。(換句話說就是,AI機(jī)械臂下棋)

如果感興趣歡迎觀看上篇文章。

Introduction

下面的內(nèi)容主要分為四個(gè)部分來進(jìn)行介紹。

● 獲取信息:用攝像頭獲取到棋盤上的信息,進(jìn)行對(duì)弈


            ● 處理信息:處理獲取到的信息識(shí)別出棋子的位置,通過對(duì)弈算法,計(jì)算出下一步棋子應(yīng)該在哪里下


            ● 機(jī)械臂的軌跡:設(shè)計(jì)機(jī)械臂如何抓取棋子,設(shè)計(jì)放置棋子的路徑


            ● 功能的整合:將上面三個(gè)功能結(jié)合在一起,實(shí)現(xiàn)AI機(jī)械臂下棋。

讓我們一起來看看吧~

項(xiàng)目

獲取信息

環(huán)境:python最新版的opencv,numpy

首先需要獲取棋盤的信息,信息包括棋盤,棋盤上的棋子。我們用到的是OpenCV當(dāng)中cv2.aruco.ArucoDetector(dictionary, parameters)

該方法用來檢測(cè)Aruco二維碼,從圖片當(dāng)中標(biāo)記出Aruco的位置,并且計(jì)算出標(biāo)記的位置和姿態(tài)信息。這樣就能夠確定整個(gè)棋盤的位置了,確定四個(gè)角的位置。

Code:代碼是用cv2.aruco.ArucoDetector(dictionary, parameters)方法來確定我們棋盤的位置。

dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
        parameters = cv2.aruco.DetectorParameters()
        detector = cv2.aruco.ArucoDetector(dictionary, parameters)

        corners, ids, rejectedCandidates = detector.detectMarkers(bgr_data)
        rvec, tvec, _ = cv2.aruco.estimatePoseSingleMarkers(corners, 0.05, self.mtx, self.dist)

        if rvec is None or len(corners) != 4:
            return None

# debug
        if DEBUG:
            debug_img = bgr_data.copy()
            for i in range(rvec.shape[0]):
                cv2.drawFrameAxes(debug_img, self.mtx, self.dist, rvec[i, :, :, ], tvec[i, :, :, ],
                                  0.03)
# Draw a square around the marker.
                cv2.aruco.drawDetectedMarkers(debug_img, corners)
            cv2.imshow("debug1", debug_img)

# Sort the detected QR code corner points in the following order: top left, top right, bottom left, bottom right.
        corners = np.mean(corners, axis=2)
        corners = (np.ceil(corners)).astype(int)
        corners = corners.reshape((4, 2))
        cx, cy = (np.mean(corners[:, 0]), np.mean(corners[:, 1]))
        res: list = [None for _ in range(4)]
        for x, y in corners:
            if x < cx and y < cy:
                res[0] = (x, y)
            elif x > cx and y < cy:
                res[1] = (x, y)
            elif x < cx and y > cy:
                res[2] = (x, y)
            else:
                res[3] = (x, y)
        res = np.array(res)

## debug code
        if DEBUG:
            debug_img = bgr_data.copy()
            for p in res:
                cv2.circle(debug_img, p, 3, BGR_GREEN, -1)
            cv2.imshow("aruco", debug_img)

        return res

確定完棋盤之后,我們用不同的顏色來當(dāng)棋子,這里就用兩種區(qū)分度比較大的顏色,紅色和黃色,并且標(biāo)注出來。

設(shè)置一個(gè)邏輯,當(dāng)棋面每多一枚棋子的時(shí)候,將當(dāng)前棋盤的數(shù)據(jù)返回給到對(duì)弈算法,進(jìn)行判斷下一步棋應(yīng)該如何走。

處理信息

接下來需要處理棋盤的信息。

從上邊可以看到我們獲取到了棋盤的數(shù)據(jù),接下來我們需要把數(shù)據(jù),傳遞給對(duì)弈算法,讓對(duì)弈算法將下一步棋子的位置預(yù)測(cè)出來。

下面是處理的偽代碼:

functionmodel_predict(state, available_actions):
# 將available_actions轉(zhuǎn)換為numpy數(shù)組
    available_actions = np.array(available_actions)
# 對(duì)state進(jìn)行擴(kuò)展,以適應(yīng)ONNX模型的輸入要求
    state = np.expand_dims(np.expand_dims(np.array(state, dtype=np.float32), axis=0), axis=0)
# 構(gòu)建ONNX模型的輸入
    ort_inputs ={self.policy_net.get_inputs()[0].name: state}
# 進(jìn)行模型預(yù)測(cè),獲取每個(gè)可用位置的預(yù)測(cè)值
    r_actions =self.policy_net.run(None, ort_inputs)[0][0,:]
# 根據(jù)預(yù)測(cè)值選擇最優(yōu)的落子位置
    state_action_values = np.array(
[r_actions[action]for action in available_actions])
    argmax_action = np.argmax(state_action_values)
    greedy_action = available_actions[argmax_action]
return greedy_action

該方法中的主要邏輯是使用ONNX模型來進(jìn)行模型預(yù)測(cè),并根據(jù)預(yù)測(cè)結(jié)果選擇最優(yōu)的落子位置。首先,將可用位置available_actions轉(zhuǎn)換為numpy數(shù)組,并將當(dāng)前游戲狀態(tài)state進(jìn)行擴(kuò)展,以適應(yīng)ONNX模型的輸入要求。然后,將擴(kuò)展后的state傳遞給ONNX模型進(jìn)行預(yù)測(cè),并將預(yù)測(cè)結(jié)果保存在r_actions變量中。接著,根據(jù)預(yù)測(cè)結(jié)果以及可用的落子位置,計(jì)算出每個(gè)可用位置的預(yù)測(cè)值,選取其中最大的一個(gè)對(duì)應(yīng)的落子位置作為最優(yōu)的落子位置,并將其返回。

機(jī)械臂的軌跡

大腦(對(duì)弈算法),眼睛(識(shí)別算法)都有了,現(xiàn)在就差一個(gè)手去執(zhí)行動(dòng)作。我們使用python庫pymycobot來對(duì)機(jī)械臂進(jìn)行控制。因?yàn)槠灞P的原因,棋子只能從棋盤的上方投下,我們給每一條數(shù)列的棋個(gè)上設(shè)置一個(gè)坐標(biāo)點(diǎn)位,就可以完成機(jī)械臂的路徑規(guī)劃了。因?yàn)槠迕姹容^干凈沒有遮擋物,所以不用考慮過多的路徑因素。

下面是機(jī)械臂運(yùn)行軌跡位置的偽代碼:

# 初始化定義幾個(gè)坐標(biāo)點(diǎn)
# 設(shè)定一個(gè)長度為7的列表
self.chess_table = [None for _ in range(7)]
self.chess_table[0]-[6] = [J1,J2,J3,J4,J5,J6] # 七個(gè)棋格的位置

self.angle_table = {
    "recovery": [0, 0, 0, 0, 0, 0], #初始位置
    "observe": [-2.54, 135.0, -122.95, -32.34, 2.46, -90.35],#觀察位置
    "stack-hover-1": [-47.19, -37.96, -58.53, 1.05, -1.93, -1.84],#吸取棋子的位置
        }

接下來介紹一下pymycobot當(dāng)中控制機(jī)械臂的一些方法:

#Sending the angle to the robotic arm.
self.send_angles(self.chess_table[n], ARM_SPEED)

#Sending the Cartesian coordinates to the robotic arm.
self.send_coords(coord_list,ARM_SPEED)

功能的整合

將功能點(diǎn)整合之前我們得整理它們之間的邏輯。

下棋的流程圖有了接下來就是,將功能點(diǎn)結(jié)合在一起.

這是程序的結(jié)構(gòu)文件。

├── Agent.py The logic of the robotic arm's gameplay.

├── ArmCamera.pyCamera control.

├── ArmInterface.py Robotics Arm control

├── Board.py Data structure of the chessboard and related judgments.

├── CameraDemo.py Small program for testing camera performance.

├── config.pyUtilized to define specific configuration details.

├── Detection.py Machine vision recognition.

├── dqn.ptNeural network model file, used to implement gameplay logic.

├── main.pymain program.

├── StateMachine.pyA state machine.

總結(jié)

從理論上來說的話,幾乎沒有人能夠在贏得勝利。因?yàn)闄C(jī)器的算法可以預(yù)測(cè)到后面將要下在幾步棋甚至更多,而對(duì)于普通人來說,一般能夠預(yù)測(cè)的也就兩三步棋。但是從視頻上來看,AI只贏了一場比賽,輸?shù)舻哪且粓鍪且驗(yàn)榻Y(jié)構(gòu)因素的影響,本來該下的棋盤的位置,被迫換了一個(gè)地方。

你覺得這個(gè)項(xiàng)目有意思嗎?我們會(huì)在后續(xù)將Connect4 這個(gè)套裝進(jìn)行完善后,上架在我們的網(wǎng)站,有興趣的朋友可以關(guān)注我們,后續(xù)會(huì)進(jìn)行更新。

你是否會(huì)嘗試用機(jī)械臂來實(shí)現(xiàn)其他的棋藝呢?例如國際象棋,中國象棋等,不同的棋藝所使用的算法也會(huì)大大不同,歡迎大家在地下跟我們留言進(jìn)行分享你們的想法。

審核編輯 黃宇

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

    關(guān)注

    210

    文章

    28018

    瀏覽量

    205621
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4580

    瀏覽量

    92374
  • 人工智能
    +關(guān)注

    關(guān)注

    1789

    文章

    46428

    瀏覽量

    236661
  • 機(jī)械臂
    +關(guān)注

    關(guān)注

    12

    文章

    504

    瀏覽量

    24427
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用myCobot 280 Jeston Nano進(jìn)行物體精確識(shí)別追蹤

    ,以便在實(shí)際應(yīng)用中發(fā)揮作用,這個(gè)項(xiàng)目涉及到許多技術(shù)和算法,包括視覺識(shí)別、手眼協(xié)同和機(jī)械控制等方面。 機(jī)械的介紹 mycobot280-J
    的頭像 發(fā)表于 05-24 18:20 ?1600次閱讀
    使用<b class='flag-5'>myCobot</b> <b class='flag-5'>280</b> Jeston Nano進(jìn)行物體精確識(shí)別追蹤

    對(duì)弈人工智能myCobot 280開源機(jī)械Connect 4 對(duì)弈

    Introduction Hi,guys.今天我們來介紹一下人工智能下棋,我們將用機(jī)械來作為對(duì)手跟你進(jìn)行下棋。 人工智能下棋的研究可以追溯到20世紀(jì)50年代。當(dāng)時(shí),計(jì)算機(jī)科學(xué)家開始探
    的頭像 發(fā)表于 05-29 15:26 ?1237次閱讀
    <b class='flag-5'>對(duì)弈</b><b class='flag-5'>人工智能</b>!<b class='flag-5'>myCobot</b> <b class='flag-5'>280</b><b class='flag-5'>開源</b><b class='flag-5'>六</b><b class='flag-5'>軸</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b><b class='flag-5'>Connect</b> <b class='flag-5'>4</b> <b class='flag-5'>四</b><b class='flag-5'>子</b><b class='flag-5'>棋</b><b class='flag-5'>對(duì)弈</b>

    子棋游戲里如何實(shí)現(xiàn)悔棋功能啊

    基于labview的五子棋游戲,有人機(jī)對(duì)弈和雙人對(duì)弈模式,雙人對(duì)弈在不聯(lián)網(wǎng)的情況下
    發(fā)表于 10-10 14:18

    怎樣去設(shè)計(jì)一種人機(jī)對(duì)弈子棋程序

    子棋游戲應(yīng)達(dá)到幾方面的要求?怎樣去設(shè)計(jì)一種人機(jī)對(duì)弈子棋程序?
    發(fā)表于 09-29 07:26

    基于LabVIEW的五子棋博弈算法

    針對(duì)目前五子棋人機(jī)對(duì)弈多數(shù)基于電腦、手機(jī),缺少真實(shí)環(huán)境的問題,提出一種基于LabVIEW的博弈算法,并運(yùn)用于真實(shí)的五子棋人機(jī)對(duì)弈。首先通過圖像采集系統(tǒng)獲取當(dāng)前狀態(tài)下棋盤及人機(jī)雙方棋子的
    發(fā)表于 12-17 11:32 ?29次下載

    實(shí)現(xiàn)人與機(jī)器人的直接對(duì)弈_強(qiáng)大的對(duì)弈系統(tǒng)如何實(shí)現(xiàn)

    機(jī)器人技術(shù)是綜合了計(jì)算機(jī)、控制論、結(jié)構(gòu)學(xué)、信息與傳感技術(shù)、仿生學(xué)及人工智能等多學(xué)科的一門高新技術(shù)。目前的人機(jī)對(duì)弈軟件不直觀、缺乏真正的對(duì)弈環(huán)境,而人機(jī)對(duì)弈機(jī)器人正是針對(duì)這些不足而設(shè)計(jì)的
    發(fā)表于 02-12 12:05 ?4608次閱讀

    3個(gè)時(shí)代,3盤對(duì)弈,人工智能是否能繼續(xù)戰(zhàn)勝人類?

    從人機(jī)對(duì)弈這件小事,和你聊聊人工智能的發(fā)展。
    的頭像 發(fā)表于 03-30 10:19 ?1.2w次閱讀

    對(duì)弈機(jī)器人與圖像識(shí)別

    對(duì)弈機(jī)器人是河南省人工智能展覽館的明星展品之一,參與者可以體驗(yàn)到“人機(jī)對(duì)戰(zhàn)”的挑戰(zhàn)與樂趣,在往期活動(dòng)中深受大小學(xué)生的歡迎。與對(duì)弈機(jī)器人的對(duì)戰(zhàn)簡單來說可以分為:圖像識(shí)別信息獲取分析計(jì)算控制落子
    的頭像 發(fā)表于 01-13 11:28 ?2231次閱讀

    機(jī)械免費(fèi)使用,學(xué)習(xí)ROS、Python火熱報(bào)名中

    延續(xù)至今。 今天我們將秉承自由共享的精神,和Arduino社區(qū)發(fā)起“百城萬里公益行”myCobot 280機(jī)械漂流活動(dòng)。 極客愛好者通過由大象機(jī)器人學(xué)院提供的
    發(fā)表于 03-31 15:28 ?1221次閱讀

    myCobot機(jī)械應(yīng)用于Unity機(jī)器人編程實(shí)戰(zhàn)課

    ER myCobot 280 Pi ,采用樹莓派微處理器,內(nèi)置ubuntu18.04系統(tǒng),無需搭配PC主控,鏈接外設(shè),即可快速構(gòu)建機(jī)械 編程教育、
    的頭像 發(fā)表于 06-16 14:33 ?2586次閱讀
    <b class='flag-5'>myCobot</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b>應(yīng)用于Unity機(jī)器人編程實(shí)戰(zhàn)課

    MyCobot機(jī)械開箱及開發(fā)前的準(zhǔn)備工作(一)

    MyCobot機(jī)械是一款入門級(jí)的自由度機(jī)械,目前是國產(chǎn)
    的頭像 發(fā)表于 09-30 10:00 ?1434次閱讀
    <b class='flag-5'>MyCobot</b><b class='flag-5'>六</b><b class='flag-5'>軸</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b>開箱及開發(fā)前的準(zhǔn)備工作(一)

    Mycobot機(jī)械各關(guān)節(jié)的運(yùn)動(dòng)(三)

    這一節(jié)我們開始第一個(gè)程序,就是機(jī)械各關(guān)節(jié)的運(yùn)動(dòng)。讓我們首先打開Mycobot,然后登入一個(gè)終端,我們輸入“python”進(jìn)入python環(huán)境。 ? 我們采用一邊實(shí)驗(yàn)一邊介紹MyCobot
    的頭像 發(fā)表于 09-30 18:08 ?1259次閱讀
    <b class='flag-5'>Mycobot</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b>各關(guān)節(jié)的運(yùn)動(dòng)(三)

    開源機(jī)械myCobot 280末端執(zhí)行器實(shí)用案例解析

    使用。 本文中主要介紹4款常用的機(jī)械的末端執(zhí)行器。 Product myCobot 280 M5Stack
    的頭像 發(fā)表于 10-16 16:28 ?1105次閱讀
    <b class='flag-5'>開源</b><b class='flag-5'>六</b><b class='flag-5'>軸</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b><b class='flag-5'>myCobot</b> <b class='flag-5'>280</b>末端執(zhí)行器實(shí)用案例解析

    開源獲獎(jiǎng)案例】機(jī)械控制系統(tǒng)

    ——來自迪文開發(fā)者論壇本期為大家推送迪文開發(fā)者論壇獲獎(jiǎng)開源案例——機(jī)械控制系統(tǒng)。工程師采用T5L
    的頭像 發(fā)表于 12-23 08:13 ?1048次閱讀
    【<b class='flag-5'>開源</b>獲獎(jiǎng)案例】<b class='flag-5'>四</b><b class='flag-5'>軸</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b>控制系統(tǒng)

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

    本文已經(jīng)或者同濟(jì)豪兄作者授權(quán)對(duì)文章進(jìn)行編輯和轉(zhuǎn)載 引言 隨著人工智能和機(jī)器人技術(shù)的快速發(fā)展,機(jī)械在工業(yè)、醫(yī)療和服務(wù)業(yè)等領(lǐng)域的應(yīng)用越來越廣泛。通過結(jié)合大模型和多模態(tài)AI,
    的頭像 發(fā)表于 07-03 14:09 ?675次閱讀
    大象機(jī)器人<b class='flag-5'>開源</b>協(xié)作<b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b><b class='flag-5'>機(jī)械</b><b class='flag-5'>臂</b>接入GPT<b class='flag-5'>4</b>o大模型!