97#include "sfh/timers/Timer.h"
100#include <Eigen/Geometry>
102#include <fhsim/simobject/SimObject.h>
121 CBall(std::string simObjectName, ISimObjectCreator* creator);
125#ifdef FH_VISUALIZATION
128 virtual void RenderInit(Ogre::Root*
const OgreRoot, ISimObjectCreator*
const creator);
131 virtual void RenderUpdate(
const double T,
const double*
const X);
145 void OdeFcn(
const double T,
const double*
const X,
double*
const XDot)
const;
147 bool HasJacobians()
const override;
148 void OdeJacobian(
double T,
const double* X,
double* J,
int nStates)
override;
149 int GetJacobianSparsity(
int nStates,
int* rowPtr,
int* colIdx)
override;
160 const double*
ForceOut(
const double T,
const double*
const X);
172 void CalcForces(
const double T,
const double*
const X)
const;
192 void AddWallStiffness(
const double T,
const double*
const X, Eigen::MatrixXd& forceJacobian)
const;
210 void BoxPlanes(
const double T,
const double*
const X, Eigen::Vector3d norms[6],
211 Eigen::Vector3d planePositions[6])
const;
230 virtual const double*
Position(
const double T,
const double*
const X);
239 virtual const double*
Velocity(
const double T,
const double*
const X);
267 mutable double m_outForce[3];
270#ifdef FH_VISUALIZATION
271 std::string m_material;
272 std::string m_meshName;
274 Ogre::SceneManager* m_sceneMgr;
275 std::vector<Ogre::SceneNode*> m_renderNodes;
276 std::vector<Ogre::Entity*> m_renderEntities;
void LatchPlaneSide(int pl, double s) const
Fixes m_planeSide[pl] from the signed distance s to the wall at the first evaluation.
Eigen::VectorXd m_interForces
3-DOF force acting on each ball i (col(F_i)) from the box. [N]
Definition CBall.h:251
void CalcForces(const double T, const double *const X) const
Calculates contact forces between balls and box.
void OdeFcn(const double T, const double *const X, double *const XDot) const
Cleans up dynamically allocated memory.
virtual const double * Velocity(const double T, const double *const X)
Returns the position of the balls.
void ForceInterBall(const double T, const double *const X) const
Calculates contact forces between the balls.
const double * ForceOut(const double T, const double *const X)
Returns the force acting from the balls on the box.
CBall(std::string simObjectName, ISimObjectCreator *creator)
Reads parameters, registers states, input/output ports and shared resources.
void BoxPlanes(const double T, const double *const X, Eigen::Vector3d norms[6], Eigen::Vector3d planePositions[6]) const
int m_iStatePos
Orientation of the box, Euler angles, x,y,z [rad].
Definition CBall.h:255
Eigen::VectorXd m_forces
Side of the plane, relative normal std::vector (-1: inside, 1: outside, else: undef)
Definition CBall.h:250
void AddWallStiffness(const double T, const double *const X, Eigen::MatrixXd &forceJacobian) const
ISignalPort * m_inBoxPos
3-DOF force acting between each ball i (col(F_i)). [N]
Definition CBall.h:253
double * m_radius
The masses of the balls. [kg].
Definition CBall.h:245
double m_gravity
Number of balls [#].
Definition CBall.h:243
bool IsWallContact(int pl, double s, double dL, double radius) const
Eigen::Vector3d m_norms[6]
The dimensions of the box Lx, Ly, Lz [m].
Definition CBall.h:248
int LocalIndex(int globalStateIndex) const
The index of the velocity state.
Definition CBall.h:265
double * m_mass
The gravity (assumed along z-axis) [kgms^-2].
Definition CBall.h:244
double m_boxDim[3]
The linear stiffnesses of the ball. [N/m].
Definition CBall.h:247
int m_planeSide[6]
Array of box unit normal vectors [-].
Definition CBall.h:249
double * m_stiffness
The radii of the balls. [m].
Definition CBall.h:246
void AddInterBallStiffness(const double *const X, Eigen::MatrixXd &forceJacobian) const
int m_iStateVel
The index of the position state.
Definition CBall.h:256
ISignalPort * m_inBoxRot
Centroid of the box [m].
Definition CBall.h:254
virtual const double * Position(const double T, const double *const X)
Returns the velocity of the balls.