91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

基于RaspberryPi Zero W的機器人的制作

454398 ? 來源:wv ? 2019-10-22 09:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

第1步:準(zhǔn)備

步驟2:代碼結(jié)構(gòu)

我將代碼劃分為這些文件,我將一一解釋:

aum2.py

l298NDrive.py

remoteControl.py

utils.py

在接下來的步驟中,我將一步一步地解釋這些文件

第3步:Aum2.py

這是應(yīng)用程序的主要入口點,包含機器人

import RPi.GPIO as GPIO

from twisted.internet import reactor, task

import l298NDrive

import remoteControl

import logging

import utils

logging.basicConfig(level=logging.WARN)

log = logging.getLogger(‘Aum2’)

enableMotors = True # Motors can be disabled for testing with this

runFrequency = 1 # The frequency on wich the main Task will be ran

class Aum2(object):

def __init__(self):

log.debug(“Initializing Aum2 robot.。.”)

# Configuration

self.port = 5555 # Port to open so the remote can connect

GPIO.setmode(GPIO.BOARD)

# Configure min and max servo pulse lengths

# Keep in mind these are not pins but servo outs

self.motors = l298NDrive.L298NDrive(10, 11, 12, 13, 14, 15, enableMotors)

self.rc = remoteControl.RemoteControl(self.port)

def processRemoteCommand(self, cmd):

vr, vl) = utils.joystickToDiff(cmd.x, cmd.y, -9.8, 9.8, -4095, 4095)

self.motors.setSpeeds(int(vr), int(-vl))

def run(self):

print(“running.。.”)

def start(self):

self.rc.start(self.processRemoteCommand)

l = task.LoopingCall(self.run)

l.start(runFrequency) # run will be called with this frequency

# Gather our code in a main() function

def main():

robot = Aum2()

robot.start()

reactor.run()

# Standard boilerplate to call the main() function to begin

# the program.

if __name__ == ‘__main__’:

main()

有些我要對此文件發(fā)表評論的要點:

我正在使用扭曲庫來協(xié)調(diào)來自UDP的遠(yuǎn)程控制訂單服務(wù)器(將在相應(yīng)的源文件中顯示)和機器人的主要Run方法。如您所見,該方法現(xiàn)在什么也不做,但是其想法是在其中添加代碼以使機器人更具自治性。

processRemoteCommand 方法將是

開始方法是在我配置需要協(xié)調(diào)的兩件事時:監(jiān)聽

第4步:RemoteControl.py

此文件包含兩個類,即RemoteControl類, RCCommand類

import logging

import traceback

from twisted.internet.protocol import DatagramProtocol

from twisted.internet import reactor

import utils

log = logging.getLogger(‘RemoteControl’)

class RemoteControl(DatagramProtocol):

def __init__(self, port):

self.port = port

def start(self, onCommandReceived):

log.debug(“Initializing RemoteControl.。.”)

self.onCommandReceived = onCommandReceived

reactor.listenUDP(self.port, self)

def datagramReceived(self, data, addr):

try:

log.debug(“Received %r from %s” % (data, addr))

command = RCCommand(data)

self.onCommandReceived(command)

except (KeyboardInterrupt, SystemExit):

raise

except:

traceback.print_exc()

class RCCommand(object):

# Timestamp [sec], sensorid, x, y, z, sensorid, x, y, z, sensorid, x, y, z

# 890.71558, 3, 0.076, 9.809, 0.565, 。..

def __init__(self, message):

self.x = 0

self.y = 0

self.z = 0

self.values = message.split(“,”)

if len(self.values) 》= 5 and self.values[1].strip() == “3”:

self.x = -float(self.values[3].strip())

self.y = -float(self.values[2].strip())

self.z = float(self.values[4].strip())

log.debug(“x={} y={} z={}”.format(self.x, self.y, self.z))

else:

log.warn(“Invalid message: {}”.format(message))

