色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

機器人學科建設沙盤套件!智慧農業3D分揀套裝詳解

大象機器人科技 ? 來源:大象機器人科技 ? 作者:大象機器人科技 ? 2023-06-30 18:02 ? 次閱讀

作為最熱門的技術領域,機器人技術正在徹底改變產業,并推動全球的創新。為了滿足這個快速發展的領域對技術人才日益增長的需求,開發了一個開創性的機器人教育解決方案。這個創新的解決方案將自動化水果采摘機的模擬與水果分揀和運送的自動化復合機器人結合起來,為學生提供了一個在最受歡迎和最有趨勢的技術領域中的全面學習經驗。

在本文中我們將詳細為你介紹水果采摘和分揀機器人場景。我們將會從套裝的介紹和使用的場景介紹,到套裝功能機械臂的實現。

智慧農業套裝

圖中所展示的就是我們的智慧農業套裝,它是由以下的內容組成。

mechArm 270 M5Stack *2
傳送帶 *1
3D攝像頭/深度攝像頭 *2
仿真模擬果樹 *1
結構件 若干

你肯定很好奇這個套裝是怎么運轉的,接下來我將為你介紹這個套裝的運作流程。

首先你可以看到我們有兩臺機械臂,他們分別執行不同的功能,離果樹最近的那一臺機械臂是采摘機器人下面簡稱R1;中間那臺機械臂是分揀機器人下面簡稱是R2。從他們的名字上就可以知道它們分別做的是什么工作,R1負責將果樹上的果實采摘下來放置在傳送帶上,R2則是將傳送帶上不合格的水果分揀出來。

流程:

采摘:R1通過深度攝像頭對果樹上果實的識別然后對果子進行定位,將果實的坐標發送給R1去采摘。

運輸:通過R1的采摘,果實被放置在傳送帶上。傳送帶經過運轉將果實運輸到R2可識別的范圍內進行果實好壞的判斷。

分揀:R2上方的攝像頭將視線范圍內的果實進行識別算法的判斷,判斷為好果實的話,果實將隨著傳送帶傳輸到果實收集區;判斷為壞果實的話,將壞果實的坐標信息傳遞給R2,R2將壞果實目標進行抓取出來,放置在特定區域。

持續循環上面的流程:采摘->運輸->分揀->采摘->運輸

產品介紹

下面將簡要介紹套裝中的產品。

Robotic Arm - mechArm 270 M5Stack

這是一款小六軸機械臂,以M5Stack-Basic為核心控制,ESP32為輔助控制,結構是中心對稱結構(仿工業結構)。mechArm 270-M5本體重量1kg, 負載250g,工作半徑270mm,設計緊湊便攜,小巧但功能強大,操作簡單,能與人協同、安全工作。

傳送帶

傳送帶是一種用于運輸物品的機械設備,通常由一個帶狀物體和一個或多個滾動軸組成。它們可以運輸各種物品,例如包裹、箱子、食品、礦石、建筑材料等等。傳送帶的工作原理是將物品放置在運動的帶子上,然后將其移動到目標位置。傳送帶通常由電機、傳動系統、帶子和支撐結構組成。電機提供動力,傳動系統將動力傳遞給帶子,使其移動。

目前市面上可以根據用戶的需求定制各種傳送帶,例如傳送帶的長寬高,履帶的材質等。

深度攝像頭

隨著使用場景的多樣性,普通的2D攝像頭無法滿足我們使用的需求。在場景中我們使用到的是深度攝像頭。深度攝像頭是一種能夠獲取場景深度信息的相機。它不僅能夠捕捉場景的顏色和亮度信息,還能夠感知物體之間的距離和深度信息。深度攝像頭通常使用紅外線或其他光源來進行測量,以獲取物體和場景的深度信息。

攝像頭1.png

它可以獲取很多信息,例如深度的畫面,彩色的畫面,紅外線的畫面,點云畫面。

