From 5a65e3f0a53a46830b95fd60ab85045a240a5b1f Mon Sep 17 00:00:00 2001 From: Ipuch Date: Wed, 5 Mar 2025 09:07:06 -0500 Subject: [PATCH 1/5] center of mass displayed --- bionc/vizualization/pyorerun_interface.py | 8 ++++++-- .../play_with_joints/two_constant_length.py | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/bionc/vizualization/pyorerun_interface.py b/bionc/vizualization/pyorerun_interface.py index 09f461bd..132373bb 100644 --- a/bionc/vizualization/pyorerun_interface.py +++ b/bionc/vizualization/pyorerun_interface.py @@ -51,6 +51,10 @@ def nb_segments(self) -> int: def segments(self) -> tuple["BioncSegment", ...]: return tuple(BioncSegment(s, i) for i, s in enumerate(self.model.segments.values())) + @property + def segment_names_with_mass(self) -> tuple[str, ...]: + return tuple([segment.name for segment in self.model.segments.values() if segment.mass > 0]) + def segment_homogeneous_matrices_in_global(self, q: np.ndarray, segment_index: int) -> np.ndarray: """ Returns a biorbd object containing the roto-translation matrix of the segment in the global reference frame. @@ -63,11 +67,11 @@ def segment_homogeneous_matrices_in_global(self, q: np.ndarray, segment_index: i return transform - def center_of_mass(self, q: np.ndarray) -> np.ndarray: + def centers_of_mass(self, q: np.ndarray) -> np.ndarray: """ Returns the position of the center of mass in the global reference frame """ - pass + return self.model.center_of_mass_position(q[:, None]).squeeze().T @property def nb_ligaments(self) -> int: diff --git a/examples/play_with_joints/two_constant_length.py b/examples/play_with_joints/two_constant_length.py index 89a7218c..1b452d2f 100644 --- a/examples/play_with_joints/two_constant_length.py +++ b/examples/play_with_joints/two_constant_length.py @@ -173,6 +173,16 @@ def main(initial_pose: str = "hanged", show_results: bool = True): all_states=all_states, dynamics=dynamics, ) + + # animation + from pyorerun import PhaseRerun + from bionc.vizualization.pyorerun_interface import BioncModelNoMesh + + prr = PhaseRerun(t_span=time_steps) + model_interface = BioncModelNoMesh(model) + prr.add_animated_model(model_interface, NaturalCoordinates(all_states[: (12 * model.nb_segments), :])) + prr.rerun() + # plot results import matplotlib.pyplot as plt @@ -196,15 +206,6 @@ def main(initial_pose: str = "hanged", show_results: bool = True): plt.legend() plt.show() - # animation - from pyorerun import PhaseRerun - from bionc.vizualization.pyorerun_interface import BioncModelNoMesh - - prr = PhaseRerun(t_span=time_steps) - model_interface = BioncModelNoMesh(model) - prr.add_animated_model(model_interface, NaturalCoordinates(all_states[: (12 * model.nb_segments), :])) - prr.rerun() - if __name__ == "__main__": # main("hanged", show_results=True) From 0cb27e87afe9dd8234813a02a71f5f20c430479c Mon Sep 17 00:00:00 2001 From: Ipuch Date: Wed, 5 Mar 2025 09:15:41 -0500 Subject: [PATCH 2/5] feat: natural coordinates enforced --- bionc/vizualization/pyorerun_interface.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bionc/vizualization/pyorerun_interface.py b/bionc/vizualization/pyorerun_interface.py index 132373bb..dd49f323 100644 --- a/bionc/vizualization/pyorerun_interface.py +++ b/bionc/vizualization/pyorerun_interface.py @@ -1,7 +1,7 @@ import numpy as np from pyorerun.biorbd_components.model_display_options import DisplayModelOptions -from ..bionc_numpy import NaturalVector +from ..bionc_numpy import NaturalVector, NaturalCoordinates from ..bionc_numpy.joints import Joint from ..protocols.biomechanical_model import GenericBiomechanicalModel @@ -71,7 +71,8 @@ def centers_of_mass(self, q: np.ndarray) -> np.ndarray: """ Returns the position of the center of mass in the global reference frame """ - return self.model.center_of_mass_position(q[:, None]).squeeze().T + Q = NaturalCoordinates(q[:, None]) + return self.model.center_of_mass_position(Q).squeeze().T @property def nb_ligaments(self) -> int: From 23694579217e9a85776c6d6bb08e300274e99dd9 Mon Sep 17 00:00:00 2001 From: Pierre Puchaud <40755537+Ipuch@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:28:53 -0500 Subject: [PATCH 3/5] Create pyproject.toml --- pyproject.toml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..0709e30e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,39 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["bionc"] + +[project] +name = "bionc" +version = "0.10.0" +authors = [{name = "Pierre Puchaud", email = "puchaud.pierre@gmail.com"}] +maintainers = [{name = "Pierre Puchaud", email = "puchaud.pierre@gmail.com"}] +description = "Natural Coordinates with python for biomechanics" +license = {file = "LICENSE.md"} +readme = "README.md" +requires-python = ">=3.11" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ] +dependencies = [ + - numpy + - packaging + # "ezc3d", # Not yet available on pypi, use `conda install -c conda-forge ezc3d` + - plotly + - pyorerun + - python >=3.9 + - casadi + - dill + - mesa-libgl-devel-cos7-x86_64 + - pyomeca + - numba + # "biorbd" # Not yet available on pypi, use `conda install -c conda-forge biorbd` + ] +keywords = ["inverse-kinematics", "biomechanics", "multibody-dynamics", "mechanics motion-analysis", "kinesiology", "inverse-dynamics, "cartesian-coordinates", "forward-dynamics", "holonomic-constraints", "natural-coordinates"] + +[project.urls] +homepage = "http://github.com/Ipuch/bionc" From 301c9be74b42c45f57c3d5d9753e31d51d34bc94 Mon Sep 17 00:00:00 2001 From: Ipuch Date: Wed, 5 Mar 2025 09:19:01 -0500 Subject: [PATCH 4/5] fix: toml --- pyproject.toml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0709e30e..18fdaf11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,19 +20,19 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - - numpy - - packaging + "numpy", + "packaging", # "ezc3d", # Not yet available on pypi, use `conda install -c conda-forge ezc3d` - - plotly - - pyorerun - - python >=3.9 - - casadi - - dill - - mesa-libgl-devel-cos7-x86_64 - - pyomeca - - numba + "plotly", + "pyorerun", + "python >=3.9", + "casadi", + "dill", + "mesa-libgl-devel-cos7-x86_64", + "pyomeca", + "numba", # "biorbd" # Not yet available on pypi, use `conda install -c conda-forge biorbd` - ] +] keywords = ["inverse-kinematics", "biomechanics", "multibody-dynamics", "mechanics motion-analysis", "kinesiology", "inverse-dynamics, "cartesian-coordinates", "forward-dynamics", "holonomic-constraints", "natural-coordinates"] [project.urls] From c6bb57cb5214e1fc964766dec754b0171270a196 Mon Sep 17 00:00:00 2001 From: Ipuch Date: Wed, 5 Mar 2025 09:25:39 -0500 Subject: [PATCH 5/5] ok --- pyproject.toml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 18fdaf11..f008ac53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,18 @@ dependencies = [ "numba", # "biorbd" # Not yet available on pypi, use `conda install -c conda-forge biorbd` ] -keywords = ["inverse-kinematics", "biomechanics", "multibody-dynamics", "mechanics motion-analysis", "kinesiology", "inverse-dynamics, "cartesian-coordinates", "forward-dynamics", "holonomic-constraints", "natural-coordinates"] - +keywords = [ + "inverse-kinematics", + "biomechanics", + "multibody-dynamics", + "mechanics", + "motion-analysis", + "kinesiology", + "inverse-dynamics", + "cartesian-coordinates", + "forward-dynamics", + "holonomic-constraints", + "natural-coordinates" +] [project.urls] homepage = "http://github.com/Ipuch/bionc"