apollo icon indicating copy to clipboard operation
apollo copied to clipboard

如何使apollo的地图在commonroad中可视化

Open MrGoldminer opened this issue 10 months ago • 11 comments

apollo的路口定义中,对于路口信息是否可以捕捉到更加丰富的信息,使其可以更好的可视化 image 我希望可以捕捉到更多的路口信息,使我可以在commonroad中利用地图数据做规划

MrGoldminer avatar Apr 22 '24 05:04 MrGoldminer

用Overlap id可以找到哪些路是connecting road, 然后每个路有successor predecessor可以找到incoming和successor。这些信息都在hdmap文件里,您有其他需要的信息吗?

YuqiHuai avatar Apr 23 '24 14:04 YuqiHuai

但我目前只有base_map.bin文件,但是路口具体的车道的前后左右是没有的

MrGoldminer avatar Apr 23 '24 14:04 MrGoldminer

主要找不到路口每个车道的位置关系

MrGoldminer avatar Apr 23 '24 14:04 MrGoldminer

commonroad的路口前继,后继没有具体位置关系

MrGoldminer avatar Apr 23 '24 14:04 MrGoldminer

您需要的是类似这样的吗,蓝色的是junction,然后画出了junction里的lane,以及junction lane的pred/succ

Figure_1

YuqiHuai avatar Apr 23 '24 15:04 YuqiHuai

但是目前应该是抓不到这些信息的,从base_map文件中

MrGoldminer avatar Apr 24 '24 03:04 MrGoldminer

我需要以lane的位置信息表示junction

MrGoldminer avatar Apr 24 '24 03:04 MrGoldminer

但是目前应该是抓不到这些信息的,从base_map文件中

那个图就是从base map文件画出来的。要不您举个例子什么是“以lane的位置信息表示junction”

YuqiHuai avatar Apr 24 '24 11:04 YuqiHuai

就是左边这个,他数字对应的是lane_id,其他是对应的位置关系,在路口的左右还是前后,这在apollo的地图中似乎找不到

MrGoldminer avatar Apr 24 '24 13:04 MrGoldminer

可以通过base_map.bin知道通过lane A(红色)进入路口内的lane B(黄色)然后出路口后到达lane C(蓝色)。您需要的是这个关系吗

Figure_1

YuqiHuai avatar Apr 24 '24 15:04 YuqiHuai

MrGoldminer avatar Apr 29 '24 08:04 MrGoldminer

map_relation.zip 这是分析HD Map并画出上面那幅图的代码,您看看。

YuqiHuai avatar May 06 '24 21:05 YuqiHuai

from baidu_apollo_proto.proto_v8.modules.common_msgs.map_msgs.map_pb2 import Map,这个接口在哪里了

MrGoldminer avatar May 07 '24 01:05 MrGoldminer

这是中心线,我处理的是车道线

MrGoldminer avatar May 07 '24 01:05 MrGoldminer

from baidu_apollo_proto.proto_v8.modules.common_msgs.map_msgs.map_pb2 import Map,这个接口在哪里了

GitHub, PyPI

这是中心线,我处理的是车道线

from baidu_apollo_proto.proto_v8.modules.common_msgs.map_msgs.map_pb2 import Map
from matplotlib import pyplot as plt


map = Map()
map.ParseFromString(open("borregas_ave.bin", "rb").read())

plotted_lanes = set()


def get_overlap_ids(obj):
    return [overlap.id for overlap in obj.overlap_id]


def get_left_lane_boundary(lane):
    points = []
    for p in lane.left_boundary.curve.segment[0].line_segment.point:
        points.append((p.x, p.y))
    return points


def get_right_lane_boundary(lane):
    points = []
    for p in lane.right_boundary.curve.segment[0].line_segment.point:
        points.append((p.x, p.y))
    return points


def label_lane(lane):
    points = lane.central_curve.segment[0].line_segment.point
    plt.text(points[0].x, points[0].y, lane.id.id)


def plot_lane_boundary(lane, color):
    lhs = get_left_lane_boundary(lane)
    rhs = get_right_lane_boundary(lane)

    lane_points = lhs + rhs[::-1]
    lane_points.append(lane_points[0])

    plt.fill(
        [p[0] for p in lane_points],
        [p[1] for p in lane_points],
        alpha=0.5,
        color=color,
    )


lane_objs = dict()

for lane in map.lane:
    lane_objs[lane.id.id] = lane

for junc in map.junction:
    junc_ids = get_overlap_ids(junc)

    points = junc.polygon.point
    x = [point.x for point in points]
    y = [point.y for point in points]

    x.append(x[0])
    y.append(y[0])

    plt.fill(x, y, alpha=0.5)

    for lane in map.lane:
        if lane.id.id in plotted_lanes:
            continue
        lane_ids = get_overlap_ids(lane)

        if any(junc_id in lane_ids for junc_id in junc_ids):
            label_lane(lane)
            plot_lane_boundary(lane, "black")
            plotted_lanes.add(lane.id.id)

            # predecessor
            for pred in lane.predecessor_id:
                pred_lane = lane_objs[pred.id]
                label_lane(pred_lane)
                plot_lane_boundary(pred_lane, "red")
                plotted_lanes.add(pred_lane.id.id)

            # successor
            for succ in lane.successor_id:
                succ_lane = lane_objs[succ.id]
                label_lane(succ_lane)
                plot_lane_boundary(succ_lane, "blue")
                plt.text(x[0], y[0], succ.id)
                plotted_lanes.add(succ_lane.id.id)
    break
plt.show()

YuqiHuai avatar May 07 '24 03:05 YuqiHuai

ok,thanks

MrGoldminer avatar May 07 '24 07:05 MrGoldminer

borregas_ave.zip 我需要的是将这个地图文件转为xml格式的示例文件,他在路口目前是只能手动输入 https://gitlab.lrz.de/tum-cps/commonroad-apollo-interface 这个里面的commonroad_connect.py有很大的参考意义,但目前还没有太好的进展, https://gitlab.lrz.de/tum-cps/commonroad-scenarios/-/tree/2020a_scenarios/scenarios/interactive/SUMO/CHN_Cho-2_5_I-1-1?ref_type=heads 最终需要的是这种文件

MrGoldminer avatar May 07 '24 13:05 MrGoldminer

https://github.com/ApolloAuto/apollo/issues/15384#issuecomment-2072474059 这个每个lanelet在xml中都可以提取出来;主要还是路口需要做具体的标注

MrGoldminer avatar May 07 '24 13:05 MrGoldminer

Uploading example——xml.zip…

MrGoldminer avatar May 07 '24 13:05 MrGoldminer

我看了看您发的python代码,里面这部分

def parse_lane(scenario, lane):
    step = 10.
    for lane_id_, data in lane.items():
        lanelet_ = Lanelet(
            np.array(data['left_boundary']),
            np.array(data['central_boundary']),
            np.array(data['right_boundary']),
            lane_id_, 
            data['pred_ids'], 
            data['succ_ids'],
            data['l_ids'][0], 
            data['l_ids'][1], 
            data['r_ids'][0], 
            data['r_ids'][1], 
            data['speed_limit']
        )
    # add one lanelet to the scenario.
        scenario.add_objects(lanelet_)

就可以把Apollo的lane变成Common Road里的lanelet了吧?Left boundary, central, right boundary都可以通过上面代码读到。

YuqiHuai avatar May 07 '24 20:05 YuqiHuai

MrGoldminer avatar May 08 '24 08:05 MrGoldminer