pygame轨迹跟踪仿真(一)

本文将讲解我的部分关键pygame轨迹跟踪仿真代码,想看完整的源码可以去下方的程序源码开源地址处领取,觉得好的话记得给我star,点赞哦~

使用我的开源代码时请引用我的文章并表明出处,不得盗用!

应网友需求,更新了pygame轨迹跟踪仿真代码,在pygame轨迹跟踪仿真(一)的基础上,pygame轨迹跟踪仿真(二)(一的优化版)文章中讲解了新增的多智能体仿真,初始化功能,为了后期做深度强化学习,还添加了轨迹误差项,程序运行结束后会返回轨迹误差。

一、所用环境和基础(程序源码开源地址)(代码已更新为pygame轨迹跟踪仿真(二)(一的优化版)的代码)

  1. 一台电脑
  2. vscode
  3. python3.8.5
  4. 熟悉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)]

三、小车精灵创建

  1. 创建小车精灵,可以在想要多个小车时,使用精灵组进行统一更改和调用。
  2. 本代码使用pygame.draw.circle创建的小车是一个圆,想要导入小车图片的可以去源码模仿游戏背景精灵创建方式,导入小车图片。
  3. 定义小车的加速,减速和带惯性的刹车
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()

五、轨迹

  1. 画出需要跟踪的路径(这里使用的路径是贝塞尔曲线,详细用法可以去pygame官网文档查看)
pygame.gfxdraw.bezier(self.screen, [(100,620),(300,300),(400,600),(600,150)], 5, (255,0,0))

path_planning

  1. 画出小车跟踪的路径
pygame.draw.lines(self.screen, (0,0,0), 0, LINES_LIST)

track_planning

六、展示视频b站链接,知乎链接,youtube链接

七、预告

  1. 将使用本环境,结合深度强化学习代码,进行自主轨迹跟踪
  2. 将在本代码中加入可替换的路径规划程序,以代替自己设置的贝塞尔曲线
  3. 结合路径规划程序和深度强化学习程序,形成一套完整的轨迹规划仿真

如果以上的仿真有什么问题可以在下方的评论区里评论,我会帮大家解答和更改

pygame轨迹跟踪仿真到此结束,各位小伙伴觉得不错的话可以给我打赏

# 本篇文章在知乎csdn我的个人主页上同步上传,有兴趣的话点击链接,可以去我的个人主页观光哦~