有了深度相機,我們就可以精準的獲取到果樹上果實的位置,以及顏色信息。

自適應夾爪-機械臂末端執行器

夾爪1.jpeg

自適應夾爪是一種用來抓取、握取或夾持物體的末端執行器,它由兩個可移動的爪子組成,可以通過機械臂的控制系統來控制其開合程度和開合速度。

項目功能的實現

我們先要準備好編譯的環境,該場景是用Python語言來進行編寫的。在使用和學習的時候得安裝好環境。

編譯環境:

numpy==1.24.3
opencv-contrib-python==4.6.0.66
openni==2.3.0
pymycobot==3.1.2
PyQt5==5.15.9
PyQt5-Qt5==5.15.2
PyQt5-sip==12.12.1
pyserial==3.5

項目的功能點我們主要分為三部分:

機器視覺識別算法,深度識別算法


            ● 機械臂的控制,路徑的規劃


            ● 多臺機器之間通信和邏輯的處理

我們先從機器視覺識別算法介紹:

機器視覺識別算法

使用深度攝像頭之前需要進行相機標定。相機標定的教程https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html

相機標定:

相機標定是指通過對攝像機進行一系列測量和計算,確定攝像機內部參數和外部參數的過程。攝像機內部參數包括焦距、主點位置、像素間距等,而攝像機外部參數則包括攝像機在世界坐標系中的位置和方向等。相機標定的目的是為了使攝像機能夠準確地捕捉并記錄世界坐標系中物體的位置、大小、形狀等信息。

我們的目標物體是果實,它顏色不一,形狀也不一定,有紅的,橙的,黃的。想要準確的抓取且不傷害到果實,就需要獲取果實的各個信息,寬度,厚度等,智能的進行抓取。

我們看一下目標果實,它們目前較大的區別就是顏色的不一樣,我們設定紅色和橙色的目標將被選中,這里就要用到HSV色域來進行目標的定位。下面的代碼是用來檢測目標果實。

Code:

class Detector:
    class FetchType(Enum):
        FETCH = False
        FETCH_ALL = True

"""
    Detection and identification class
    """

    HSV_DIST = {
# "redA": (np.array([0, 120, 50]), np.array([3, 255, 255])),
# "redB": (np.array([176, 120, 50]), np.array([179, 255, 255])),
"redA": (np.array([0, 120, 50]), np.array([3, 255, 255])),
"redB": (np.array([118, 120, 50]), np.array([179, 255, 255])),
# "orange": (np.array([10, 120, 120]), np.array([15, 255, 255])),
"orange": (np.array([8, 150, 150]), np.array([20, 255, 255])),
"yellow": (np.array([28, 100, 150]), np.array([35, 255, 255])), # old
# "yellow": (np.array([31, 246, 227]), np.array([35, 255, 255])),   # new
}

    default_hough_params = {
"method": cv2.HOUGH_GRADIENT_ALT,
"dp": 1.5,
"minDist": 20,
"param2": 0.6,
"minRadius": 15,
"maxRadius": 40,
}

    def __init__(self, target):
        self.bucket = TargetBucket()
        self.detect_target = target

    def get_target(self):
        return self.detect_target

    def set_target(self, target):
        if self.detect_target == target:
            return
        self.detect_target = target
        if target == "apple":
            self.bucket = TargetBucket(adj_tolerance=25, expire_time=0.2)
        elif target == "orange":
            self.bucket = TargetBucket()
        elif target == "pear":
            self.bucket = TargetBucket(adj_tolerance=35)

    def detect(self, rgb_data):
        if self.detect_target == "apple":
            self.__detect_apple(rgb_data)
        elif self.detect_target == "orange":
            self.__detect_orange(rgb_data)
        elif self.detect_target == "pear":
            self.__detect_pear(rgb_data)

    def __detect_apple(self, rgb_data):
        maskA = color_detect(rgb_data, *self.HSV_DIST["redA"])
        maskB = color_detect(rgb_data, *self.HSV_DIST["redB"])
        mask = maskA + maskB

        kernelA = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8))
        kernelB = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
        mask = cv2.erode(mask, kernelA)
        mask = cv2.dilate(mask, kernelA)

        targets = circle_detect(
            mask, {"minDist": 15, "param2": 0.5,
"minRadius": 10, "maxRadius": 50}
)
        self.bucket.add_all(targets)
        self.bucket.update()

    def __detect_orange(self, rgb_data):
        mask = color_detect(rgb_data, *self.HSV_DIST["orange"])
        targets = circle_detect(
            mask, {"minDist": 15, "param2": 0.1,
"minRadius": 7, "maxRadius": 30}
)
        self.bucket.add_all(targets)
        self.bucket.update()

    def __detect_pear(self, rgb_data):
        mask = color_detect(rgb_data, *self.HSV_DIST["yellow"])

        kernelA = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
        kernelB = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
        mask = cv2.erode(mask, kernelA)
        mask = cv2.dilate(mask, kernelA)
        mask = cv2.erode(mask, kernelB)

        targets = circle_detect(
            mask, {"minDist": 15, "param2": 0.1,
"minRadius": 15, "maxRadius": 70}
)
        self.bucket.add_all(targets)
        self.bucket.update()

    def fetch(self):
        return self.bucket.fetch()

    def fetch_all(self):
        return self.bucket.fetch_all()

    def debug_view(self, bgr_data, view_all=True):
        if view_all:
            targets = self.bucket.fetch_all()
        else:
            targets = self.bucket.fetch()
            if targets is not None:
                targets = [targets]
        if targets is not None:
            for target in targets:
                x, y, radius = target["x"], target["y"], target["radius"]
