From 4ecb6b2ebf2c8c338aa04c0efa1a58715beb1ebb Mon Sep 17 00:00:00 2001 From: Danny Rakita Date: Wed, 20 Dec 2023 22:43:21 -0500 Subject: [PATCH] drawing shape scenes in bevy --- optima_refactor/.idea/optima_refactor.iml | 2 + optima_refactor/Cargo.toml | 3 +- .../crates/optima_3d_spatial/Cargo.toml | 1 + .../optima_3d_spatial/src/optima_3d_pose.rs | 55 +++++- optima_refactor/crates/optima_bevy/Cargo.toml | 1 + .../crates/optima_bevy/src/bin/main4.rs | 32 +++- .../crates/optima_bevy/src/bin/main5.rs | 23 +++ optima_refactor/crates/optima_bevy/src/lib.rs | 11 ++ .../optima_bevy/src/optima_bevy_utils/file.rs | 4 +- .../optima_bevy/src/optima_bevy_utils/mod.rs | 3 +- .../src/optima_bevy_utils/robotics.rs | 36 +++- .../src/optima_bevy_utils/shape_scene.rs | 162 ++++++++++++++++++ .../crates/optima_bevy/src/scripts.rs | 2 - .../crates/optima_proximity/src/bin/main9.rs | 5 + .../src/pair_group_queries.rs | 14 +- .../crates/optima_proximity/src/proxima.rs | 26 +-- .../optima_proximity/src/shape_scene.rs | 61 ++++++- .../crates/optima_proximity/src/shapes.rs | 67 ++++++-- .../crates/optima_robotics/src/bin/main6.rs | 2 +- .../crates/optima_robotics/src/robot.rs | 66 ++++++- .../optima_robotics/src/robot_shape_scene.rs | 16 +- .../robotics_optimization_functions.rs | 1 + .../robotics_optimization_ik.rs | 8 +- .../crates/optima_unity_wrappers/Cargo.toml | 8 + .../crates/optima_unity_wrappers/src/lib.rs | 14 ++ optima_refactor/src/bin/test2.rs | 14 +- optima_refactor/src/bin/test6.rs | 42 +++++ optima_refactor/src/bin/test7.rs | 5 + 28 files changed, 612 insertions(+), 72 deletions(-) create mode 100644 optima_refactor/crates/optima_bevy/src/bin/main5.rs create mode 100644 optima_refactor/crates/optima_bevy/src/optima_bevy_utils/shape_scene.rs create mode 100644 optima_refactor/crates/optima_proximity/src/bin/main9.rs create mode 100644 optima_refactor/crates/optima_unity_wrappers/Cargo.toml create mode 100644 optima_refactor/crates/optima_unity_wrappers/src/lib.rs create mode 100644 optima_refactor/src/bin/test6.rs create mode 100644 optima_refactor/src/bin/test7.rs diff --git a/optima_refactor/.idea/optima_refactor.iml b/optima_refactor/.idea/optima_refactor.iml index 45d8229..15f4cb3 100644 --- a/optima_refactor/.idea/optima_refactor.iml +++ b/optima_refactor/.idea/optima_refactor.iml @@ -22,7 +22,9 @@ + + diff --git a/optima_refactor/Cargo.toml b/optima_refactor/Cargo.toml index 9bf45b6..e602d6a 100644 --- a/optima_refactor/Cargo.toml +++ b/optima_refactor/Cargo.toml @@ -28,7 +28,8 @@ members = [ "crates/optima_sampling", "crates/optima_interpolation", "crates/optima_proximity", - "crates/optima_universal_hashmap" + "crates/optima_universal_hashmap", + "crates/optima_unity_wrappers" ] [dependencies] diff --git a/optima_refactor/crates/optima_3d_spatial/Cargo.toml b/optima_refactor/crates/optima_3d_spatial/Cargo.toml index 266f344..28bcd58 100644 --- a/optima_refactor/crates/optima_3d_spatial/Cargo.toml +++ b/optima_refactor/crates/optima_3d_spatial/Cargo.toml @@ -10,6 +10,7 @@ edition = "2021" ad_trait = { path = "/Users/djrakita/Documents/ad_trait" } nalgebra = { version="0.32.*", features=["rand", "serde-serialize"] } optima_file = { path = "../optima_file" } +optima_linalg = { path = "../optima_linalg" } serde = { version="*", features = ["derive"] } serde_json = { version="*" } serde_with = { version="3.2.0" } diff --git a/optima_refactor/crates/optima_3d_spatial/src/optima_3d_pose.rs b/optima_refactor/crates/optima_3d_spatial/src/optima_3d_pose.rs index c39ff60..42d3d65 100644 --- a/optima_refactor/crates/optima_3d_spatial/src/optima_3d_pose.rs +++ b/optima_refactor/crates/optima_3d_spatial/src/optima_3d_pose.rs @@ -9,7 +9,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::de::{SeqAccess, Visitor}; use serde::ser::SerializeTuple; use serde_with::{DeserializeAs, SerializeAs}; -use crate::optima_3d_vec::O3DVec; +use optima_linalg::OVec; +use crate::optima_3d_vec::{O3DVec, O3DVecCategoryArr}; use crate::optima_3d_rotation::{O3DRotation, O3DRotationConstructor, ScaledAxis}; #[derive(Clone, Debug, Copy, Eq, PartialEq)] @@ -28,6 +29,7 @@ pub trait O3DPose : { type Category: O3DPoseCategory; type RotationType: O3DRotation; + type LieAlgebraType : OVec; fn type_identifier() -> O3DPoseType; fn identity() -> Self; @@ -53,6 +55,33 @@ pub trait O3DPose : fn magnitude(&self) -> T; fn dis(&self, other: &Self) -> T; fn interpolate(&self, to: &Self, t: T) -> Self; + fn ln(&self) -> Self::LieAlgebraType; + fn exp(lie: &Self::LieAlgebraType) -> Self; + #[inline(always)] + fn interpolate_with_separate_max_translation_and_rotation(&self, to: &Self, max_translation: T, max_rotation: T) -> Self { + let t_disp = to.translation().o3dvec_sub(self.translation()).o3dvec_to_other_generic_category::(); + let r_disp = self.rotation().displacement(to.rotation()).scaled_axis_of_rotation(); + + let t_n = t_disp.norm().max(T::constant(0.0000001)); + let r_n = r_disp.norm().max(T::constant(0.0000001)); + + let binding = t_disp.ovec_scalar_div(&t_n).ovec_scalar_mul(& t_n.min(max_translation) ); + let t_disp_new = binding.o3dvec_downcast_or_convert::< >::Native3DVecType >(); + let r_disp_new = r_disp.ovec_scalar_div(&r_n).ovec_scalar_mul(& r_n.min(max_rotation) ); + + let new_translation = self.translation().o3dvec_add(t_disp_new.as_ref()); + let new_rotation = self.rotation().mul( &Self::RotationType::from_scaled_axis_of_rotation(&r_disp_new) ); + + Self::from_translation_and_rotation(&new_translation, &new_rotation) + } + #[inline(always)] + fn interpolate_with_combined_max_translation_and_rotation(&self, to: &Self, max_translation_and_rotation: T) -> Self { + let disp = to.displacement(self); + let ln = disp.ln(); + let n = ln.ovec_p_norm(&T::constant(2.0)).max(T::constant(0.000001)); + let new_ln = ln.ovec_scalar_div(&n).ovec_scalar_mul(&n.min(max_translation_and_rotation)); + self.mul(&Self::exp(&new_ln)) + } #[inline(always)] fn o3dpose_to_constant_ads(&self) -> Self { let translation = self.translation().o3dvec_to_constant_ads(); @@ -93,6 +122,7 @@ impl O3DPose for ImplicitDualQuaternion { type Category = O3DPoseCategoryImplicitDualQuaternion; type RotationType = UnitQuaternion; + type LieAlgebraType = Vector6; #[inline(always)] fn type_identifier() -> O3DPoseType { @@ -204,6 +234,17 @@ impl O3DPose for ImplicitDualQuaternion rotation: orientation, } } + + #[inline(always)] + fn ln(&self) -> Self::LieAlgebraType { + generic_pose_ln(&self.translation, &self.rotation) + } + + #[inline(always)] + fn exp(lie: &Self::LieAlgebraType) -> Self { + let (t, r) = generic_pose_exp(&lie); + Self::from_translation_and_rotation(&t, &r) + } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct O3DPoseCategoryImplicitDualQuaternion; @@ -214,6 +255,7 @@ impl O3DPoseCategory for O3DPoseCategoryImplicitDualQuaternion { impl O3DPose for Isometry3 { type Category = O3DPoseCategoryIsometry3; type RotationType = UnitQuaternion; + type LieAlgebraType = Vector6; fn type_identifier() -> O3DPoseType { O3DPoseType::NalgebraIsometry3 @@ -289,6 +331,17 @@ impl O3DPose for Isometry3 { fn interpolate(&self, to: &Self, t: T) -> Self { self.lerp_slerp(to, t) } + + #[inline(always)] + fn ln(&self) -> Self::LieAlgebraType { + generic_pose_ln(&self.translation.vector, &self.rotation) + } + + #[inline(always)] + fn exp(lie: &Self::LieAlgebraType) -> Self { + let (t, r) = generic_pose_exp(&lie); + Self::from_translation_and_rotation(&t, &r) + } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct O3DPoseCategoryIsometry3; diff --git a/optima_refactor/crates/optima_bevy/Cargo.toml b/optima_refactor/crates/optima_bevy/Cargo.toml index d5ce947..faf5875 100644 --- a/optima_refactor/crates/optima_bevy/Cargo.toml +++ b/optima_refactor/crates/optima_bevy/Cargo.toml @@ -17,6 +17,7 @@ optima_geometry = { path = "../optima_geometry" } optima_interpolation = { path = "../optima_interpolation" } optima_universal_hashmap = { path = "../optima_universal_hashmap" } optima_proximity = { path = "../optima_proximity" } +parry_ad = { package = "parry3d-f64", path = "/Users/djrakita/Documents/parry_ad/crates/parry3d-f64" } bevy = { version="0.11.2", features = ["dynamic_linking"] } bevy_egui = { version = "0.21" } bevy_stl = { version = "0.11.0", features = ["wireframe"] } diff --git a/optima_refactor/crates/optima_bevy/src/bin/main4.rs b/optima_refactor/crates/optima_bevy/src/bin/main4.rs index 7b8c63d..f63b5af 100644 --- a/optima_refactor/crates/optima_bevy/src/bin/main4.rs +++ b/optima_refactor/crates/optima_bevy/src/bin/main4.rs @@ -1,7 +1,33 @@ -use optima_bevy::optima_bevy_utils::robotics::BevyRoboticsTrait; -use optima_robotics::robot::ORobotDefault; +use std::sync::{Arc, Mutex}; +use bevy::app::App; +use bevy::DefaultPlugins; +use bevy::prelude::{Res, Time, Update}; +use optima_robotics::robot::{ORobotDefault}; + +fn test(robot: &Arc, time: &Res