5 个版本
0.0.4 | 2024年2月23日 |
---|---|
0.0.3 | 2024年2月23日 |
0.0.2 | 2024年2月22日 |
0.0.1 | 2024年2月21日 |
0.0.0 | 2023年12月29日 |
#93 in 机器学习
143 每月下载量
88KB
1K SLoC
🚗 openpilot
openpilot
是一个综合的 Rust 包,旨在帮助构建完全自动驾驶车辆。此包的主要重点是提供构建和模拟传感器模型、GPS 传感器以及实现扩展卡尔曼滤波器 (EKF) 的工具。库中包括用于管理传感器读取、简单传感器、GPS 传感器和具有高性能 1D 扩展卡尔曼滤波器 (EKF) 实现的模块。
除了这些基本功能之外,openpilot
还引入了 selfdrive
包。此包专门设计用于自动驾驶车辆控制,提供便于对象跟踪、聚类管理和详细的前车分析的模块和结构。
🦀 为什么选择 Rust?
Python 主要是一种面向孩子的编程语言!
为 openpilot
选择 Rust 就像是给你的自动驾驶车辆代码装上喷气发动机。Rust 带来的内存安全和并发控制水平,将潜在的编程噩梦转化为无bug的宁静之旅。凭借其高性能 1D 扩展卡尔曼滤波器和针对传感器管理和自动驾驶控制的模块,Rust 中的 openpilot
不只是一个工具箱;它是自动驾驶车辆开发的詹姆斯·邦德。那么,为什么选择 Rust?因为当你的代码在街道上导航时,你想要的不仅仅是一种可以驾驶的语言,而是一种可以像外科手术机器人一样精确、像瑞士手表一样可靠的驾驶语言。欢迎来到自动驾驶的高速通道,Rust 是确保你无bug、优雅地到达目的地的方向盘。
✨ 特点
- 自动驾驶车辆:
selfdrive
包引入了为自动驾驶车辆控制设计的模块和结构。这包括对象跟踪、聚类管理和详细的前车分析等功能。这些工具是构建完全自动驾驶系统的关键组件。
看!我的本田车正在自己驾驶!
-
传感器模型:轻松构建和模拟传感器模型,灵活地自定义观测模型和协方差矩阵。
-
简单传感器: 创建并利用简单传感器进行高效数据处理,实现与您的自主系统的无缝集成。
-
GPS传感器: 实现具有精确读数的GPS传感器,支持经纬度坐标,以实现精确的位置跟踪。
-
1D扩展卡尔曼滤波器(EKF): 利用快速高效的1D EKF实现,用于鲁棒的状态估计和跟踪应用。
🚀 快速入门
按照以下简单步骤开始使用 openpilot
库
- 通过在您的
Cargo.toml
文件中添加以下行来安装openpilot
包
[dependencies]
openpilot = "0.0.4"
- 导入必要的模块,并在您的Rust项目中使用提供的功能
use ndarray::arr2;
use openpilot::common::ext_kal_fltr::{SensorReading, SimpleSensor, GPS, EKF, FastEKF1D};
use openpilot::selfdrive::controls::radar_helpers::{Track, Cluster, Lead};
fn main() {
// Example usage
let data = arr2(&[[1.0, 2.0], [3.0, 4.0]]);
let obs_model = arr2(&[[1.0, 0.0], [0.0, 1.0]]);
let covar = arr2(&[[0.1, 0.0], [0.0, 0.1]]);
let sensor_reading = SensorReading::new(data.clone(), obs_model.clone(), covar.clone());
// Create a simple sensor
let simple_sensor = SimpleSensor::new(obs_model.clone(), covar.clone(), 2);
let reading = simple_sensor.read(data.clone(), None);
println!("Simple Sensor Reading: {:?}", reading);
// Create a GPS sensor
let gps_sensor = GPS::new((0, 1), 2, 0.01);
let latlon = &[37.7749, -122.4194];
let reading = gps_sensor.read(latlon, None);
println!("GPS Sensor Reading: {:?}", reading);
// Create and use a fast 1D Extended Kalman Filter
let mut fast_ekf_1d = FastEKF1D::new(0.1, 0.01, 0.001);
fast_ekf_1d.update_scalar(&sensor_reading);
fast_ekf_1d.predict(0.1);
let (tf, tfj) = fast_ekf_1d.calc_transfer_fun(0.1);
println!("EKF Transfer Function: {:?}, Jacobian: {:?}", tf, tfj);
// Use Track, Cluster, and Lead structs and functions
let mut track = Track::new();
track.update(10.0, -5.0, 20.0, 15.0, 30.0, 0.1, 0.5, 0.5, 15.0, 20.0, 10.0);
let key = track.get_key_for_cluster();
println!("Track Key for Cluster: {:?}", key);
let mut cluster = Cluster::new();
let track1 = Track::new();
let track2 = Track::new();
cluster.add(track1);
cluster.add(track2);
let d_rel = cluster.d_rel();
println!("Cluster Relative Distance: {:?}", d_rel);
let mut lead = Lead {
d_rel: 0.0,
y_rel: 0.0,
v_rel: 0.0,
a_rel: 0.0,
v_lead: 0.0,
a_lead: 0.0,
d_path: 0.0,
v_lat: 0.0,
v_lead_k: 0.0,
a_lead_k: 0.0,
status: false,
fcw: true,
};
cluster.to_live20(&mut lead);
println!("Lead Vehicle Information: {:?}", lead);
}
🧪 测试
使用以下命令运行 openpilot
包的测试
cargo test
🌐 GitHub仓库
您可以在 GitHub 上访问 openpilot
的源代码。
🤝 贡献
欢迎贡献和反馈!如果您想贡献、报告问题或建议改进,请在 GitHub 上与该项目互动。您的贡献有助于提高这个包对社区的价值。
💰 支持
如果您喜欢这个项目,请考虑向虚拟的小费罐中投币。您的捐赠有助于保持咖啡的供应和代码的破解。所以,如果您想成为这个项目应得的英雄,为什么不向开发者的虚拟帽子中撒一些金币呢?
📘 文档
openpilot
的完整文档可在 docs.rs 上找到。
📄 许可证
本项目采用 MIT许可证 许可。
依赖项
~2MB
~34K SLoC