# draw outline
                cv2.circle(bgr_data, (x, y), radius, BGR_GREEN, 2)

# draw circle center
                cv2.circle(bgr_data, (x, y), 1, BGR_RED, -1)

左邊為彩色流視頻,右邊為深度視頻

我們的第一步就是要將目標果實能夠正確的檢測出來,以便后續獲取目標物體的坐標,深度等其他信息。我們定義需要獲取的信息方便后續的存儲以及調用。

code:

class VideoCaptureThread(threading.Thread):
    def __init__(self, detector, detect_type = Detector.FetchType.FETCH_ALL.value):
        threading.Thread.__init__(self)
        self.vp = VideoStreamPipe()
        self.detector = detector                  
        self.finished = True                      
        self.camera_coord_list = []               
        self.old_real_coord_list = []             
        self.real_coord_list = []                 
        self.new_color_frame = None              
        self.fruit_type = detector.detect_target  
        self.detect_type = detect_type            
        self.rgb_show = None
        self.depth_show = None

最后我們要獲取的是果實的坐標,能夠發送給機械臂去執行抓取的坐標,通過深度坐標轉化為世界坐標,已經是成功了一大半了,最后只需要將世界坐標跟機械臂的坐標系進行轉換就可以獲得抓取目標果實的坐標了。

# get world coordinate
 def convert_depth_to_world(self, x, y, z):
        fx = 454.367
        fy = 454.367
        cx = 313.847
        cy = 239.89

        ratio = float(z / 1000)
        world_x = float((x - cx) * ratio) / fx
        world_x = world_x * 1000
        world_y = float((y - cy) * ratio) / fy
        world_y = world_y * 1000
        world_z = float(z)

        return world_x, world_y, world_z

該階段,我們實現了檢測目標物體,并且返回可抓取的坐標,傳遞給機械臂。接下來我們來處理機械臂的控制以及軌跡的規劃。

機械臂的控制和軌跡規劃

說到機械臂的控制,一開始大家可能都會覺得很困難,怎么讓機械臂按照自己的想法動起來。不用擔心,我們mechArm270機械臂有pymycobot,一個相對比較成熟的機械臂控制庫,只需要簡單的幾行代碼就能夠讓機械臂運動起來。

