首页

校徽绘制机器人

用一些乐高、传感器就可以制作出来的机器人!

最近的文章

本设计允许将任意校徽通过编程写入机器人,用户点击机器人上一个按键即可在纸面上完成一个校徽图案的自动化绘制。用户可以通过更换笔的颜色可以实现不同颜色校徽的绘制。下文给出了中山市高技术产业开发区第八小学的校徽绘制机器人的制作过程和源代码。

校徽绘制机器人1

去到别的学校通常看到的都是才艺表演,是否可以有一个专门展示校徽、校训等和学校宣传的项目呢?这也是为什么想做一个校徽绘制机器人的项目。下面是介绍这个机器人是怎么做出来的。

先把校徽中的点都提取出来,一共18个点。
我们在电子黑板上把校徽绘制的步骤列出来
这里是算轮子内轮和外轮要走的距离和速度,最后画外圆用的。(这部分是爸爸和我一起完成的,我搞不明白这部分)
编程完成后,把机器人放在纸的左上角(注意:一定是8开的纸)– 程序见下
机器人绘图过程视频展示
机器人绘图完成退场

下面是校徽绘制机器人1的Python源代码:

from spike import PrimeHub, LightMatrix, Button, StatusLight, ForceSensor, MotionSensor, Speaker, ColorSensor, App, DistanceSensor, Motor, MotorPair
from spike.control import wait_for_seconds, wait_until, Timer
from spike import Motor
import math
D = 20
dy,dx = -10,-3 #这是画圆偏心值
a = D/20.0

#一些常规变量
Lzhi = 53#29.7 #纸张的长度
Wzhi = 38 #21.0 #纸张的宽度
PenXiaJiao = 11
PenShangjiao = 50 
PenSpeed = 10
PenWait = 0.5 #放下笔等待的时间,秒 

P1 = [-6*a, 6*a]
P2 = [-a, 6*a]
P3 = [-a,0]
P4 = [-6*a, 0]
P5 = [-2*a,6*a]
P6 = [-8*a,-5*a]
P7 = [-6*a, -2*a]
P8 = [-a, -2*a]
P9 = [-a, -6*a]
P10 = [-6*a, -6*a]
P11 = [-6*a, 3*a]
P12 = [6*a, 3*a]
P13 = [3*a, 0]
P14 = [3*a, -6*a]
P15 = [2*a, -5*a]
P16 = [0, -2*a]
P17 = [6*a, -2*a]
P18 = [10*a, 0]

def Zizhuan(Dushu, motor_pair):
    #Dushu如果是正数,则正转;Dushu如果是负数,则负转;
    #Lpen: 是笔尖到轮子转动中心的距离,单位cm
    Lpen = 9.25
    motor_pair.move(Lpen, 'cm', steering=0,speed=8)
    motor_pair.move_tank(Dushu*2, 'degrees', left_speed=10, right_speed=-10)
    motor_pair.move(-Lpen, 'cm', steering=0,speed=8)

def CircleRun(Dcircle, motor_pair,V):
    #Dcircle是走的大圆的直径
    #V是走圆的速度
    #Dlunzi: 是两个轮子之间的间距,单位cm
    #Dcircle=20时,注意切向位置和落笔位置的便宜量是:dy = -9cm; dx = -3.0cm;这个在实际运动前注意补偿
    Dcircle_error = 0
    Dcircle = Dcircle+Dcircle_error
    d = 13
    V1= V*(Dcircle/2.0+d/2.0)/(Dcircle/2.0)
    V2= V*(Dcircle/2.0 - d/2.0)/(Dcircle/2.0)
    Zongchang = 2*math.pi*(Dcircle/2.0+d/2.0)
    t = Zongchang/V1
    tc = 2.0
    motor_pair.move_tank(abs(t*tc), 'seconds', left_speed=int(V1), right_speed=int(V2))
    print(t*tc,V1,V2)

hub = PrimeHub() 

hub.light_matrix.show_image('HAPPY')

