2023年4月

加入 AWS DeepRacer 竞赛

在仿真中成功训练和评估您的模型后,通过参加比赛将您的模型的性能与其他赛车手的模型进行比较。Racing 是一种有趣的方式,可以获取有关您的模型的反馈、赢取奖项和奖品、认识其他 AWS DeepRacer 社区成员、了解学习和提高技能的机会并享受乐趣。

比赛可以是面对面或在线(虚拟),虚拟竞赛可以同步格式化为现场竞赛,也可以异步格式化为经典竞赛。直播和经典虚拟比赛可以私下或公开直播。

本部分讨论如何参加 AWS Le DeepRacer ague 虚拟巡回赛或基于社区的虚拟竞赛,以及您的不同格式选择。

AWS DeepRacer 赛车赛事类型

活动可以按其赞助商或组织者进行分类。AWS DeepRacer League 和社区赛事都可以在实体赛道上亲自举行,也可以在虚拟赛道上在线举行。

AWS-赞助的赛车赛事 — 赞助的赛车赛事AWS被称为 AWS DeepRacer 联赛赛事,向任何 AWS DeepRacer 用户开放。首次参加的赛车手可以通过参加每月的虚拟比赛来开始他们的联赛之旅。一旦赛车手提交了模型参加比赛,他们就会获得积分并获得全国和地区赛季积分榜。

社区赞助的赛车赛事 — 由 AWS DeepRacer 用户创建的赛车赛事称为社区赛车赛事。

参加在线AWS赞助或社区赞助的比赛

您可以使用 AWS DeepRacer 控制台参加 AWS DeepRacer 联赛虚拟巡回赛赛事或基于社区的在线竞赛。

任何 AWS DeepRacer 用户都可以参加 AWS DeepRacer 联赛虚拟巡回赛在线竞赛。

只有受邀的用户才能访问或参与社区赛车虚拟赛事。当用户收到由赛事组织者发送的邀请链接或由其他参赛者转发的邀请链接时,则表示受到邀请。

主题

  • 加入 AWS DeepRacer 联赛虚拟巡回赛
  • 参加 AWS DeepRacer 社区竞赛
  • 参加 AWS LIV DeepRacer E 竞赛
  • 赛车赛事术语
我也注册了AWS账号,也自行创建了一个虚拟赛事,将链接法给别人就能邀请加入该虚拟比赛; 自然也可以参与其他人创建的社区比赛

为 AWS 开辟物理赛道 DeepRacer

本节介绍如何为 AWS DeepRacer 模型建立物理轨道。要自主驾 DeepRacer 驶 AWS 并在物理环境中测试您的强化学习模型,您需要一条物理跑道。您的轨道类似于训练中使用的模拟轨道,并复制了用于训练已部署的 AWS DeepRacer 模型的环境。

为了获得最佳体验,我们建议使用预先打印的轨道和轨道屏障。使用预印的轨道和障碍物有助于 AWS DeepRacer 轨道环境的顺利设置和安装。与其从头开始建造轨道,不如组装预先打印的轨道和轨道屏障部分。活动结束后,你可以拆解、储存和重复使用预先印制的赛道和障碍物,以备future 赛事使用。AWS DeepRacer Storefront 提供了预印的赛道和障碍以及估算空间和其他活动要求的详细信息。

主题
追踪材料和建造工具
为 AWS 铺平道路 DeepRacer
AWS DeepRacer 轨道设计模板

没有拿到具体的小车,暂时就不详细介绍这部分了

操作您的 AWS DeepRacer 车辆

在 AWS DeepRacer 模拟器中完成 AWS DeepRacer 模型的训练和评估后,您可以将该模型部署到您的 AWS DeepRacer 车辆上。您可以将车辆设置为在赛道上行驶,并在物理环境中评估模型的性能。这将模仿真实的自动驾驶赛车。

在首次驾驶车辆之前,您必须设置车辆、安装软件更新并校准其驱动链子系统。

要在物理赛道上驾驶车辆,您必须一个赛道。有关更多信息,请参阅 为 AWS 开辟物理赛道 DeepRacer

主题

了解您的 AWS DeepRacer 车辆
为您的 AWS DeepRacer 车辆选择 Wi-Fi 网络
启动 AWS DeepRacer 车辆的设备控制台
校准您的 AWS DeepRacer 车辆
将模型上传到您的 AWS DeepRacer 车辆
驾驶您的 AWS DeepRacer 车辆
检查和管理您的 AWS DeepRacer 车辆设置
查看您的 AWS DeepRacer 车辆日志

