1 package com.neuronrobotics.bowlerstudio.physics;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
7 import java.util.stream.Collectors;
9 import javax.vecmath.Quat4f;
10 import javax.vecmath.Vector3f;
12 import com.bulletphysics.dynamics.RigidBody;
13 import com.bulletphysics.dynamics.constraintsolver.HingeConstraint;
14 import com.bulletphysics.linearmath.Transform;
15 import com.neuronrobotics.bowlerstudio.creature.MobileBaseCadManager;
16 import com.neuronrobotics.sdk.addons.kinematics.AbstractLink;
17 import com.neuronrobotics.sdk.addons.kinematics.DHLink;
18 import com.neuronrobotics.sdk.addons.kinematics.DHParameterKinematics;
19 import com.neuronrobotics.sdk.addons.kinematics.ILinkListener;
20 import com.neuronrobotics.sdk.addons.kinematics.LinkConfiguration;
21 import com.neuronrobotics.sdk.addons.kinematics.MobileBase;
22 import com.neuronrobotics.sdk.addons.kinematics.imu.IMU;
23 import com.neuronrobotics.sdk.addons.kinematics.imu.IMUUpdate;
24 import com.neuronrobotics.sdk.addons.kinematics.math.RotationNR;
25 import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR;
26 import com.neuronrobotics.sdk.common.IClosedLoopController;
27 import com.neuronrobotics.sdk.pid.PIDLimitEvent;
28 import com.neuronrobotics.sdk.util.ThreadUtil;
32 import eu.mihosoft.vrl.v3d.CSG;
35 import javafx.application.Platform;
36 import javafx.scene.paint.Color;
37 import javafx.scene.transform.Affine;
42 private HashMap<LinkConfiguration, ArrayList<CSG>>
simplecad;
45 public static final float LIFT_EPS = (float) Math.toRadians(0.1);
49 Vector3f oldavelocity =
new Vector3f(0f, 0f, 0f);
50 Vector3f oldvelocity =
new Vector3f(0f, 0f, 0f);
51 Vector3f gravity =
new Vector3f();
52 private Quat4f orentation =
new Quat4f();
53 Transform gravTrans =
new Transform();
54 Transform orentTrans =
new Transform();
55 Vector3f avelocity =
new Vector3f();
56 Vector3f velocity =
new Vector3f();
59 public void update(
float timeStep) {
61 body.getAngularVelocity(avelocity);
62 body.getLinearVelocity(velocity);
64 body.getGravity(gravity);
65 body.getOrientation(orentation);
70 new TransformNR(0, 0, 0, orentation.w, orentation.x, orentation.y, orentation.z), orentTrans);
72 orentTrans.mul(gravTrans);
75 Double rotxAcceleration = (double) ((oldavelocity.x - avelocity.x) / timeStep);
76 Double rotyAcceleration = (double) ((oldavelocity.y - avelocity.y) / timeStep);
77 Double rotzAcceleration = (double) ((oldavelocity.z - avelocity.z) / timeStep);
78 Double xAcceleration = (double) (((oldvelocity.x - velocity.x) / timeStep) /
PhysicsGravityScalar)
80 Double yAcceleration = (double) (((oldvelocity.y - velocity.y) / timeStep) /
PhysicsGravityScalar)
82 Double zAcceleration = (double) (((oldvelocity.z - velocity.z) / timeStep) /
PhysicsGravityScalar)
86 rotyAcceleration, rotzAcceleration));
88 oldavelocity.set(avelocity);
89 oldvelocity.set(velocity);
106 if (dh.getCurrentTaskSpaceTransform().getZ() < minz) {
107 minz = dh.getCurrentTaskSpaceTransform().getZ();
110 for (
CSG c : baseCad) {
111 if (c.getMinZ() < minz) {
114 if (c.getMaxZ() > Maxz) {
119 Transform start =
new Transform();
124 start.origin.z = (float) (start.origin.z - minz +
lift);
125 Platform.runLater(
new Runnable() {
151 body.setWorldTransform(start);
153 core.
add(baseManager);
157 RigidBody lastLink = body;
158 Matrix previousStep =
null;
162 List<TransformNR> cached = cachedStart.stream().collect(Collectors.toList());
168 ArrayList<CSG> thisLinkCad =
simplecad.get(conf);
169 if (thisLinkCad !=
null && thisLinkCad.size() > 0) {
187 Affine manipulator =
new Affine();
193 localLink = cached.get(i - 1);
195 localLink = limbRoot.
copy();
200 Transform linkLoc =
new Transform();
202 linkLoc.origin.z = (float) (linkLoc.origin.z - minz +
lift);
206 Platform.runLater(
new Runnable() {
215 ArrayList<CSG> outCad =
new ArrayList<>();
216 ArrayList<CSG> collisions =
new ArrayList<>();
217 for (
int x = 0; x < thisLinkCad.size(); x++) {
218 Color color = thisLinkCad.get(x).getColor();
219 CSG cad = thisLinkCad.get(x);
246 linkSection.setActivationState(
247 com.bulletphysics.collision.dispatch.CollisionObject.DISABLE_DEACTIVATION);
251 HingeConstraint joint6DOF;
252 Transform localA =
new Transform();
253 Transform localB =
new Transform();
254 localA.setIdentity();
255 localB.setIdentity();
269 joint6DOF =
new HingeConstraint(lastLink, linkSection, localA, localB);
273 lastLink = linkSection;
280 public void onLinkPositionUpdate(
AbstractLink source,
double engineeringUnitsValue) {
283 hingePhysicsManager.
setTarget(Math.toRadians(-engineeringUnitsValue));
300 public double compute(
double currentState,
double target,
double seconds) {
301 double error = target - currentState;
302 return (error / seconds) * (seconds * 10);
310 core.
add(hingePhysicsManager);
311 linkSection.setWorldTransform(linkLoc);
static ArrayList< CSG > getBaseCad(MobileBase device)
void setBaseCSG(List< CSG > baseCSG)
RigidBody getFallRigidBody()
static CSG getBoundingBox(CSG incoming)
void setUpdateManager(IPhysicsUpdate updateManager)
static void setMuscleStrength(float ms)
void setConstraint(HingeConstraint constraint)
void setController(IClosedLoopController controller)
void setTarget(double target)
IPhysicsUpdate getUpdater(RigidBody body, IMU base)
static final float PhysicsGravityScalar
static final float LIFT_EPS
MobileBasePhysicsManager(MobileBase base, ArrayList< CSG > baseCad, HashMap< LinkConfiguration, ArrayList< CSG >> simplecad)
ArrayList< ILinkListener > linkListeners
HashMap< LinkConfiguration, ArrayList< CSG > > simplecad
MobileBasePhysicsManager(MobileBase base, ArrayList< CSG > baseCad, HashMap< LinkConfiguration, ArrayList< CSG >> simplecad, PhysicsCore core)
void add(IPhysicsManager manager)
DiscreteDynamicsWorld getDynamicsWorld()
AbstractLink getAbstractLink(int index)
TransformNR getFiducialToGlobalTransform()
LinkConfiguration getLinkConfiguration(int linkIndex)
double[] getCurrentJointSpaceVector()
TransformNR getRobotToFiducialTransform()
TransformNR forwardOffset(TransformNR t)
abstract double getCurrentPosition()
double getMinEngineeringUnits()
double getMaxEngineeringUnits()
void addLinkListener(ILinkListener l)
ArrayList< TransformNR > getCachedChain()
ArrayList< DHLink > getLinks()
Matrix DhStepInverseRotory(double rotory)
Matrix DhStepInversePrismatic(double prismatic)
TransformNR forwardKinematics(double[] jointSpaceVector)
ArrayList< DHParameterKinematics > getAllDHChains()
void setFiducialToGlobalTransform(TransformNR globe)
void setVirtualState(IMUUpdate virtualState)
static void wait(int time)
CSG transformed(Transform transform)
CSG setManipulator(Affine manipulator)
static CSG hullAll(CSG... csgs)
CSG setColor(Color color)