note:
(1)python文件若执行报错,一般在开头加入下面几行即可解决
import sys sys.path.append("/apollo") sys.path.append("/apollo/bazel-bin")(2) 运行c++可执行程序前需要提前编译相关模块
(3)此为高精地图模式,非导航模式,需要注释掉modules/common/data/global_flagfile.txt中的--use_navigation_mode=true
生成顺序:path.txt->path.png->smooth_path.txt->smooth_path.png->map_path.txt->base_map.bin->sim_map.txt和sim_map.bin->routing_map.txt和routing_map.bin
1、创建地图文件夹
mkdir modules/map/data/my_map2、提取/apollo/localization
python3 modules/tools/map_gen/extract_path_alan.py modules/map/data/my_map/path.txt my_bag.record.00000 my_bag.record.00001extract_path_alan.py相比原代码extract_path.py多了按距离降采样(每隔0.2米一个点)
last_x = 0 last_y = 0 count = 0 with open(filename, 'w') as f: for fbag in fbags: reader = RecordReader(fbag) for msg in reader.read_messages(): if msg.topic == "/apollo/localization/pose": localization = localization_pb2.LocalizationEstimate() localization.ParseFromString(msg.message) x = localization.pose.position.x y = localization.pose.position.y if count > 0: if ((x-last_x) * (x-last_x) + (y-last_y) * (y-last_y)) < 0.04: continue count = count + 1 last_x = x last_y = y f.write(str(x) + "," + str(y) + "\n") print("File written to: %s" % filename)path.txt格式如下
537117.711868027,4345109.767280837 537117.9188373548,4345109.790459993、可视化原始轨迹
python3 modules/tools/map_gen/plot_path.py modules/map/data/my_map/path.txt4、平滑轨迹(去除跳变的噪点)
python3 modules/tools/map_gen/smooth_path_alan.py modules/map/data/my_map/path.txt modules/map/data/my_map/smooth_path.txtsmooth_path_alan.py
import numpy as np from scipy.interpolate import splprep, splev import sys def smooth_trajectory(input_file, output_file, smoothing_factor=0.5): # 1. 读取数据 data = np.loadtxt(input_file, delimiter=',') # 假设格式为 x,y x = data[:, 0] y = data[:, 1] # 2. 参数化 t (累积距离或索引) t = np.arange(len(x)) # 3. 使用 B-Spline 平滑 # s 为平滑因子,越大越平滑,但可能偏离原始点;越小越贴近原始点,但保留噪点 # 对于 1.5km 数据,可能需要调整 s 值,例如 len(x)*smoothing_factor tck, u = splprep([x, y], u=t, s=len(x)*smoothing_factor) # 4. 生成平滑后的点 (保持点数一致或重新采样) x_smooth, y_smooth = splev(u, tck) # 5. 保存结果 smoothed_data = np.column_stack((x_smooth, y_smooth)) np.savetxt(output_file, smoothed_data, delimiter=',', fmt='%.6f') print(f"Smoothed path saved to {output_file}") if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: python smooth_path.py <input_raw_path.txt> <output_smooth_path.txt>") sys.exit(1) smooth_trajectory(sys.argv[1], sys.argv[2])smooth_path.txt格式如下
537117.828025,4345111.747766 537118.026289,4345111.6179935、可视化平滑轨迹
python3 modules/tools/map_gen/plot_path.py modules/map/data/my_map/smooth_path.txt推荐算法: 滑动平均滤波 (Moving Average):简单有效,适合轻微噪点。 高斯滤波 (Gaussian Filter):能更好地保留曲线特征同时去除高频噪点。 B-Spline 或 QP-Spline 拟合:Apollo 内部参考线平滑使用的算法,效果最好,但实现较复杂。这里使用 scipy 库中的样条插值即可满足需求。 替代方案: 使用 Apollo 内部的参考线平滑原理 如果你希望更贴近 Apollo 原生逻辑,可以参考搜索结果中提到的 QP-Spline 或 FemPosSmooth 算法。但这些算法主要集成在 Planning 模块内部用于实时参考线生成,而非离线地图构建工具。 对于离线建图,外部平滑处理(如 Scipy Spline)+ map_gen_single_lane.py 是最稳定且易于实现的路径。 常见问题排查 平滑后路径偏离道路:调整平滑因子 s。如果路径过于平直而丢失了弯道细节,减小 s;如果仍有锯齿,增大 s。 坐标系不一致:确保 extract_path.py 提取的是投影坐标(如 UTM 或局部笛卡尔坐标),而不是经纬度。经纬度直接拟合会导致严重变形。extract_path.py 通常会自动处理投影,请检查其输出单位。 跳变极大:如果某些点跳变幅度极大(如几米甚至几十米),建议在平滑前先进行离群点剔除(Outlier Removal)。例如,计算相邻点的距离,如果某段距离远超车辆物理极限(如 10Hz 频率下移动超过 1 米),则将该点替换为前后点的平均值或直接删除。6、生成单车道地图(车道宽度设为4m)
python3 modules/tools/map_gen/map_gen_single_lane.py modules/map/data/my_map/smooth_path.txt modules/map/data/my_map/map_path.txt 4map_path.txt格式如下
lane { id { id: "1" } central_curve { segment { line_segment { point { x: 537117.828025 y: 4345111.747766 }7、将txt地图转为bin地图
python3 modules/tools/create_map/convert_map_txt2bin.py -i modules/map/data/my_map/map_path.txt -o modules/map/data/my_map/base_map.bin8、生成sim地图(用于dreamview可视化,包括绿色中线和黄色边线,降采样幅度大)
./bazel-bin/modules/map/tools/sim_map_generator --map_dir=/apollo/modules/map/data/my_map/ --output_dir=/apollo/modules/map/data/my_map/生成sim_map.txt和sim_map.bin
sim_map.txt格式如下
lane { id { id: "1" } central_curve { segment { line_segment { point { x: 537117.828025 y: 4345111.747766 }在百度Apollo自动驾驶系统中,sim_map.txt 和 sim_map.bin 是仿真可视化专用的轻量高精度地图文件,二者内容同源、仅格式不同,核心作用如下: 1. 核心定位 它们是基于完整基础地图base_map降采样生成的轻量化版本,通过降低数据密度,大幅提升前端渲染和数据传输的运行性能。 2. 具体用途 支撑Dreamview可视化:专门为Apollo的Dreamview监控界面设计,用于快速渲染显示车道线、道路轮廓等核心地图元素,避免加载全量高精度地图导致界面卡顿。 适配仿真场景:为仿真模块提供精简的地图环境数据,满足仿真测试时的基础道路拓扑展示需求,降低仿真进程的资源占用。 3. 格式差异 sim_map.bin:是Protobuf序列化后的二进制格式,程序读取速度更快,是系统默认优先加载的格式。 sim_map.txt:是文本化的Protobuf格式,方便开发者直接打开查看、调试地图内容,可读性更强。 你可以通过Apollo内置的sim_map_generator工具,基于已生成的base_map一键生成这两个文件。9、生成routing地图(用于routing模块,对应dreamview中起止点间的红色参考线)
运行前需要修改modules/common/data/global_flagfile.txt中的map_dir变量 (--map_dir=/apollo/modules/map/data/my_map)
./bazel-bin/modules/routing/topo_creator/topo_creator --flagfile=modules/routing/conf/routing.conf以下报错不用管
Conf file: /apollo/modules/routing/conf/routing_config.pb.txt is loaded. E0719 22:52:19.262758 31718 hdmap_util.cc:39] [map]No existing file found in /apollo/modules/map/data/my_map/routing_map.bin|routing_map.txt. Fallback to first candidate as default result. Create routing topo successfully from /apollo/modules/map/data/my_map/base_map.bin to /apollo/modules/map/data/my_map/routing_map.bin生成routing_map.txt和routing_map.bin
routing_map.txt格式如下
hdmap_version: "" hdmap_district: "" node { lane_id: "1" length: 100 left_out { start { s: 0 } end { s: 100 } } right_out { start { s: 0 } end { s: 100 } } cost: 45.645372164108814 central_curve { segment { line_segment { point { x: 537117.828025 y: 4345111.747766 }10、启动dreamview
bash scripts/bootstrap.sh启动成功后,在浏览器访问http://localhost:8888打开界面。
打开Tasks中的Sim Control
打开Module Controller中的Routing, Planning
打开Route Editing,点击Add Point of Interest,点击一下测试起点,再点击一下测试终点,点击Send Routing Request,车就沿规划轨迹动起来,到终点停止
在 Apollo 自动驾驶平台中,SimControl(仿真控制) 是 Dreamview 提供的一种核心仿真模式。它的主要作用是模拟车辆的底盘(Chassis)、定位(Localization)和感知(Perception)数据输入,从而让开发者在没有真实车辆硬件的情况下,单独测试和调试规划(Planning)与控制(Control算法)。 在真实的自动驾驶闭环中,流程是 Planning -> Control -> Chassis。 但在 Sim Control 模式下: 未启动 Control 时:流程变为 Planning -> Sim Control (直接更新位姿)。此时车辆只是“被动”地沿着规划好的几何路径滑动,不考虑车辆动力学约束(如最大加速度、轮胎滑移等),也不执行真正的 PID 或 MPC 控制算法。 启动 Control 时:流程变为 Planning -> Control -> Sim Control。Control 模块接收 Planning 的轨迹,计算出具体的控制指令(油门、刹车、转向),然后将这些指令发送给 Sim Control。Sim Control 会根据这些指令,结合内部的动力学模型(如 MKZ Model)来计算车辆的下一时刻状态。此时车辆的运动更符合真实物理特性。