还没有拿到实际的物理小车,这部分暂时就不详细介绍了

R-C.gif

Pygame介绍

Pygame是一个用于开发2D游戏的Python库。它提供了一系列用于游戏开发的工具和函数,可以帮助开发者更快地构建游戏。Pygame具有跨平台性,可以在Windows、Mac OS X和Linux等多个平台上使用。

使用Pygame,开发者可以轻松地创建窗口、绘制图形、播放声音、响应用户输入等功能。它还提供了对位图、声音和视频等多媒体资源的处理功能。开发者可以使用Pygame创建各种类型的游戏,包括平台游戏、射击游戏、角色扮演游戏等等。

下面是一些Pygame的常用功能:

  • 创建和管理游戏窗口
  • 加载和显示图像
  • 绘制几何图形、文本和图像
  • 播放声音和音乐
  • 检测用户输入,如键盘和鼠标事件
  • 控制游戏速度和时间
  • 碰撞检测和物理引擎
  • 简单的人工智能

总之,Pygame是一个非常适合初学者学习游戏开发的Python库,使用Pygame可以让开发者轻松地入门游戏开发,从而更好地理解编程和计算机图形学的相关知识。

创建和管理游戏窗口

在Pygame中,要创建和管理游戏窗口,需要使用pygame.display模块。该模块提供了创建、显示、隐藏、更新游戏窗口等一系列操作。

下面是一个简单的例子,演示如何创建一个游戏窗口:

import pygame

## 初始化Pygame
pygame.init()

## 设置窗口大小和标题
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")

## 游戏循环
running = True
while running:
    ## 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    ## 填充屏幕背景
    screen.fill((255, 255, 255))

    ## 更新屏幕显示
    pygame.display.update()

## 退出Pygame
pygame.quit()

在这个例子中,我们首先导入了Pygame库,并使用pygame.init()初始化。接着,我们设置了游戏窗口的大小和标题,使用pygame.display.set_mode()函数创建了游戏窗口,并使用pygame.display.set_caption()函数设置了游戏窗口的标题。然后,我们进入游戏循环,不断处理事件、更新屏幕显示,直到用户关闭窗口为止。

在处理事件时,我们检查是否有pygame.QUIT事件发生,如果有,就将running变量设为False,从而退出游戏循环。

在更新屏幕显示时,我们首先使用screen.fill()函数填充了屏幕背景色为白色,然后使用pygame.display.update()函数更新屏幕显示。

需要注意的是,当游戏窗口被关闭时,我们需要使用pygame.quit()函数退出Pygame,释放所有资源。

这只是一个简单的例子,使用Pygame可以创建更复杂的游戏窗口,并实现更丰富的功能。

在 Pygame 中,pygame.display.flip() 和 pygame.display.update()
都可以用于更新屏幕显示,但它们之间有一些细微的区别。

pygame.display.flip() 用于实时更新屏幕显示,每次调用它都会完全重绘屏幕。在屏幕显示内容频繁变化时,可以使用
flip() 函数来保证显示的实时性。比如,在一个需要不断移动的游戏角色的场景中,可以使用 flip() 函数实现角色的平滑移动。

pygame.display.update()
用于部分更新屏幕显示。它可以只更新发生变化的部分,而不是完全重绘整个屏幕。这使得更新屏幕的速度更快,也更加高效。但需要注意的是,如果使用
update() 函数更新不包含所有像素的部分屏幕,则更新可能不完整,导致屏幕上显示的内容不正确。

总的来说,如果需要实时更新屏幕显示,使用 flip() 函数更为适合;如果只需要更新部分屏幕,则使用 update()
函数更为高效。在实际开发中,可以根据具体情况选择适合的函数。

加载和显示图像

在 Pygame 中,可以使用 pygame.image.load() 函数来加载图像,并使用 pygame.display.flip() 函数将其显示在屏幕上。

以下是一个简单的加载和显示图像的示例代码:

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 加载图像
image = pygame.image.load('example.png')

## 显示图像
screen.blit(image, (0, 0))
pygame.display.flip()

## 进入游戏循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

