我想在 OpenAI Gym CarRacing-v0 环境中修改 car_racing.py->create_track() 并构建特定的赛道或各种拐角段

问题描述

    def _create_track(self):
        CHECKPOINTS = 12 #number of corners

        # Create checkpoints
        checkpoints = []
        for c in range(CHECKPOINTS):
            noise = self.np_random.uniform(0,2 * math.pi * 1 / CHECKPOINTS)
            alpha = 2 * math.pi * c / CHECKPOINTS + noise
            rad = self.np_random.uniform(TRACK_RAD / 3,TRACK_RAD)

            if c == 0:
                alpha = 0
                rad = 1.5 * TRACK_RAD
            if c == CHECKPOINTS - 1:
                alpha = 2 * math.pi * c / CHECKPOINTS
                self.start_alpha = 2 * math.pi * (-0.5) / CHECKPOINTS
                rad = 1.5 * TRACK_RAD

            checkpoints.append((alpha,rad * math.cos(alpha),rad * math.sin(alpha)))
        self.road = []

        # Go from one checkpoint to another to create track
        x,y,beta = 1.5 * TRACK_RAD,0
        dest_i = 0
        laps = 0
        track = []
        no_freeze = 2500
        visited_other_side = False
        while True:
            alpha = math.atan2(y,x)
            if visited_other_side and alpha > 0:
                laps += 1
                visited_other_side = False
            if alpha < 0:
                visited_other_side = True
                alpha += 2 * math.pi

            while True:  # Find destination from checkpoints
                failed = True

                while True:
                    dest_alpha,dest_x,dest_y = checkpoints[dest_i % len(checkpoints)]
                    if alpha <= dest_alpha:
                        failed = False
                        break
                    dest_i += 1
                    if dest_i % len(checkpoints) == 0:
                        break

                if not failed:
                    break

                alpha -= 2 * math.pi
                continue

            r1x = math.cos(beta)
            r1y = math.sin(beta)
            p1x = -r1y
            p1y = r1x
            dest_dx = dest_x - x  # vector towards destination
            dest_dy = dest_y - y
            # destination vector projected on rad:
            proj = r1x * dest_dx + r1y * dest_dy
            while beta - alpha > 1.5 * math.pi:
                beta -= 2 * math.pi
            while beta - alpha < -1.5 * math.pi:
                beta += 2 * math.pi
            prev_beta = beta
            proj *= SCALE
            if proj > 0.3:
                beta -= min(TRACK_TURN_RATE,abs(0.001 * proj))
            if proj < -0.3:
                beta += min(TRACK_TURN_RATE,abs(0.001 * proj))
            x += p1x * TRACK_DETAIL_STEP
            y += p1y * TRACK_DETAIL_STEP
            track.append((alpha,prev_beta * 0.5 + beta * 0.5,x,y))
            if laps > 4:
                break
            no_freeze -= 1
            if no_freeze == 0:
                break

        # Find closed loop range i1..i2,first loop should be ignored,second is OK
        i1,i2 = -1,-1
        i = len(track)
        while True:
            i -= 1
            if i == 0:
                return False  # Failed
            pass_through_start = (
                track[i][0] > self.start_alpha and track[i - 1][0] <= self.start_alpha
            )
            if pass_through_start and i2 == -1:
                i2 = i
            elif pass_through_start and i1 == -1:
                i1 = i
                break
        if self.verbose == 1:
            print("Track generation: %i..%i -> %i-tiles track" % (i1,i2,i2 - i1))
        assert i1 != -1
        assert i2 != -1

        track = track[i1 : i2 - 1]

        first_beta = track[0][1]
        first_perp_x = math.cos(first_beta)
        first_perp_y = math.sin(first_beta)
        # Length of perpendicular jump to put together head and tail
        well_glued_together = np.sqrt(
            np.square(first_perp_x * (track[0][2] - track[-1][2]))
            + np.square(first_perp_y * (track[0][3] - track[-1][3]))
        )
        if well_glued_together > TRACK_DETAIL_STEP:
            return False

        # Red-white border on hard turns
        border = [False] * len(track)
        for i in range(len(track)):
            good = True
            oneside = 0
            for neg in range(BORDER_MIN_COUNT):
                beta1 = track[i - neg - 0][1]
                beta2 = track[i - neg - 1][1]
                good &= abs(beta1 - beta2) > TRACK_TURN_RATE * 0.2
                oneside += np.sign(beta1 - beta2)
            good &= abs(oneside) == BORDER_MIN_COUNT
            border[i] = good
        for i in range(len(track)):
            for neg in range(BORDER_MIN_COUNT):
                border[i - neg] |= border[i]

        # Create tiles
        for i in range(len(track)):
            alpha1,beta1,x1,y1 = track[i]
            alpha2,beta2,x2,y2 = track[i - 1]
            road1_l = (
                x1 - TRACK_WIDTH * math.cos(beta1),y1 - TRACK_WIDTH * math.sin(beta1),)
            road1_r = (
                x1 + TRACK_WIDTH * math.cos(beta1),y1 + TRACK_WIDTH * math.sin(beta1),)
            road2_l = (
                x2 - TRACK_WIDTH * math.cos(beta2),y2 - TRACK_WIDTH * math.sin(beta2),)
            road2_r = (
                x2 + TRACK_WIDTH * math.cos(beta2),y2 + TRACK_WIDTH * math.sin(beta2),)
            vertices = [road1_l,road1_r,road2_r,road2_l]
            self.fd_tile.shape.vertices = vertices
            t = self.world.CreateStaticBody(fixtures=self.fd_tile)
            t.userData = t
            c = 0.01 * (i % 3)
            t.color = [ROAD_COLOR[0] + c,ROAD_COLOR[1] + c,ROAD_COLOR[2] + c]
            t.road_visited = False
            t.road_friction = 1.0
            t.fixtures[0].sensor = True
            self.road_poly.append(([road1_l,road2_l],t.color))
            self.road.append(t)
            if border[i]:
                side = np.sign(beta2 - beta1)
                b1_l = (
                    x1 + side * TRACK_WIDTH * math.cos(beta1),y1 + side * TRACK_WIDTH * math.sin(beta1),)
                b1_r = (
                    x1 + side * (TRACK_WIDTH + BORDER) * math.cos(beta1),y1 + side * (TRACK_WIDTH + BORDER) * math.sin(beta1),)
                b2_l = (
                    x2 + side * TRACK_WIDTH * math.cos(beta2),y2 + side * TRACK_WIDTH * math.sin(beta2),)
                b2_r = (
                    x2 + side * (TRACK_WIDTH + BORDER) * math.cos(beta2),y2 + side * (TRACK_WIDTH + BORDER) * math.sin(beta2),)
                self.road_poly.append(
                    ([b1_l,b1_r,b2_r,b2_l],(1,1,1) if i % 2 == 0 else (1,0))
                )
        self.track = track
        return True

原始脚本在每一集中都会创建随机的闭环赛道。经过一些试验,我设法保存了所需(仍然是随机的)轨道的参数并重新创建了轨道,但现在我想制作具有特定类型拐角的轨道,这些拐角不一定是封闭的,甚至更好地创建一个开环跟踪具有特定半径和角度的单个角落。 我想创建各种类型的角并从中获取模拟数据,以便工作和进行分析。 我想知道是否有人可以帮助我实施或提供有关如何解决此问题的信息。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...