Page 1 of 1

Cannot play the animation after inverse kinematics succeed ,even by loading the mot file obtained from the inversion

Posted: Thu Sep 12, 2024 1:07 am
by chenkaisjtu
Helle, everyone!

I'm having problems using the MobL_ARMS_unimanual model in Upper Extremity Dynamic Model. I have changed the osim file of the model (including range limits and marker point locations).

In some cases this works, but in some cases, after I successfully run the inverse kinematics tool, the inverse solved gesture motion actions do not show up under motion. I also tried loading the mot file obtained from the inverse solution via load_motion, but again the model is stuck. The modified model and trc, xml, mot files have been added in the appendix. Very much looking forward for someone to solve my problem! Thanks!

Re: Cannot play the animation after inverse kinematics succeed ,even by loading the mot file obtained from the inversion

Posted: Thu Sep 12, 2024 11:25 pm
by chenkaisjtu
I can see the red cross in the right below of the messages window.

A java.lang.ArithmeticException exception has occurred.

Detailed error message:

java.lang.ArithmeticException: / by zero
at org.opensim.threejs.ModelVisualizationJson.calculateWrapPointsToVisualzerPointsMapping(ModelVisualizationJson.java:1843)
at org.opensim.threejs.ModelVisualizationJson.updatePathWithWrapping(ModelVisualizationJson.java:1505)
at org.opensim.threejs.ModelVisualizationJson.appendToFrame(ModelVisualizationJson.java:816)
at org.opensim.threejs.ModelVisualizationJson.createFrameMessageJson(ModelVisualizationJson.java:735)
at org.opensim.view.pub.ViewDB.updateModelDisplayNoRepaint(ViewDB.java:876)
at org.opensim.view.motions.MasterMotionModel.doUpdateAndRepaint(MasterMotionModel.java:83)
at org.opensim.view.motions.MasterMotionModel.applyTime(MasterMotionModel.java:99)
at org.opensim.view.motions.MasterMotionModel.setTime(MasterMotionModel.java:290)
at org.opensim.view.motions.MotionControlJPanel.update(MotionControlJPanel.java:692)
at java.util.Observable.notifyObservers(Observable.java:159)
at org.opensim.view.motions.MotionsDB.setCurrent(MotionsDB.java:267)
at org.opensim.view.motions.MotionsDB.addMotion(MotionsDB.java:238)
at org.opensim.view.motions.MotionsDB.loadMotionStorage(MotionsDB.java:160)
at org.opensim.view.motions.MotionsDB.loadMotionFile(MotionsDB.java:146)
at org.opensim.view.motions.FileLoadMotionMenuAction.loadMotion(FileLoadMotionMenuAction.java:80)
at org.opensim.view.motions.FileLoadMotionMenuAction.performAction(FileLoadMotionMenuAction.java:52)
at org.openide.util.actions.CallableSystemAction$1.run(CallableSystemAction.java:105)
at org.openide.util.actions.ActionInvoker$1.run(ActionInvoker.java:70)
at org.openide.util.actions.ActionInvoker.doPerformAction(ActionInvoker.java:91)
at org.openide.util.actions.ActionInvoker.invokeAction(ActionInvoker.java:74)
at org.openide.util.actions.CallableSystemAction.actionPerformed(CallableSystemAction.java:102)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:882)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:926)
at java.awt.Component.processMouseEvent(Component.java:6539)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6304)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
[catch] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Re: Cannot play the animation after inverse kinematics succeed ,even by loading the mot file obtained from the inversion

Posted: Fri Sep 13, 2024 9:20 am
by aymanh
Hello,

Looking at the code/line where the exception occurs, it seems to be a corner case where the wrapping algorithm reports that a wrapping has occurred but also reports no actual wrap points. It's an internal inconsistency between the core libraries and the application/GUI that we need to account for. This likely happens for muscles with too many wrap objects that result in scenarios we don't typically encounter (e.g. muscles with more than a couple wrap objects) I'll try to dig deeper into this in the meantime you may be able to get around it by skipping the frame(s) where this error is reported or splitting the motion into sections to zone in on the problem frame(s).

Thanks for reporting,
-Ayman

Re: Cannot play the animation after inverse kinematics succeed ,even by loading the mot file obtained from the inversion

Posted: Fri Sep 13, 2024 10:47 pm
by chenkaisjtu
Hello Ayman,

Thanks for the analysis and answers you gave. Actually, I got the marker position by optitrack acquisition and then solved the individual joint angles inversely by modeling the upper limb. But as I said before, in some cases, after the inverse solution is finished, an entry of the inverse solution will be added at motions in the GUI interface, but when I click on it, it shows No motion in the Motion column of the visualization window, and even if I load the inverse solution mot file, the model doesn't move once it's stuck and I don't know how many segments it needs to be divided into. I don't know how many segments I need to split it into.

Since I want to use this inverse perspective to calculate the kinematic Jacobi matrix and the muscle arm, is this possible? Since I mentioned the gap between the core code and the GUI, can I then remove the muscles from the GUI? Get the joint angle values from the inverse solution, and then go back and compute the moment arm in the model with the muscles?

Thanks for your kind answer!

Best Wishes

Hongyuan Chen

Re: Cannot play the animation after inverse kinematics succeed ,even by loading the mot file obtained from the inversion

Posted: Mon Sep 16, 2024 10:49 am
by aymanh
Hello,

Removing the muscles form the model should be easy though it involves editing the xml file of the model (.osim). You just remove the xml blocks for the corresponding muscles (typically these have the full class names rather than just "Muscle" e.g. "Millard2012EquilibriumMuscle"). If you have no other forces in the model it maybe easier to remove the block for <ForceSet> in it's entirety (both opening and closing tags).

Hope this helps,
-Ayman