在这个例子中,我们首先初始化了 Pygame,并创建了一个大小为 400x400 的窗口。然后使用 pygame.image.load() 函数加载了一个名为 example.png 的图像,并使用 screen.blit() 函数将其显示在屏幕上。最后调用 pygame.display.flip() 函数更新屏幕显示。

需要注意的是,上述示例代码只会显示一次图像,之后程序会进入游戏循环中。如果需要实现动态显示图像,需要在游戏循环中不断更新图像的位置和状态。

## 缩放图像
scaled_image = pygame.transform.scale(image, (100, 100))



绘制几何图形、文本和图

在 Pygame 中,可以使用 pygame.draw 模块绘制几何图形,使用 pygame.font 模块绘制文本,使用 pygame.image.load() 函数加载图像并使用 screen.blit() 函数绘制图像。

以下是一个简单的绘制几何图形、文本和图像的示例代码:

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 绘制几何图形
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(10, 10, 50, 50))
pygame.draw.circle(screen, (0, 255, 0), (100, 100), 25)

## 绘制文本
font = pygame.font.Font(None, 36)
text = font.render('Hello, Pygame!', True, (255, 255, 255))
screen.blit(text, (200, 200))

## 加载图像并绘制
image = pygame.image.load('example.png')
screen.blit(image, (250, 50))

## 刷新屏幕
pygame.display.flip()

## 进入游戏循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

在这个例子中,我们首先使用 pygame.draw.rect() 函数绘制一个红色矩形和 pygame.draw.circle() 函数绘制一个绿色圆圈。然后使用 pygame.font.Font() 函数创建一个字体对象,并使用 font.render() 函数创建一个渲染好的文本对象。接着使用 pygame.image.load() 函数加载一个名为 example.png 的图像,并使用 screen.blit() 函数将其绘制到屏幕上。

最后,调用 pygame.display.flip() 函数刷新屏幕,并进入游戏循环中。在游戏循环中,处理 Pygame 的事件,例如点击关闭窗口等。

播放声音和音乐

在 Pygame 中,可以使用 pygame.mixer 模块播放声音和音乐。下面是一个简单的示例代码,演示如何播放一个声音和一首音乐:

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 加载声音和音乐
sound = pygame.mixer.Sound('example_sound.wav')
music = pygame.mixer.music.load('example_music.mp3')

## 播放声音和音乐
sound.play()
pygame.mixer.music.play()

## 进入游戏循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

在这个例子中,我们首先使用 pygame.mixer.Sound() 函数加载一个名为 example_sound.wav 的声音文件,并使用 pygame.mixer.music.load() 函数加载一个名为 example_music.mp3 的音乐文件。

然后,使用 sound.play() 方法播放声音,并使用 pygame.mixer.music.play() 方法播放音乐。

最后,我们进入游戏循环中。在游戏循环中,处理 Pygame 的事件,例如点击关闭窗口等。

检测用户输入,如键盘和鼠标事件

在 Pygame 中,可以使用 pygame.event 模块来检测用户输入,包括键盘和鼠标事件。下面是一个简单的示例代码,演示如何检测用户按下 Esc 键并点击关闭窗口:

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 进入游戏循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            pygame.quit()
            sys.exit()

在这个例子中,我们首先创建了一个名为 screen 的窗口。

然后,我们进入游戏循环中,使用 pygame.event.get() 函数获取 Pygame 的事件队列,并遍历所有事件。如果检测到 pygame.QUIT 事件,表示用户点击了窗口的关闭按钮,我们就使用 pygame.quit() 函数和 sys.exit() 函数退出程序。如果检测到 pygame.KEYDOWN 事件,并且按下的是 Esc 键,同样退出程序。

控制游戏速度和时间

在 Pygame 中,可以使用 pygame.time 模块来控制游戏速度和时间。下面是一些常用的函数:

pygame.time.Clock():创建一个 Clock 对象,用于跟踪游戏的帧率。
clock.tick(FPS):设置游戏的帧率,其中 FPS 是每秒帧数。
pygame.time.get_ticks():获取自 Pygame 初始化以来的毫秒数。
pygame.time.delay(ms):暂停游戏,单位为毫秒。

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 创建 Clock 对象
clock = pygame.time.Clock()

## 获取程序开始运行的时间
start_time = pygame.time.get_ticks()