PS:pymycobot 是pyhon的一個庫,用于控制機械臂運動的一個庫,我們使用的是最新版,pymycobot==3.1.2

#Introduce two commonly used control methods
'''
Send the degrees of all joints to robot arm.
angle_list_degrees: a list of degree value(List[float]), length 6
speed: (int) 0 ~ 100,robotic arm's speed
'''
send_angles([angle_list_degrees],speed)
send_angles([10,20,30,45,60,0],100)
'''
Send the coordinates to robot arm
coords:a list of coordiantes value(List[float]), length 6
speed: (int) 0 ~ 100,robotic arm's speed
'''
send_coords(coords, speed)
send_coords([125,45,78,-120,77,90],50)

以角度/坐標都可以把發送給機械臂去進行執行。

動圖1.gif

控制機械臂運動

采摘機器人軌跡規劃

在實現簡單的控制之后,我們就要設計機械臂抓取果實的軌跡規劃了。在識別算法當中,我們獲得到了果子的世界坐標。處理果子的世界坐標,轉化到機械臂坐標系坐標進行目標抓取。

#處理果實世界坐標的方法
deftarget_coords(self):
        coord = self.ma.get_coords()
whilelen(coord)==0:
            coord = self.ma.get_coords()

        target = self.model_track()
        coord[:3]= target.copy()
        self.end_coords = coord[:3]

if DEBUG ==True:
print("coord: ", coord)
print("self.end_coords: ", self.end_coords)

        self.end_coords = coord

return coord

有了目標坐標之后,我們規劃機械臂運動的軌跡。在機械臂運動的途中,不能撞到其他結構,打落水果等。

在規劃的時候可以考慮設計:

● 初始姿態


            ● 待抓取姿態


            ● 避障姿態

各種的姿態應該根據自己的場景需求來設定。

分揀機器人路徑規劃

前有采摘機器人,現在來講解分揀機器人路徑的規劃。其實這兩個機器人的路徑規劃都是大同小異,分揀目標是傳送帶上的目標,通過深度攝像頭獲取傳送帶上壞果實的坐標將其分揀出來。

動圖2.gif

采摘機器人和分揀機器人的控制和軌跡規劃就到這里了,接下來我們來介紹比較重要的,也是這個套裝的重中之重,這兩臺機械臂之間是如何通信的呢,它們是如何有效讓兩臺機械臂和一臺傳送帶不進入死循環能夠運行的如此順暢。

多臺機械臂的通信和邏輯的處理

如果沒有一個完整的邏輯,相信這兩個機械臂早就打起架來了。我們看整個程序的流程圖。

流程圖.jpeg

就是在R2發現壞果的時候,R1是機械臂是暫停的狀態,等到R2完成分揀工作了之后會給R1傳遞信息讓R1繼續進行采摘工作。

Socket通信

既然要通信,那就少不了Socket這個庫。Socket庫是一個在網絡編程中經常使用的標準庫,它提供了一組用于網絡通信的API,可以方便地實現不同計算機之間的數據傳輸。為了解決R1 和R2 之間通信的問題,我們的解決方法是簡歷一個服務器,和一個客戶端的效果。

流程圖2.jpeg

服務器建立的相關代碼,提前初始化需要傳遞的信息

Code:

classTcpServer(threading.Thread):
def__init__(self, server_address)- >None:
        threading.Thread.__init__(self)
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind(server_address)
print("server Binding succeeded!")
        self.s.listen(1)
        self.connected_obj =None

        self.good_fruit_str ="apple"
        self.bad_fruit_str ="orange"
        self.invalid_fruit_str ="none"

        self.target = self.invalid_fruit_str
        self.target_copy = self.target
        self.start_move =False

客戶端建立的相關代碼。

Code:

