bionc/utils/casadi_utils.py
from casadi import MX, SX, Function, nlpsol
import numpy as np
def _mx_to_sx(mx: MX, symbolics: list[MX]) -> SX:
"""
Converts a MX to a SX
Parameters
----------
mx : MX
The MX to convert
symbolics : list[MX]
The symbolics to use
Returns
-------
The converted SX
"""
f = Function("f", symbolics, [mx]).expand()
return f(*symbolics)
def _solve_nlp(method: str, nlp: dict, Q_init: np.ndarray, lbg: np.ndarray, ubg: np.ndarray, options: dict):
"""
Solves a nonlinear program with CasADi
Parameters
----------
method : str
The method to use to solve the NLP (ipopt, sqpmethod, ...)
nlp : dict
The NLP to solve
Q_init : np.ndarray
The initial guess
lbg : np.ndarray
The lower bound of the constraints
ubg : np.ndarray
The upper bound of the constraints
options : dict
The options to pass to the solver
Returns
-------
The output of the solver
"""
S = nlpsol("InverseKinematics", method, nlp, options)
r = S(x0=Q_init, lbg=lbg, ubg=ubg)
if S.stats()["success"] is False:
print("Inverse Kinematics failed to converge")
return r, S.stats()["success"]
def sarrus(matrix: MX):
"""
Computes the determinant of a 3x3 matrix using the Sarrus rule
Parameters
----------
matrix : MX
The matrix to compute the determinant of
Returns
-------
The determinant of the matrix
"""
return (
matrix[0, 0] * matrix[1, 1] * matrix[2, 2]
+ matrix[0, 1] * matrix[1, 2] * matrix[2, 0]
+ matrix[0, 2] * matrix[1, 0] * matrix[2, 1]
- matrix[0, 0] * matrix[1, 2] * matrix[2, 1]
- matrix[0, 1] * matrix[1, 0] * matrix[2, 2]
- matrix[0, 2] * matrix[1, 1] * matrix[2, 0]
)