## 进入游戏循环
while True:
    # 设置游戏的帧率为 60
    clock.tick(60)

    ## 计算游戏运行的时间
    current_time = pygame.time.get_ticks() - start_time

    ## 暂停游戏 1 秒
    if current_time > 1000:
        pygame.time.delay(1000)

    ## 处理 Pygame 的事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

在这个例子中,我们首先创建了一个名为 screen 的窗口。

然后,我们创建了一个 Clock 对象,用于跟踪游戏的帧率。使用 clock.tick(60) 函数将游戏的帧率设置为 60,即每秒钟更新 60 次窗口。

接着,我们使用 pygame.time.get_ticks() 函数获取程序开始运行以来的毫秒数,并将其存储在变量 start_time 中。然后,我们在游戏循环中使用 pygame.time.get_ticks() 函数计算游戏运行的时间,并将其存储在变量 current_time 中。如果游戏运行的时间超过 1 秒,我们使用 pygame.time.delay(1000) 函数暂停游戏 1 秒。

最后,我们处理 Pygame 的事件,例如点击关闭窗口等。

碰撞检测和物理引擎

在 Pygame 中,可以使用碰撞检测来判断两个游戏对象是否相撞。通常使用 pygame.sprite.spritecollide() 函数进行碰撞检测,该函数可以检测一个 Sprite 对象是否与一个 Sprite 组中的任何一个对象相撞。如果相撞,该函数返回一个列表,包含与该对象相撞的所有 Sprite 对象。该函数的语法如下:

spritecollide(sprite, group, dokill, collided=None)

其中,参数说明如下:

  • sprite:要检测碰撞的 Sprite 对象。
  • group:包含其他 Sprite 对象的 Sprite 组。
  • dokill:是否从 Sprite 组中删除与 sprite 相撞的对象,默认值为 False。
  • collided:一个可调用对象,用于检测两个 Sprite 对象是否相撞。如果为 None,则默认使用
    sprite.rect.colliderect() 函数检测相撞。如果需要更复杂的碰撞检测,可以自定义该函数。

下面是一个简单的示例代码,演示如何使用碰撞检测来实现一个小游戏:

import pygame

## 初始化 Pygame
pygame.init()

## 创建窗口
screen = pygame.display.set_mode((400, 400))

## 加载图片
player_img = pygame.image.load('player.png').convert_alpha()
player_rect = player_img.get_rect()
player_rect.center = (200, 200)

enemy_img = pygame.image.load('enemy.png').convert_alpha()
enemy_rect = enemy_img.get_rect()
enemy_rect.center = (100, 100)

## 进入游戏循环
while True:
    ## 处理 Pygame 的事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    ## 移动玩家
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_rect.x -= 5
    elif keys[pygame.K_RIGHT]:
        player_rect.x += 5
    elif keys[pygame.K_UP]:
        player_rect.y -= 5
    elif keys[pygame.K_DOWN]:
        player_rect.y += 5

    ## 检测碰撞
    ##if pygame.sprite.spritecollide(player_rect, [enemy_rect], True):
     if player_rect.colliderect(enemy_rect):  
        print('Game over!')

    ## 渲染游戏场景
    screen.fill((255, 255, 255))
    screen.blit(player_img, player_rect)
    screen.blit(enemy_img, enemy_rect)
    pygame.display.flip()

在这个例子中,我们首先加载了两张图片:player.png 和 enemy.png。然后,我们创建了两个包含图片和位置信息的 Rect 对象:player_rect 和 enemy_rect。

接着,我们进入游戏循环,处理 Pygame 的事件。如果用户按下方向键,我们就移动 player_rect 对象。然后,我们使用 pygame.sprite.spritecollide() 函数检测 player_rect 是否与 enemy_rect 相撞。如果相撞,我们将游戏结束。

最后,我们在游戏窗口中将所有的元素绘制出来,形成最终的游戏画面。这个过程一般称为渲染。在 Pygame 中,我们可以使用 pygame.display.flip() 或者 pygame.display.update() 来完成渲染的过程。

其中,pygame.display.flip() 是将我们所有的绘制操作都在内存中完成之后,一次性将整个画面渲染出来。而 pygame.display.update() 则是只渲染我们指定的区域,可以更加高效地更新画面。

除了渲染之外,我们还需要控制游戏的帧率和时间。在 Pygame 中,可以使用 pygame.time.Clock() 来创建一个时钟对象,并使用 clock.tick(fps) 来控制帧率。这样可以保证我们的游戏在不同的设备上都能够以相同的帧率运行,从而提供更好的游戏体验。

