新闻详情

新闻详情

首页 / 资讯中心 / 详情

Fast-F1 CircuitInfo 赛道信息接口完全指南:拐角标注、赛道旋转与可视化实战

发布时间:2026/9/17 15:27:46来源:尧图网络
Fast-F1 CircuitInfo 赛道信息接口完全指南:拐角标注、赛道旋转与可视化实战
Fast-F1 CircuitInfo 赛道信息接口完全指南拐角标注、赛道旋转与可视化实战【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1导读本文围绕 FastF1 中与**赛道信息Circuit Information**相关的核心对象fastf1.mvapi.CircuitInfo展开讲解如何通过Session.get_circuit_info()获取一条赛道的拐角corners、裁判灯marshal lights、裁判区段marshal sectors位置以及赛道地图旋转角并将其用于速度曲线标注、赛道地图绘制等可视化任务。读完本文你将掌握 CircuitInfo 的数据结构、各字段语义、Distance列的生成原理以及如何用最短的代码把赛道信息叠加到自己的图表上。关联文档docs/api_reference/circuit_info.rst一、CircuitInfo 是什么API 参考页背后的对象在 API 参考中CircuitInfo被定义为用于可视化和标注数据时有用的赛道信息集合其完整定义位于 fastf1/mvapi/data.py是一个dataclassdataclass class CircuitInfo: corners: pd.DataFrame marshal_lights: pd.DataFrame marshal_sectors: pd.DataFrame rotation: float四个字段分别描述corners所有弯道的标注位置marshal_lights裁判灯的位置赛道旁用于指示黄旗等旗语状态的灯光点marshal_sectors裁判区段的位置用于裁决超车、检测赛道限制的分区点rotation赛道的旋转角度度用于把遥测坐标系的 XY 数据旋转到与官方赛道地图一致的方向。前三者都是结构完全相同的 DataFrame下面统称赛道标记 track markersrotation是标量。数据来源与准确性声明需要特别指出的是这份赛道数据是人工创建、由 MultiViewer 提供并非来自 F1 官方的精确实测数据。官方文档明确说明this data has been manually created and is not highly accurate but sufficient for visualization——即精度满足可视化标注需要但不适合做精确测量。这一点在使用时务必记住尤其当你把标注结果用于对外发布的精确分析时。数据通过网络请求获取入口在 fastf1/mvapi/api.py 的get_circuit()它会请求https://api.multiviewer.app/api/v1/circuits/{circuit_key}/{year}并把 JSON 响应交给上层解析。仓库内置了一份真实响应样例见 fastf1/testing/reference_data/2020_05_FP2/mvapi_circuits.raw其中每个拐角大致形如{angle: 153.79, length: 9070.40, number: 1, trackPosition: {x: -569.58, y: 8153.72}}trackPosition.x与trackPosition.y即最终进入 DataFrame 的X和Y。二、核心数据结构赛道标记 DataFrame 的六列语义corners、marshal_lights、marshal_sectors三个 DataFrame 共用同一套列结构官方文档给出的格式为X float, Y float, Number int, Letter str, Angle float, Distance float每一列的含义如下列名类型含义X/Yfloat标记点在赛道地图坐标系中的位置Numberint弯道编号对裁判灯 / 裁判区段同样使用编号区分Letterstr可选字母后缀用于区分同号弯例如 2AAnglefloat标注偏移角度度用于把标记文字沿合理方向通常垂直赛道偏移摆放Distancefloat标记点距发车线start/finish line的里程需要借助车载遥测计算只有加载了遥测数据才可用Distance 列为什么依赖遥测数据官方文档强调Distance的值needs to be computed using car telemetry as a reference因此只有加载了遥测数据才会填充。其计算逻辑实现在CircuitInfo.add_marker_distance()fastf1/mvapi/data.py原理是最小二乘最近邻匹配取参考圈的遥测并用frequencyoriginal获取原始频率数据只保留Source pos的采样点即 GPS 定位源不含插值点对每一个赛道标记计算其 XY 坐标与所有遥测 XY 采样点之间的平方误差取误差最小的那个采样点的Distance作为标记的里程。对应源码核心片段diff xy_array - marker_xy_array.reshape((-1, 1, 2)) e diff[..., 0] ** 2 diff[..., 1] ** 2 indices np.nanargmin(e, axis1) distances tel.iloc[indices][Distance].to_list() df[Distance] distances从源码结构看若参考圈的遥测未加载或为空该方法会记录一条 warningFailed to generate marker distance information: ...并直接返回此时 DataFrame 中Distance保持NaN。这正是测试 fastf1/tests/test_mvapi.pytest_get_circuit_info_warns_no_telemetry所验证的行为会话以telemetryFalse加载后调用get_circuit_info()日志中会出现上述警告。从 JSON 到 DataFrame 的字段映射get_circuit_info()fastf1/mvapi/data.py依次读取 JSON 中的corners、marshalLights、marshalSectors三组数组并做如下转换trackPosition.x、trackPosition.y→X、Yfloatnumber→Numberintletter→Letterstrangle→AnglefloatDistance统一先填np.nan等add_marker_distance()用遥测回填。顶层字段rotation直接映射为CircuitInfo.rotation。测试 fastf1/tests/test_mvapi.py 确认了六列的列名与数据类型X/Y/Angle/Distance为 float64Number为 int64Letter为 object。三、如何获取 CircuitInfoSession.get_circuit_info()日常使用中你不需要直接调用get_circuit_info()函数而是通过会话对象import fastf1 session fastf1.get_session(2021, Spanish Grand Prix, Q) session.load() # 加载会话数据含遥测 circuit_info session.get_circuit_info()Session.get_circuit_info()fastf1/core.py的内部流程是从session.session_info[Meeting][Circuit][Key]取出赛道的circuit_key调用get_circuit_info(year..., circuit_key...)从 MultiViewer API 获取数据并构建CircuitInfo自动以self.laps.pick_fastest()全场最快圈为参考圈调用add_marker_distance()回填Distance列。因此只要会话加载了遥测数据拿到的circuit_info.corners等 DataFrame 的Distance列就是已填充的可以直接用于按里程定位的图表例如横轴为距离、在弯道处画竖线。需要注意的边界情况若加载会话时telemetryFalseDistance列将保持NaN并产生一条 warning见上文若 API 请求失败或返回无效数据get_circuit_info()会记录Failed to load circuit info警告并返回None测试test_get_circuit_info_invalid_key验证了这一点Mugello 特例源码中对 circuit_key 149 且 ShortName 为 Mugello 的赛道做了特殊处理将 key 改写为 146 再请求。这是从源码可见的实现细节属于对 API 数据缺陷的兼容修正。四、实战一在速度曲线图上标注弯道这是circuit_info最典型的用法之一完整示例见 examples/telemetry/plot_annotate_speed_trace.py。核心思路以Distance为横轴画速度曲线在每个弯道的Distance处画竖直虚线并在线的下方标注弯道编号。import fastf1 import fastf1.plotting import matplotlib.pyplot as plt fastf1.plotting.setup_mpl(mpl_timedelta_supportTrue, color_schemefastf1) session fastf1.get_session(2021, Spanish Grand Prix, Q) session.load() fastest_lap session.laps.pick_fastest() car_data fastest_lap.get_car_data().add_distance() # 获取赛道信息含各弯道里程 circuit_info session.get_circuit_info() team_color fastf1.plotting.get_team_color(fastest_lap[Team], sessionsession) fig, ax plt.subplots() ax.plot(car_data[Distance], car_data[Speed], colorteam_color, labelfastest_lap[Driver]) # 在每个弯道处画竖直虚线范围略超出速度曲线的上下限 v_min car_data[Speed].min() v_max car_data[Speed].max() ax.vlines(xcircuit_info.corners[Distance], yminv_min - 20, ymaxv_max 20, linestylesdotted, colorsgrey) # 在每个弯道下方标注编号含字母后缀如 2A for _, corner in circuit_info.corners.iterrows(): txt f{corner[Number]}{corner[Letter]} ax.text(corner[Distance], v_min - 30, txt, vacenter_baseline, hacenter, sizesmall) ax.set_xlabel(Distance in m) ax.set_ylabel(Speed in km/h) ax.legend() ax.set_ylim([v_min - 40, v_max 20]) plt.show()关键点弯道文字由Number与Letter拼接得到恰好覆盖 2A 这类同号弯场景手动扩展 y 轴下限因为 Matplotlib 不会自动为手工添加的文字预留空间相邻弯道距离很近时文字可能重叠官方示例也注明这是简化方案的已知局限。五、实战二绘制带弯道编号的赛道地图第二个经典场景是用位置遥测画赛道地图并旋转到官方地图方向后标注弯道。完整示例见 examples/general/plot_annotate_corners.py。import matplotlib.pyplot as plt import numpy as np import fastf1 session fastf1.get_session(2023, Silverstone, Q) session.load() lap session.laps.pick_fastest() pos lap.get_pos_data() # 位置遥测X/Y circuit_info session.get_circuit_info() # 旋转辅助函数绕原点旋转 def rotate(xy, *, angle): rot_mat np.array([[np.cos(angle), np.sin(angle)], [-np.sin(angle), np.cos(angle)]]) return np.matmul(xy, rot_mat) # 1) 用 rotation 把整条赛道旋转到官方地图朝向 track pos.loc[:, (X, Y)].to_numpy() track_angle circuit_info.rotation / 180 * np.pi rotated_track rotate(track, angletrack_angle) plt.plot(rotated_track[:, 0], rotated_track[:, 1]) # 2) 用每个弯道的 Angle 做文字偏移避免文字压在赛道上 offset_vector [500, 0] for _, corner in circuit_info.corners.iterrows(): txt f{corner[Number]}{corner[Letter]} offset_angle corner[Angle] / 180 * np.pi offset_x, offset_y rotate(offset_vector, angleoffset_angle) text_x, text_y rotate([corner[X] offset_x, corner[Y] offset_y], angletrack_angle) track_x, track_y rotate([corner[X], corner[Y]], angletrack_angle) plt.scatter(text_x, text_y, colorgrey, s140) # 圆形气泡 plt.plot([track_x, text_x], [track_y, text_y], colorgrey) # 引线 plt.text(text_x, text_y, txt, vacenter_baseline, hacenter, sizesmall, colorwhite) plt.xticks([]); plt.yticks([]) plt.axis(equal) plt.show()这段代码同时用到了CircuitInfo的两个能力rotation用于旋转遥测坐标系让地图朝向与官方赛道地图一致每个标记的Angle用于把文字气泡沿垂直赛道的方向偏移出去。Angle以度为单位源码中需要先转成弧度再乘旋转矩阵。说明Angle的参考方向为正上方偏移向量初始为[500, 0]具体方向语义以 MultiViewer 提供的数据为准示例中的 500 米偏移量是视觉效果上的经验取值。六、进阶直接使用 get_circuit_info() 与底层数据流如果你不通过Session而是想了解/复用底层能力也可以直接调用模块级函数from fastf1.mvapi import get_circuit_info circuit_info get_circuit_info(year2020, circuit_key39)返回的CircuitInfo中Distance列为NaN需要自己调用add_marker_distance(reference_lap...)回填参考圈可以是任意fastf1.core.Lap且该圈必须已加载位置遥测。测试 fastf1/tests/test_mvapi.py 展示了这条直接调用路径的验证方式。完整的数据流可以概括为Session.get_circuit_info() └─ 读取 session_info 中的 circuit_key含 Mugello 特例修正 └─ get_circuit_info(year, circuit_key) # fastf1/mvapi/data.py ├─ get_circuit() # fastf1/mvapi/api.py │ └─ GET https://api.multiviewer.app/api/v1/circuits/{key}/{year} └─ 解析 JSON → corners / marshalLights / marshalSectors / rotation └─ CircuitInfo.add_marker_distance(pick_fastest()) └─ 最近邻匹配遥测 XY → 回填 Distance由于请求走的是公共 HTTP API同一circuit_key year的数据会被 FastF1 的请求缓存机制Cache.requests_get缓存重复获取不会反复产生网络开销。七、字段速查与使用建议速查表字段类型用途是否依赖遥测cornersDataFrame弯道标注X/Y/Number/Letter/Angle/DistanceDistance 依赖marshal_lightsDataFrame裁判灯位置结构同上Distance 依赖marshal_sectorsDataFrame裁判区段位置结构同上Distance 依赖rotationfloat赛道地图旋转角度否实操建议先session.load()再取get_circuit_info()否则Distance为空且伴随警告横轴为距离的图速度曲线、刹车点分布用corners[Distance]定位画赛道地图时用rotation旋转坐标用每行的Angle偏移标注文字记住数据为人工整理、精度有限适合可视化标注而不适合做毫米级测量想要更深入的源码细节可继续阅读 fastf1/mvapi/data.py、fastf1/mvapi/api.py 以及两个官方示例 plot_annotate_corners.py 与 plot_annotate_speed_trace.py。结语CircuitInfo是 FastF1 中把数据变成图的关键一环它把弯道、裁判灯、裁判区段和地图旋转角打包成统一结构的 DataFrame配合遥测数据自动补全里程信息从而支撑起速度曲线标注、赛道地图绘制等一系列可视化能力。掌握它的数据结构与获取流程你就能在自己的分析脚本里快速叠加赛道语义标注让图表信息量提升一个档次。【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

