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

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

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

對弈人工智能!myCobot 280開源六軸機械臂Connect 4 四子棋對弈下篇

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

前言

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

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

Introduction

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

● 獲取信息:用攝像頭獲取到棋盤上的信息,進行對弈


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


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


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

讓我們一起來看看吧~

項目

獲取信息

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

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

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

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

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

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

處理信息

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

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

下面是處理的偽代碼:

functionmodel_predict(state, available_actions):
# 將available_actions轉(zhuǎn)換為numpy數(shù)組
    available_actions = np.array(available_actions)
# 對state進行擴展,以適應(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}
# 進行模型預(yù)測,獲取每個可用位置的預(yù)測值
    r_actions =self.policy_net.run(None, ort_inputs)[0][0,:]
# 根據(jù)預(yù)測值選擇最優(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模型來進行模型預(yù)測,并根據(jù)預(yù)測結(jié)果選擇最優(yōu)的落子位置。首先,將可用位置available_actions轉(zhuǎn)換為numpy數(shù)組,并將當前游戲狀態(tài)state進行擴展,以適應(yīng)ONNX模型的輸入要求。然后,將擴展后的state傳遞給ONNX模型進行預(yù)測,并將預(yù)測結(jié)果保存在r_actions變量中。接著,根據(jù)預(yù)測結(jié)果以及可用的落子位置,計算出每個可用位置的預(yù)測值,選取其中最大的一個對應(yīng)的落子位置作為最優(yōu)的落子位置,并將其返回。

機械臂的軌跡

大腦(對弈算法),眼睛(識別算法)都有了,現(xiàn)在就差一個手去執(zhí)行動作。我們使用python庫pymycobot來對機械臂進行控制。因為棋盤的原因,棋子只能從棋盤的上方投下,我們給每一條數(shù)列的棋個上設(shè)置一個坐標點位,就可以完成機械臂的路徑規(guī)劃了。因為棋面比較干凈沒有遮擋物,所以不用考慮過多的路徑因素。

下面是機械臂運行軌跡位置的偽代碼:

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

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當中控制機械臂的一些方法:

#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)

功能的整合

將功能點整合之前我們得整理它們之間的邏輯。

下棋的流程圖有了接下來就是,將功能點結(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ù)測到后面將要下在幾步棋甚至更多,而對于普通人來說,一般能夠預(yù)測的也就兩三步棋。但是從視頻上來看,AI只贏了一場比賽,輸?shù)舻哪且粓鍪且驗榻Y(jié)構(gòu)因素的影響,本來該下的棋盤的位置,被迫換了一個地方。

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

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

審核編輯 黃宇

聲明:本文內(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

    文章

    27859

    瀏覽量

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

    關(guān)注

    23

    文章

    4555

    瀏覽量

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

    關(guān)注

    1787

    文章

    46090

    瀏覽量

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

    關(guān)注

    12

    文章

    502

    瀏覽量

    24312
收藏 人收藏

    評論

    相關(guān)推薦

    使用myCobot 280 Jeston Nano進行物體精確識別追蹤

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

    對弈人工智能!myCobot 280開源機械Connect 4 對弈

    Introduction Hi,guys.今天我們來介紹一下人工智能下棋,我們將用機械來作為對手跟你進行下棋。 人工智能下棋的研究可以追溯到20世紀50年代。當時,計算機科學(xué)家開始探
    的頭像 發(fā)表于 05-29 15:26 ?1206次閱讀
    <b class='flag-5'>對弈</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'>機械</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'>對弈</b>

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

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

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

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

    基于LabVIEW的五子棋博弈算法

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

    實現(xiàn)人與機器人的直接對弈_強大的對弈系統(tǒng)如何實現(xiàn)

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

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

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

    對弈機器人與圖像識別

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

    機械免費使用,學(xué)習(xí)ROS、Python火熱報名中

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

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

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

    MyCobot機械開箱及開發(fā)前的準備工作(一)

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

    Mycobot機械各關(guān)節(jié)的運動(三)

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

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

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

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

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

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

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