use pi_orca::{rvos_imulator::RVOSimulator, vector2::Vector2};
use rand::Rng;
use rand_core::SeedableRng;
const TEMP: f32 = 20.;
const NUM: usize = 4;
const MAX_SPEED: f32 = 0.5;
fn main() {
let mut sim = RVOSimulator::default();
let mut goals = vec![];
let mut agents = vec![];
setup_scenario(&mut sim, &mut goals, &mut agents);
for agent in &agents {
println!("agent: {:?}", unsafe {
std::mem::transmute::<f64, u64>(*agent)
});
}
loop {
update_visualization(&mut sim, &agents);
set_preferred_velocities(&mut sim, &goals, &agents);
sim.do_step();
std::thread::sleep(std::time::Duration::from_millis(16));
}
}
pub fn setup_scenario(sim: &mut RVOSimulator, goals: &mut Vec<Vector2>, agents: &mut Vec<f64>) {
sim.set_time_step(0.25);
sim.set_agent_defaults(1.5, 10, 10., 10., 0.15, MAX_SPEED, &Vector2::default());
agents.push(sim.add_agent(&Vector2::new(20.5, 17.5), MAX_SPEED));
sim.set_agent_goal(agents[0], Some(Vector2::new(22.0, 11.0)));
agents.push(sim.add_agent(&Vector2::new(21.5, 17.5), MAX_SPEED));
sim.set_agent_goal(agents[1], Some(Vector2::new(22.0, 11.0)));
agents.push(sim.add_agent(&Vector2::new(22.6, 17.5), MAX_SPEED));
sim.set_agent_goal(agents[2], Some(Vector2::new(22.0, 11.0)));
}
pub fn update_visualization(sim: &mut RVOSimulator, agents: &Vec<f64>) {
println!("{}", sim.get_global_time());
for id in agents {
let pos = sim.get_agent_position(*id);
println!("当前位置: {:?}", pos);
let goal = sim.get_agent_goal(*id);
println!("期望目标: {:?}", goal);
let dist = Vector2::abs(&(goal.unwrap() - pos.unwrap()));
println!("目标距离: {:?}", dist);
let velocity = sim.get_agent_velocity(*id);
println!("当前速度:{:?}", velocity);
let pref_velocity = sim.get_agent_pref_velocity(*id);
println!("期望速度: {:?}", pref_velocity);
let num = sim.get_agent_num_orcalines(*id).unwrap();
println!("超平面数量: {:?}", num);
for i in 0..num {
let orca = sim.get_agent_orcaline(*id, i);
println!("超平面: {:?}", orca);
}
if let Some(goal) = sim.get_agent_goal(*id) {
let pos = pos.unwrap();
if goal.x == pos.x && goal.y == pos.y {
println!("到达目标");
sim.set_agent_goal(*id, None);
}
}
}
println!("");
}
pub fn set_preferred_velocities(sim: &mut RVOSimulator, goals: &Vec<Vector2>, agents: &Vec<f64>) {
}
pub fn reached_goal(sim: &mut RVOSimulator, goals: &Vec<Vector2>, agents: &Vec<f64>) -> bool {
for (id, goal) in agents.iter().zip(goals) {
if Vector2::abs_sq(&(sim.get_agent_position(*id).unwrap() - goal))
> sim.get_agent_radius(*id).unwrap() * sim.get_agent_radius(*id).unwrap()
{
return false;
}
}
true
}