多智能体协作的数学建模自动化:架构设计、实现链路与工程踩坑 2026/9/17 16:16:04

多智能体协作的数学建模自动化:架构设计、实现链路与工程踩坑

1. MathModelAgent要解决的是"建模过程被工具撕裂"的问题先说个场景。你花了一个周末,把一份销售数据翻来覆去地洗,Excel里拉了透视表,Python里跑了回归,最后在Word里贴了十来张图,再手工敲一段"模型显…

阅读更多 →
GD32F103真实硬件RTOS选型实测:容错性比跑分更重要 2026/9/17 16:16:04

GD32F103真实硬件RTOS选型实测:容错性比跑分更重要

1. 实测不是比跑分,而是看“谁在真实MCU上不掉链子”你有没有试过,在GD32F103C8T6上跑FreeRTOS,明明配置了128KB RAM,却在创建第7个任务时突然卡死?或者用Zephyr编译出来的固件,烧录后串口连个字符都不吐&a…

阅读更多 →
3分钟上手notepad--:批量替换与文件对比 2026/9/17 16:16:04

3分钟上手notepad--:批量替换与文件对比

3分钟上手notepad--:批量替换与文件对比 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- notepad--&#xf…

阅读更多 →
StarRocks stddev/stddev_pop 总体标准差聚合函数详解:语法、返回值与源码实现 2026/9/17 16:16:04

