如果这篇博客帮助到你,可以给我充个电加个油哦~
CC BY 4.0 (除特别声明或转载文章外)
本文将讲解我的部分关键pygame轨迹跟踪仿真代码,想看完整的源码可以去下方的程序源码开源地址处领取,觉得好的话记得给我star,点赞哦~
使用我的开源代码时请引用我的文章并表明出处,不得盗用!
应网友需求,更新了pygame轨迹跟踪仿真代码,在pygame轨迹跟踪仿真(一)的基础上,pygame轨迹跟踪仿真(二)(一的优化版)文章中讲解了新增的多智能体仿真,初始化功能,为了后期做深度强化学习,还添加了轨迹误差项,程序运行结束后会返回轨迹误差。
一、所用环境和基础(程序源码开源地址)(代码已更新为pygame轨迹跟踪仿真(二)(一的优化版)的代码)
- 一台电脑
- vscode
- python3.8.5
- 熟悉pygame模块的基本应用,pygame官网
二、常量设置
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 720, 720)
# 刷新的帧率
FRAME_PER_SEC = 60
# 创建小车的定时器常量
CREATE_CAR_EVENT = pygame.USEREVENT
# 定义目标点的位置
TARGET_POSITION = [600,150]
# 定义圆形小车的大小(直径)
CAR_SIZE = 10
# 圆形小车颜色
CAR_COLOUR = [0,0,0]
# 使用连线命令画小车移动轨迹时需要两个初始点(就是你定义的小车初始坐标点)
LINES_LIST = [(100,620),(100,620)]
三、小车精灵创建
- 创建小车精灵,可以在想要多个小车时,使用精灵组进行统一更改和调用。
- 本代码使用pygame.draw.circle创建的小车是一个圆,想要导入小车图片的可以去源码模仿游戏背景精灵创建方式,导入小车图片。
- 定义小车的加速,减速和带惯性的刹车
class CarSimulation(pygame.sprite.Sprite):
"""小车仿真精灵"""
def __init__(self, positionx, positiony, car_speedx=1, car_speedy=1, k=1): #car_speedx和car_speedy是小车的x和y方向的速度值,k是用来定义小车的速度变化值
super().__init__()
self.car_speedx = car_speedx
self.car_speedy = car_speedy
self.positionx = positionx
self.positiony = positiony
self.k = k
def car_add(self,car_screen):
pygame.draw.circle(car_screen,CAR_COLOUR,[self.positionx,self.positiony],CAR_SIZE,0) #最后一个0表示填充,数字代表线宽
def car_update(self):
self.positionx += self.car_speedx
self.positiony += self.car_speedy
LINES_LIST.append((self.positionx,self.positiony))
# 控制小车不能离开屏幕
if (self.positionx - CAR_SIZE/2)< 0:
self.positionx = CAR_SIZE/2
elif (self.positionx + CAR_SIZE/2)> SCREEN_RECT.right:
self.positionx = SCREEN_RECT.right - CAR_SIZE/2
if (self.positiony - CAR_SIZE/2)< 0:
self.positiony = CAR_SIZE/2
elif (self.positiony + CAR_SIZE/2)> SCREEN_RECT.bottom:
self.positiony = SCREEN_RECT.bottom - CAR_SIZE/2
def accelerate(self): #小车加速
self.k += 1
def moderate(self): #小车减速
self.k -= 1
if self.k <=0:
self.k=0
def bracking(self): #小车带有惯性的刹车
pygame.time.delay(500)
self.car_speedx = 0
self.car_speedy = 0
四、键盘控制
键盘的上下左右控制小车移动,z加速,x减速,空格惯性刹车(刹车后可以看到小车向前动了一段距离)</br>
if keys_pressed[pygame.K_RIGHT]:
self.car1.car_speedx = self.car1.k
elif keys_pressed[pygame.K_LEFT]:
self.car1.car_speedx = -self.car1.k
else:
self.car1.car_speedx = 0
if keys_pressed[pygame.K_UP]:
self.car1.car_speedy = -self.car1.k
elif keys_pressed[pygame.K_DOWN]:
self.car1.car_speedy = self.car1.k
else:
self.car1.car_speedy = 0
if keys_pressed[pygame.K_z]:
self.car1.accelerate()
elif keys_pressed[pygame.K_x]:
self.car1.moderate()
elif keys_pressed[pygame.K_SPACE]:
self.car1.bracking()
五、轨迹
- 画出需要跟踪的路径(这里使用的路径是贝塞尔曲线,详细用法可以去pygame官网文档查看)
pygame.gfxdraw.bezier(self.screen, [(100,620),(300,300),(400,600),(600,150)], 5, (255,0,0))
- 画出小车跟踪的路径
pygame.draw.lines(self.screen, (0,0,0), 0, LINES_LIST)
六、展示视频b站链接,知乎链接,youtube链接
七、预告
- 将使用本环境,结合深度强化学习代码,进行自主轨迹跟踪
- 将在本代码中加入可替换的路径规划程序,以代替自己设置的贝塞尔曲线
- 结合路径规划程序和深度强化学习程序,形成一套完整的轨迹规划仿真