同时,我们还可以使用 pygame.time.get_ticks() 来获取当前游戏运行的时间,以便在游戏中实现一些时间相关的功能。

简单的人工智能

在 Python 中实现简单的人工智能,通常需要以下步骤:

  1. 定义问题空间:首先需要明确你的人工智能要解决的问题是什么,例如游戏中的敌人如何决策、聊天机器人如何回答问题等。
  2. 设计算法模型:针对不同的问题,需要设计不同的算法模型。例如,决策问题可以使用基于规则的算法、基于搜索的算法或基于强化学习的算法等。
  3. 收集和处理数据:对于需要训练的算法,需要收集和处理数据,例如分类问题需要一些已经被标记的数据集。
    实现代码并训练模型:在明确问题空间、设计算法模型、收集和处理数据之后,可以开始编写代码并训练模型。
  4. 评估和调整:训练完成后,需要对模型进行评估和调整,以提高其性能和准确率。

需要注意的是,实现简单的人工智能并不是一件简单的事情,需要深入学习相关的算法和编程知识。但是,如果你对人工智能感兴趣,可以开始从一些简单的问题开始尝试。例如,你可以使用 Python 实现一个基于规则的聊天机器人,让它能够回答一些基础的问题。

基于规则的聊天机器人sample:

import random

def get_response(message):
    greetings = ['hi', 'hello', 'hey', 'how are you']
    responses = {
        'hi': 'Hello there!',
        'hello': 'Hi!',
        'hey': 'Hey there!',
        'how are you': 'I am doing well, thank you. How about you?',
        'default': 'I am sorry, but I did not understand what you said.'
    }
    
    if message.lower() in greetings:
        return random.choice(responses[message.lower()])
    else:
        return responses['default']

while True:
    message = input('You: ')
    response = get_response(message)
    print('Bot:', response)

其他例子:

import pygame
import random

## 初始化pygame
pygame.init()

## 设置窗口大小和标题
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Bouncing Ball")

## 定义小球的初始位置、半径、速度和颜色
ball_x, ball_y = random.randint(0, screen_width), random.randint(0, screen_height)
ball_radius = 20
ball_dx, ball_dy = random.randint(5, 10), random.randint(5, 10)
ball_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

## 设置游戏循环
clock = pygame.time.Clock()  # 创建一个Clock对象
FPS = 60  # 设置帧率为60帧/秒
running = True
while running:
    ## 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False
    
    ## 计算小球的下一步位置
    ball_x += ball_dx
    ball_y += ball_dy
    
    ## 碰到窗口边界时反弹并改变小球颜色
    if ball_x + ball_radius >= screen_width or ball_x - ball_radius <= 0:
        ball_dx = -ball_dx
        ball_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    if ball_y + ball_radius >= screen_height or ball_y - ball_radius <= 0:
        ball_dy = -ball_dy
        ball_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    
    ## 填充背景色
    screen.fill((255, 255, 255))
    
    ## 绘制小球
    pygame.draw.circle(screen, ball_color, (ball_x, ball_y), ball_radius)
    
    ## 更新屏幕
    pygame.display.update()
    
    ## 控制帧率
    clock.tick(FPS)

## 退出pygame
pygame.quit()

https://student.deepracer.com/raceToken/XU-8IQzqQoOVWn0Wxz3TJw

AWS上面创建一个学生虚拟比赛

有student.deepracer.com账号的都可以接受邀请参与其中..

    Welcome to Deepracer-SHXW-2023, an AWS DeepRacer student community race!

You're invited to Deepracer-SHXW-2023, a time trial race on May 1 12:00 AM GMT+8. This race is hosted by <Educator/School>. 

To Race:
1. Log in to your AWS DeepRacer student account.
2. Submit your AWS DeepRacer model to enter the race https://student.deepracer.com/raceToken/XU-8IQzqQoOVWn0Wxz3TJw. Model

submissions open on May 1 12:00 AM GMT+8 and ends on December 31 11:59
PM GMT+8. Note that this displayed race time may not reflect your
current time zone. You can submit multiple models, but only the model
with the best lap time is entered in the race.


Participation checklist
* Sign up for an AWS DeepRacer student account and create a profile.
* Train a model.
* Submit your model to enter the race.