light_1=0 
light_2=0
light_3=0
color = ColorSensor ('F')
color.light_up(light_1, light_2, light_3)

moterpen = Motor('D')

moterpen.set_default_speed(8)

moterpen.start_at_power(30)
#moterpen.set_stop_action('brake')
#moterpen.run_to_position(12, direction='shortest path', speed=8)
#wait_for_seconds(2)
#moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)

motor_pair = MotorPair('B', 'A')
#motor_pair.set_motor_rotation(17.6, 'cm')
motor_pair.start_at_power(30, 0)
motor_pair.set_default_speed(20)
#motor_pair.move(5, 'cm', steering=0,speed=8)
#moterpen.run_to_position(50, direction='shortest path', speed=1)
#wait_for_seconds(1)

#motor_pair.move_tank(360, 'degrees', left_speed=10, right_speed=-10)

#moterpen.run_to_position(50, direction='shortest path', speed=1)
#Zizhuan(90, motor_pair)

#motor_pair.move(360, 'degrees', steering=0)
#motor_pair.move(-100, 'cm', steering=30)
#CircleRun(50, motor_pair,20)

#moterpen.run_to_position(12, direction='shortest path', speed=8)
#moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
# 走到第一个点P1
P1qian = Lzhi/2.0 -1 +P1[0]
P1xia = Wzhi/2.0 -1 -P1[1]
motor_pair.move(P1qian, 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(P1xia, 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
# 走到P1-P4
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P1[0]-P2[0], 'cm', steering=0,speed=PenSpeed) #备注:往右走需要起始点-终点;往左走需要终点-起始点
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P3[1]-P2[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P4[0]-P3[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到p5到p6
Zizhuan(-90, motor_pair)
motor_pair.move(P1[1]-P4[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(P5[0]-P1[0], 'cm', steering=0,speed=PenSpeed)
Zizhuan(-61.375, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
LP5_6 = math.sqrt((P6[1]-P5[1])**2+(P6[0]-P5[0])**2)
motor_pair.move(-LP5_6, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到p6-p7
LP6_7 = math.sqrt((P7[1]-P6[1])**2+(P7[0]-P6[0])**2)
motor_pair.move(LP6_7, 'cm', steering=0,speed=PenSpeed)
Zizhuan(61.375-180, motor_pair)
#p7口字
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P7[0]-P8[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P9[1]-P8[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P10[0]-P9[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P10[1]-P7[1], 'cm', steering=0,speed=PenSpeed) #备注:往上走需要起始点-终点;往下走需要终点-起始点
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到P11
motor_pair.move(P7[1]-P11[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
#写子字
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P11[0]-P12[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(135, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
L13_12 = math.sqrt((P13[1]-P12[1])**2+(P13[0]-P12[0])**2)
motor_pair.move(-L13_12, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(-45, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P14[1]-P13[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(135, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
L15_14 = math.sqrt((P15[1]-P14[1])**2+(P15[0]-P14[0])**2)
motor_pair.move(-L15_14, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#往P16走
Zizhuan(45, motor_pair)
motor_pair.move(P15[1]-P16[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(abs(P16[0]-P15[0]), 'cm', steering=0,speed=PenSpeed)
#从P16到P17
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P16[0]-P17[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#从P17走到P18
motor_pair.move(P17[0]-P18[0]-dx, 'cm', steering=0,speed=PenSpeed)
Zizhuan(-90, motor_pair)
motor_pair.move(P17[1]-P18[1]-dy, 'cm', steering=0,speed=PenSpeed)
#转圈
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
CircleRun(D, motor_pair,-20)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#撤退
motor_pair.move(-Wzhi, 'cm', steering=0,speed=PenSpeed)

#if __name__== '__main__':
 #   pass

校徽绘制机器人2

校徽绘制机器人2是校徽绘制机器人1的改进的……

改进点有:1)让它绘制出颜色; 2)利用颜色传感器实现中途换笔;3)外边加上彩虹色描边;4)另外加上了一些细节让它更好看。

校徽绘制机器人2在绘图
用画笔描边,让它变得更漂亮!
描边完成!
看!他的样子焕然一新!
成品如上↑
下面是校徽绘制机器人2的源代码。↓
from spike import PrimeHub, LightMatrix, Button, StatusLight, ForceSensor, MotionSensor, Speaker, ColorSensor, App, DistanceSensor, Motor, MotorPair
from spike.control import wait_for_seconds, wait_until, Timer
from spike import Motor
import math
paper_scanner = ColorSensor('F')
D = 20
dy,dx = -10,-3 #这是画圆偏心值
a = D/20.0

#一些常规变量
Lzhi = 53#29.7 #纸张的长度
Wzhi = 38 #21.0 #纸张的宽度
PenXiaJiao = 11
PenShangjiao = 50
PenSpeed = 10
PenWait = 0.5 #放下笔等待的时间,秒
pendengdai = 18

P1 = [-6*a, 6*a]
P2 = [-a, 6*a]
P3 = [-a,0]
P4 = [-6*a, 0]
P5 = [-2*a,6*a]
P6 = [-8*a,-5*a]
P7 = [-6*a, -2*a]
P8 = [-a, -2*a]
P9 = [-a, -6*a]
P10 = [-6*a, -6*a]
P11 = [-6*a, 3*a]
P12 = [6*a, 3*a]
P13 = [3*a, 0]
P14 = [3*a, -6*a]
P15 = [2*a, -5*a]
P16 = [0, -2*a]
P17 = [6*a, -2*a]
P18 = [10*a, 0]

def Zizhuan(Dushu, motor_pair):
    #Dushu如果是正数,则正转;Dushu如果是负数,则负转;
    #Lpen: 是笔尖到轮子转动中心的距离,单位cm
    Lpen = 9.25
    motor_pair.move(Lpen, 'cm', steering=0,speed=8)
    motor_pair.move_tank(Dushu*2, 'degrees', left_speed=10, right_speed=-10)
    motor_pair.move(-Lpen, 'cm', steering=0,speed=8)

def CircleRun(Dcircle, motor_pair,V):
    #Dcircle是走的大圆的直径
    #V是走圆的速度
    #Dlunzi: 是两个轮子之间的间距,单位cm
    #Dcircle=20时,注意切向位置和落笔位置的便宜量是:dy = -9cm; dx = -3.0cm;这个在实际运动前注意补偿
    Dcircle_error = 0
    Dcircle = Dcircle+Dcircle_error
    d = 13
    V1= V*(Dcircle/2.0+d/2.0)/(Dcircle/2.0)
    V2= V*(Dcircle/2.0 - d/2.0)/(Dcircle/2.0)
    Zongchang = 2*math.pi*(Dcircle/2.0+d/2.0)
    t = Zongchang/V1
    tc = 2.0
    motor_pair.move_tank(abs(t*tc), 'seconds', left_speed=int(V1), right_speed=int(V2))
    print(t*tc,V1,V2)

hub = PrimeHub()

hub.light_matrix.show_image('HAPPY')

light_1=0
light_2=0
light_3=0
color = ColorSensor ('F')
color.light_up(light_1, light_2, light_3)

moterpen = Motor('D')

moterpen.set_default_speed(8)

moterpen.start_at_power(30)
#moterpen.set_stop_action('brake')
#moterpen.run_to_position(12, direction='shortest path', speed=8)
#wait_for_seconds(2)
#moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)

motor_pair = MotorPair('B', 'A')
#motor_pair.set_motor_rotation(17.6, 'cm')
motor_pair.start_at_power(30, 0)
motor_pair.set_default_speed(20)
#motor_pair.move(5, 'cm', steering=0,speed=8)
#moterpen.run_to_position(50, direction='shortest path', speed=1)
#wait_for_seconds(1)

#motor_pair.move_tank(360, 'degrees', left_speed=10, right_speed=-10)

#moterpen.run_to_position(50, direction='shortest path', speed=1)
#Zizhuan(90, motor_pair)

#motor_pair.move(360, 'degrees', steering=0)
#motor_pair.move(-100, 'cm', steering=30)
#CircleRun(50, motor_pair,20)

#moterpen.run_to_position(12, direction='shortest path', speed=8)
#moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
# 走到第一个点P1
P1qian = Lzhi/2.0 -1 +P1[0]
P1xia = Wzhi/2.0 -1 -P1[1]
motor_pair.move(P1qian, 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(P1xia, 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
# 走到P1-P4
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P1[0]-P2[0], 'cm', steering=0,speed=PenSpeed) #备注:往右走需要起始点-终点;往左走需要终点-起始点
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P3[1]-P2[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P4[0]-P3[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到p5到p6
Zizhuan(-90, motor_pair)
motor_pair.move(P1[1]-P4[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(P5[0]-P1[0], 'cm', steering=0,speed=PenSpeed)
Zizhuan(-61.375, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
LP5_6 = math.sqrt((P6[1]-P5[1])**2+(P6[0]-P5[0])**2)
motor_pair.move(-LP5_6, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到p6-p7
LP6_7 = math.sqrt((P7[1]-P6[1])**2+(P7[0]-P6[0])**2)
motor_pair.move(LP6_7, 'cm', steering=0,speed=PenSpeed)
Zizhuan(61.375-180, motor_pair)
#p7口字
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P7[0]-P8[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P9[1]-P8[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P10[0]-P9[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(90, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P10[1]-P7[1], 'cm', steering=0,speed=PenSpeed) #备注:往上走需要起始点-终点;往下走需要终点-起始点
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#走到P11
motor_pair.move(P7[1]-P11[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
#写子字
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
moterpen.run_to_position(pendengdai, direction='shortest path', speed=8)

#paper_scanner = ColorSensor('F')
color=123
while color != "red":
    color = paper_scanner.get_color()
    print('Detected:', color)
    if color == 'red':
        print('It is red!')

moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P11[0]-P12[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(135, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
L13_12 = math.sqrt((P13[1]-P12[1])**2+(P13[0]-P12[0])**2)
motor_pair.move(-L13_12, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(-45, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P14[1]-P13[1], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
Zizhuan(135, motor_pair)
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
L15_14 = math.sqrt((P15[1]-P14[1])**2+(P15[0]-P14[0])**2)
motor_pair.move(-L15_14, 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#往P16走
Zizhuan(45, motor_pair)
motor_pair.move(P15[1]-P16[1], 'cm', steering=0,speed=PenSpeed)
Zizhuan(90, motor_pair)
motor_pair.move(abs(P16[0]-P15[0]), 'cm', steering=0,speed=PenSpeed)
#从P16到P17
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
motor_pair.move(P16[0]-P17[0], 'cm', steering=0,speed=PenSpeed)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#从P17走到P18
motor_pair.move(P17[0]-P18[0]-dx, 'cm', steering=0,speed=PenSpeed)
Zizhuan(-90, motor_pair)
motor_pair.move(P17[1]-P18[1]-dy, 'cm', steering=0,speed=PenSpeed)

moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
moterpen.run_to_position(pendengdai, direction='shortest path', speed=8)

#paper_scanner = ColorSensor('F')
color=123
while color != "red":
    color = paper_scanner.get_color()
    print('Detected:', color)
    if color == 'red':
        print('It is red!')

moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
#转圈
moterpen.run_to_position(PenXiaJiao, direction='shortest path', speed=8)
wait_for_seconds(PenWait)
CircleRun(D, motor_pair,-20)
moterpen.run_to_position(PenShangjiao, direction='shortest path', speed=8)
#撤退
motor_pair.move(-Wzhi, 'cm', steering=0,speed=PenSpeed)

#if __name__== '__main__':
 #pass
color_sensor.light_up_all(0)

未来还有校徽绘制机器人3,会改进自动换笔的功能。

希望这次能拿奖。