StarRocks stddev/stddev_pop 总体标准差聚合函数详解:语法、返回值与源码实现

StarRocks stddev/stddev_pop 总体标准差聚合函数详解:语法、返回值与源码实现 【免费下载链接】starrocks The worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scen…

阅读更多 →
风电功率预测实战:从数据清洗到GBDT模型全流程解析 2026/9/17 16:16:04

风电功率预测实战:从数据清洗到GBDT模型全流程解析

简介:这是一份面向电网调度、风电场运营及新能源研究人员的《风电功率预测系统简介》PDF文档,系统梳理了风电功率预测的目的意义、国内外技术现状、核心技术特点与应用价值,可作为入行学习、方案设计或技术汇报的参考文献。内容涵盖气象信息实…

阅读更多 →
单个监狱信息化方案:先算容量再画拓扑,YAML+docxtpl模板化 2026/9/17 16:13:01

单个监狱信息化方案:先算容量再画拓扑,YAML+docxtpl模板化

简介:面向监狱信息化与智能化监管场景,这份《2025年信息化方案监狱信息化建设技术方案单个监狱模板》以单座监狱为落地模板,适合系统集成商、安防方案设计人员及监狱信息化项目负责人参考。内容覆盖智能化监管控制、数字化监狱监控、视频监控…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