同樣是RemoteControl類,它使用扭曲的框架來偵聽運行Wireless IMU應(yīng)用的Android手機發(fā)送的UDP程序包。此應(yīng)用程序發(fā)送具有以下結(jié)構(gòu)的消息:

890.71558, 3、0.076、9.809、0.565 ,4,-0.559、0.032,-0.134、5 -21.660,-36.960, -28.140

我只對上面突出顯示的消息部分感興趣,這就是傳感器ID 3 ,以及加速度計提供的三個測量值( 0.076、9.809、0.565 )。

您可以在代碼中看到,類 RCCommand 將此消息的有用參數(shù)轉(zhuǎn)換為機器人所需的x和y值,其中

x 是從前到后的軸,而

y 則是從一側(cè)到另一側(cè)。

我也有z軸的代碼,但是我暫時不使用它。

步驟5:L298NDrive.py

這是負(fù)責(zé)控制電動機的文件。為此,它將命令發(fā)送到16伺服驅(qū)動器,該驅(qū)動器連接到L298N電動機驅(qū)動器。我想我可能會在我構(gòu)建的每個Raspberry Pi機器人上重用該類。它確實很簡單,并且不需要復(fù)雜的處理即可完成它的工作。

import Adafruit_PCA9685

import logging

import math

import utils

log = logging.getLogger(‘L298NDrive’)

class L298NDrive(object):

def __init__(self, enA, in1, in2, in3, in4, enB, enabled):

log.debug(“Initializing L298Drive.。.”)

self.minPwm = 0

self.MaxPwm = 4095

self.enA = enA

self.in1 = in1

self.in2 = in2

self.in3 = in3

self.in4 = in4

self.enB = enB

self.enabled = enabled

if enabled:

self.enable()

def enable(self):

self.enabled = True

# Initialise the PCA9685 using the default address (0x40)。

self.pwm = Adafruit_PCA9685.PCA9685()

self.setSpeeds(0, 0)

def disable(self):

self.enabled = False

self.setSpeeds(0, 0)

# Initialise the PCA9685 using the default address (0x40)。

self.pwm = None

def setSpeeds(self, rSpeed, lSpeed):

self.setSpeed(1, rSpeed)

self.setSpeed(2, lSpeed)

def setSpeed(self, motor, speed):

pwm = int(math.fabs(speed))

log.info(“Motor: {} speed: {} pwm: {}”.format(motor, speed, pwm))

if motor == 1:

if speed 》= 0:

if self.enabled:

self.pwm.set_pwm(self.in1, 0, 0)

self.pwm.set_pwm(self.in2, 0, self.MaxPwm)

else:

if self.enabled:

self.pwm.set_pwm(self.in1, 0, self.MaxPwm)

self.pwm.set_pwm(self.in2, 0, 0)

if self.enabled:

self.pwm.set_pwm(self.enA, 0, pwm)

else: # motor == 2

if speed 》= 0:

if self.enabled:

self.pwm.set_pwm(self.in3, 0, 0)

self.pwm.set_pwm(self.in4, 0, self.MaxPwm)

else:

if self.enabled:

self.pwm.set_pwm(self.in3, 0, self.MaxPwm)

self.pwm.set_pwm(self.in4, 0, 0)

if self.enabled:

self.pwm.set_pwm(self.enB, 0, pwm)

可以看出,代碼的主要部分在setSpeed(self,motor,speed)方法中,該方法接收要配置的電動機編號(1 =右,2 =左),并告訴伺服驅(qū)動器如何處理與該電動機關(guān)聯(lián)的引腳。

也許應(yīng)該給出一些解釋以了解我為什么要執(zhí)行我的工作

L298N電機驅(qū)動器

使用6個引腳驅(qū)動兩個電機

enA 用來告訴速度(使用PWM),我們要使電動機啟動1。通電后,告訴駕駛員電動機1應(yīng)該沿一個方向移動(in2應(yīng)該處于關(guān)閉狀態(tài))