classTcpClient(threading.Thread):
def__init__(self, host, port, max_fruit =8, recv_interval =0.1, recv_timeout =30):
        threading.Thread.__init__(self)

        self.good_fruit_str ="apple"
        self.bad_fruit_str ="orange"
        self.invalid_fruit_str ="none"

        self.host = host
        self.port = port

# Initializing the TCP socket object
# specifying the usage of the IPv4 address family
#  designating the use of the TCP stream transmission protocol
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.client_socket.connect((self.host, self.port))
        self.current_extracted =0
        self.max_fruit = max_fruit
        self.recv_interval = recv_interval
        self.recv_timeout = recv_timeout

        self.response_copy = self.invalid_fruit_str
        self.action_ready =True

建立好了服務器和客戶端,我們就可以讓R1和R2像我們平時發信息一樣進行通信了。

R1:"我現在在抓果實“

R2:"收到好的"

技術要點

這整個項目下來關鍵是多臺機械臂之間的通信和邏輯的處理。要讓兩個機械臂之間建立通信有很多種辦法,例如常見的物理通信串口通信,以太網口通信,藍牙通信等。

我們現在使用的就是以太網口通信,使用現有的TCP/IP協議,用python當中的socket庫來進行實現。

建房子先建地基這個道理大家都懂吧,建立一個項目就要搭建好它的框架也是同一個道理。此外機械臂控制的原理也是至關重要的,學會如何將目標物體轉化為世界坐標在換成機械臂坐標系中的目標。

總結

該水果采摘和分揀機器人的應用場景不僅可以幫助學生更好地理解機械原理和電子控制技術,還可以促進他們對科學技術的興趣和熱愛,并提供一個鍛煉實踐能力和競賽思維的機會。

學習機械臂相關知識需要實踐操作,而該應用場景提供了一個具有實際意義的機會,讓學生通過實際操作來加深對機械臂的理解和認識。此外,該場景還可以讓學生學習和掌握機械臂運動控制、視覺識別和物品抓取等技術,幫助他們更好地掌握機械臂的相關知識和技能。

除此之外,該應用場景還可以幫助學生鍛煉團隊合作、創新思維和競賽思維等能力,為他們未來的職業發展打下堅實的基礎。通過參與機器人競賽、科技展覽等活動,學生可以不斷提高自己的競賽水平和創新能力,從而更好地適應未來的社會發展和科技變革。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    211

    文章

    28632

    瀏覽量

    208005
  • 3D
    3D
    +關注

    關注

    9

    文章

    2910

    瀏覽量

    107803
  • 人工智能
    +關注

    關注

    1794

    文章

    47642

    瀏覽量

    239682