in2 通電時,告訴駕駛員電動機1應(yīng)當(dāng)沿相反方向移動(in1應(yīng)該處于關(guān)閉狀態(tài))

in3 通電時,告知駕駛員電機2應(yīng)該沿一個方向移動(in4應(yīng)該關(guān)閉)

in4 告訴駕駛員,電動機2應(yīng)該沿相反方向移動(in4應(yīng)該關(guān)閉)

enB 用于告訴速度(使用PWM),我們希望電動機轉(zhuǎn)動

所以在我們的例子中,因為我對所有引腳都使用了伺服驅(qū)動器(只有其中兩個需要PWM):

當(dāng)我做到這一點:

self.pwm.set_pwm(self.in1, 0, 0)

我真的是在告訴伺服驅(qū)動器,在所有PWM期間,該引腳(in1)應(yīng)該為OFF,(所以我將該引腳設(shè)為OFF)

當(dāng)我這樣做時:

self.pwm.set_pwm(self.in1, 0, self.MaxPwm)

我實際上是在告訴伺服驅(qū)動器,在所有PWM周期中,該引腳(in1)應(yīng)該處于ON位置(所以我將其打開

然后,當(dāng)我這樣做時:

self.pwm.set_pwm(self.enA, 0, pwm)

我使用真正的PWM引腳,并使用速度參數(shù)設(shè)置我所要求的脈沖。

步驟6:Utils.py

最后,這是最后的平安。它不包含類,但是我認(rèn)為我會在其他地方重用的所有有用功能。

import math

import logging

log = logging.getLogger(‘utils’)

def map(v, in_min, in_max, out_min, out_max):

# Check that the value is at least in_min

if v 《 in_min:

v = in_min

# Check that the value is at most in_max

if v 》 in_max:

v = in_max

return (v - in_min) * (out_max - out_min) // (in_max - in_min) + out_min

def joystickToDiff(x, y, minJoystick, maxJoystick, minSpeed, maxSpeed):

# If x and y are 0, then there is not much to calculate.。.

if x == 0 and y == 0:

return (0, 0)

# First Compute the angle in deg

# First hypotenuse

z = math.sqrt(x * x + y * y)

# angle in radians

rad = math.acos(math.fabs(x) / z)

# and in degrees

angle = rad * 180 / math.pi

# Now angle indicates the measure of turn

# Along a straight line, with an angle o, the turn co-efficient is same

# this applies for angles between 0-90, with angle 0 the coeff is -1

# with angle 45, the co-efficient is 0 and with angle 90, it is 1

tcoeff = -1 + (angle / 90) * 2

turn = tcoeff * math.fabs(math.fabs(y) - math.fabs(x))

turn = round(turn * 100, 0) / 100

# And max of y or x is the movement

mov = max(math.fabs(y), math.fabs(x))

# First and third quadrant

if (x 》= 0 and y 》= 0) or (x 《 0 and y 《 0):

rawLeft = mov

rawRight = turn

else:

rawRight = mov

rawLeft = turn

# Reverse polarity

if y 《 0:

rawLeft = 0 - rawLeft

rawRight = 0 - rawRight

# minJoystick, maxJoystick, minSpeed, maxSpeed

# Map the values onto the defined rang

rightOut = map(rawRight, minJoystick, maxJoystick, minSpeed, maxSpeed)

leftOut = map(rawLeft, minJoystick, maxJoystick, minSpeed, maxSpeed)

log.debug(“x={} y={}, rOut={}, lOut={}”.format(x, y, rightOut, leftOut))

return (rightOut, leftOut)

這里只有兩種方法,第一種是從地圖功能的Arduino。它將指定輸入限制(in_min,in_max)內(nèi)的值(v)轉(zhuǎn)換為輸出范圍(out_min,out_max)內(nèi)的相應(yīng)值。

我為輸入值添加了限制,所以我只接受av,位于in_min和in_max之內(nèi)。

我擁有的另一個函數(shù)( joystickToDiff )稍微復(fù)雜一點,但是其目的是從輸入的操縱桿對轉(zhuǎn)換值,以達到差動驅(qū)動機器人左右電機所需的速度。此輸出已交付,已轉(zhuǎn)換為指定為參數(shù)的速度范圍。

您可以在我的博客中找到有關(guān)此部分的更多詳細(xì)信息

步驟7:更多圖片

這里還有Aum2機器人的更多圖片

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

    關(guān)注

    213

    文章

    31218

    瀏覽量

    223025
  • 樹莓派
    +關(guān)注

    關(guān)注

    122

    文章

    2080

    瀏覽量

    110607
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    再談低溫?zé)Y(jié)銀的應(yīng)用:從春晚四家機器人出鏡的幕后推手說起

    再談低溫?zé)Y(jié)銀的應(yīng)用:從春晚四家機器人出鏡的幕后推手說起 2026年馬年春晚四家機器人公司:宇樹、魔法原子、銀河通用、松延動力的高動態(tài)、高精度、高可靠表現(xiàn),背后離不開低溫?zé)Y(jié)銀在電機驅(qū)動、傳感器
    發(fā)表于 02-17 14:07

    RK3576機器人核心:三屏異顯+八路攝像頭,重塑機器人交互與感知

    瑞芯微RK3576 AIoT處理器處理器憑借其卓越的多屏異顯與8路攝像頭接入能力,為機器人領(lǐng)域帶來革新。米爾電子MYD-LR3576開發(fā)板實測數(shù)據(jù)顯示,在高負(fù)載下CPU占用僅34%,完美實現(xiàn)多路視覺
    發(fā)表于 10-29 16:41

    小蘿卜機器人的故事

    經(jīng)過我的申請, 馬老師發(fā)放了, 小蘿卜機器人的, 開發(fā)權(quán)限, 原來的小蘿卜公司, 因為經(jīng)營不善倒閉, 作為科研產(chǎn)品, 幾個技術(shù)對此惋惜, 自掏腰包, 要讓小蘿卜機器人, 再生, 每次聽到小蘿卜說
    發(fā)表于 10-23 05:24

    什么是機器人?追溯機器人技術(shù)的演變和未來

    作者: Aswin S Babu 什么是機器人? 在日常生活里,“機器人”一詞我們都不陌生,日常交談中也常常脫口而出。但大家可曾細(xì)想過,這個詞的真正含義究竟為何?接下來,不妨花些時間,深入探究機器人
    的頭像 發(fā)表于 10-02 16:32 ?5436次閱讀
    什么是<b class='flag-5'>機器人</b>?追溯<b class='flag-5'>機器人</b>技術(shù)的演變和未來

    機器人競技幕后:磁傳感器芯片激活 “精準(zhǔn)感知力”

    2025 世界人形機器人運動會于 8 月 17 日圓滿收官,賽場上機器人在跑步、跳躍、抓取等項目中的精彩表現(xiàn),背后是運動控制、環(huán)境感知等技術(shù)的迭代升級。而在這些技術(shù)中,磁傳感器芯片憑借獨特優(yōu)勢,成為
    發(fā)表于 08-26 10:02

    工業(yè)機器人的特點

    的基礎(chǔ),也是三者的實現(xiàn)終端,智能制造裝備產(chǎn)業(yè)包括高檔數(shù)控機床、工業(yè)機器人、自動化成套生產(chǎn)線、精密儀器儀表、智能傳感器、汽車自動化焊接線、柔性自動化生產(chǎn)線、智能農(nóng)機、3D 打印機等領(lǐng)域。而智能制造裝備中工業(yè)
    發(fā)表于 07-26 11:22

    肇觀電子推出W系列水下機器人視覺模組

    在此背景下,肇觀電子推出全球首創(chuàng)W系列水下機器人視覺模組,以光學(xué)視覺革命突破水下感知瓶頸!
    的頭像 發(fā)表于 06-17 14:58 ?1605次閱讀
    肇觀電子推出<b class='flag-5'>W</b>系列水下<b class='flag-5'>機器人</b>視覺模組

    工業(yè)機器人與協(xié)作機器人概念不同

    在自動化生產(chǎn)的浪潮中,工業(yè)機器人與協(xié)作機器人逐漸成為企業(yè)提升效率、優(yōu)化產(chǎn)能的得力助手。但它們并非同一概念,在功能、設(shè)計與應(yīng)用場景上有著顯著差異。北京沃華慧通測控有限公司憑借深厚的技術(shù)沉淀,為不同需求的企業(yè)提供適配的機器人解決方案
    的頭像 發(fā)表于 06-03 13:15 ?1213次閱讀
    工業(yè)<b class='flag-5'>機器人</b>與協(xié)作<b class='flag-5'>機器人</b>概念不同

    明遠(yuǎn)智睿SSD2351開發(fā)板:語音機器人領(lǐng)域的變革力量

    在人工智能快速發(fā)展的今天,語音機器人逐漸成為人們生活和工作中的得力助手。明遠(yuǎn)智睿SSD2351開發(fā)板憑借強大性能與豐富功能,為語音機器人的發(fā)展注入新動力,成為該領(lǐng)域的變革力量。 SSD2351開發(fā)板
    發(fā)表于 05-28 11:36

    盤點#機器人開發(fā)平臺

    地瓜機器人RDK X5開發(fā)套件地瓜機器人RDK X5開發(fā)套件產(chǎn)品介紹 旭日5芯片10TOPs算力-電子發(fā)燒友網(wǎng)機器人開發(fā)套件 Kria KR260機器人開發(fā)套件 Kria KR260-
    發(fā)表于 05-13 15:02

    詳細(xì)介紹機場智能指路機器人的工作原理

    機場智能指路機器人主要依靠感知系統(tǒng)、定位系統(tǒng)、導(dǎo)航系統(tǒng)、智能交互系統(tǒng)和運動系統(tǒng)協(xié)同工作,來實現(xiàn)為旅客準(zhǔn)確指路和提供服務(wù)的功能,以下是其詳細(xì)工作原理: 感知系統(tǒng) 傳感器類型 :機器人配備了多種傳感器
    發(fā)表于 05-10 18:26

    【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】視覺實現(xiàn)的基礎(chǔ)算法的應(yīng)用

    閱讀心得體會:ROS2機器人視覺與地圖構(gòu)建技術(shù) 通過對本書第7章(ROS2視覺應(yīng)用)和第8章(ROS2地圖構(gòu)建)的學(xué)習(xí),我對機器人視覺感知和自主導(dǎo)航的核心技術(shù)有了更深入的理解。以下是我的心得體會
    發(fā)表于 05-03 19:41

    【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】機器人入門的引路書

    ROS的全稱:Robot Operating System 機器人操作系統(tǒng) ROS的 目的 :ROS支持通用庫,是通信總線,協(xié)調(diào)多個傳感器 為了解決機器人里各廠商模塊不通用的問題,讓機器人快速開發(fā)
    發(fā)表于 04-30 01:05

    【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】+內(nèi)容初識

    《ROS 2智能機器人開發(fā)實踐》內(nèi)容閱讀初體驗 《ROS 2 智能機器人開發(fā)實踐》是一本針對 ROS 2(Robot Operating System 2)這一先進機器人開發(fā)框架的實用指南。隨著
    發(fā)表于 04-27 11:24

    你聽說過嘛?用樹莓派機器人遠(yuǎn)程逗貓...

    簡單的RaspberryPi網(wǎng)絡(luò)控制的視頻直播機器人!硬件清單硬件模塊RaspberryPiZero無線×1RaspberryPi攝像頭模塊×14AA電池盒×1USB電池(4.000mAh
    的頭像 發(fā)表于 04-20 09:07 ?713次閱讀
    你聽說過嘛?用樹莓派<b class='flag-5'>機器人</b>遠(yuǎn)程逗貓...