收藏 人收藏

    評論

    相關推薦

    機器人學導論(原書第3版)_(美)HLHN J.CRAIG著 贠超等譯

    機器人學導論(原書第3版)_(美)HLHN J.CRAIG著贠超等譯
    發表于 09-28 11:49

    【KittenBot機器人試用申請】KittenBot繪圖避障機器人學習課程

    避障機器人學習課程3、預計成果:學生在學習過程中學會解決問題、自足思考4、試用計劃:1、拿到機器后,首先我將會把機器人的壁障原理與使用方法弄懂2、開展專題課程,講述使用方法
    發表于 07-07 18:05

    【下載】《機器人學機器視覺與控制――MATLAB算法基礎》

    `內容簡介本書是關于機器人學機器視覺的實用參考書, 第一部分“基礎知識”(第2章和第3章)介紹機器人及其操作對象的位置和姿態描述,以及機器人
    發表于 01-17 17:38

    【下載】《機器人學機器視覺與控制――MATLAB算法基礎》

    `內容簡介本書是關于機器人學機器視覺的實用參考書, 第一部分“基礎知識”(第2章和第3章)介紹機器人及其操作對象的位置和姿態描述,以及機器人
    發表于 04-08 18:19

    機器人學習相關資料文檔!

    分享八本機器人方面的文檔,其中包括了算法導論,機器人學導論,機器人技術及應用等多本書籍!喜歡機器人方面的大家一定不要錯過!
    發表于 08-25 09:46

    已開獎——【送書福利】機器人時代已來!送你幾本機器人學硬核好書

    `21世紀是機器人的時代。從學術研究到工程應用,機器人引起了學界和工業界越來越多的關注和興趣。這種日益濃厚的興趣也來源于機器人學作為一門綜合性學科的多
    發表于 11-16 16:14

    機器人學

    第一章 緒論 1.1 機器人學的發展1.1.1 機器人的由來1.1.2 機器人的定義1.1.3 機器人學的進展1.2 機器人的特點、結構與
    發表于 01-14 16:45 ?98次下載
    <b class='flag-5'>機器人學</b>

    機器人學_熊有倫

    機器人學 熊有倫 1993版 機器人學 熊有倫 1993
    發表于 11-18 17:12 ?0次下載

    高級機器人學與步行機器人

    高級機器人學與步行機器人!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 15:08 ?0次下載

    機器人學導論——分析、系統及應用

    機器人學導論——分析、系統及應用!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 15:33 ?0次下載

    基礎機器人學與寶貝車機器人

    基礎機器人學與寶貝車機器人!資料來源網絡,如有侵權,敬請見諒
    發表于 11-20 15:34 ?0次下載

    機器人學習算法圖解教學

    本文主要介紹機器人學習算法的編譯及實際操作
    發表于 09-14 10:58 ?21次下載

    機器人學導論的課后習題答案資料免費下載

    機器人學導論是由斯坦福大學榮譽教授ohn.J.Craig先生所編寫的一本專業的機器人理論知識學習書籍。本書介紹機械操作的理論和工程知識,這是機器人學的分支學科,它是建立在幾個傳統
    發表于 12-03 08:00 ?0次下載

    機器人學—自動化的輝煌篇章pdf

    機器人學—自動化的輝煌篇章pdf
    發表于 12-10 17:04 ?0次下載

    機器人學的幾何基礎(教材資料)

    機器人學的幾何基礎(第2版)》是一部關于機器人學中有著重要應用的幾何概念的精彩導論。第2版提供了對相關領域內容的深入講解,并仍保持獨特的風格 它的重點不是集中在運動學和機器人學的計算結果上,而是包含
    發表于 04-20 14:43 ?2次下載
    主站蜘蛛池模板: 国产成人无码精品久久久按摩 | 国产99精品视频一区二区三区 | 毛片大全网站 | 亚洲高清视频免费 | 国产成人在线网站 | 久久精品电影院 | 国产噜噜噜精品免费 | 日韩精品一区二区三区AV在线观看 | 亚洲精品久久无码AV片银杏 | 人妻体体内射精一区二区 | 国产福利不卡在线视频 | 久久有码中文字幕 | 亚洲高清在线视频 | 九九精彩视频在线观看视频 | 久99视频精品免费观看福利 | 91精品一区二区综合在线 | 亚洲精品九色在线网站 | 99热热在线精品久久 | 超碰国产人人做人人爽 | 快播h动漫网 | 漂亮的保姆5电影免费观看完整版中文 | 伊人久久99热这里只有精品 | 美女扒开腿让男生桶爽免费APP | 精品少妇爆AV无码专区 | 国产精品一库二库三库 | 亚洲人成人77777在线播放 | RAPPER性骚扰大开黄腔 | 国产亚洲欧美在线中文BT天堂网 | 欧美狂野乱码一二三四区 | 99久久精品一区二区三区 | 再深点灬舒服灬太大了在线视频 | 极品少妇小泬50PTHEPON | 亚洲国产精品无码中文字满 | 全部老头和老太XXXXX | 无码人妻少妇色欲AV一区二区 | 挤奶门事件完整照片 | 亚洲欧美日韩中字视频三区 | 被老总按在办公桌吸奶头 | 欧美一级黄色影院 | 把她带到密室调教性奴 | 国产精品亚洲在钱视频 |