Comments (12)
- First we need to understand how it was implemented in HDEv1 (@claudia-lat mentioned that @lucaTagliapietra implemented a state space filter )
The approach used in the past for computing joint velocities and joint accelerations are explained below.
joint velocities ($\dot{q}$ )
(ref https://github.com/robotology/human-dynamics-estimation/blob/master/human-state-provider/src/HumanIKWorkerPool.cpp#L95)
The joint velocities are computed in the human-state-provider
pairwised (in each thread we compute the joint acceleration for the i-th multi-dimensional joint
So for each couple of links we have:
- joint state for i-th multi-dimensional joint (
$q_i$ ) ($q_i \in \mathbb{R}^3$ for spherical joints) - parent/child link velocity (
$\mathcal{v}_p$ ,$\mathcal{v}_c$) - human model
The velocity is then computed with the following step:
- get the relative Jacobian for the two links given the model and the current joint configuration ($J_i(q_i)$).
- compute the relative velocity between parent and child link as:
$$
\mathcal{v}_i = \mathcal{v}_c - \mathcal{v}_p
$$ - from the definition of the jacobian, we can pseudo-invert it in order to compute the joints velocities for the i-th angle.
$$
\mathcal{v}_i = J_i \dot{q}_i \\
\to \dot{q}_i=J_i^{\dagger} \mathcal{v}_i
$$
Joint accelerations ($\ddot{q}$ )
(ref 789f3cd)
The joint acceleration was estimated directly in the human-dynamics-estimator
by filtering the joints velocity data (
The filter used is the one in https://github.com/RealTimeBiomechanics/Filter, and a reference paper on that is https://www.researchgate.net/publication/238835613_Accurate_derivative_estimation_from_noisy_data_a_state-space_approach.
from human-dynamics-estimation.
Nice @lrapetti. Let's talk F2F about this. Another possibility may be that using all the angular velocity measurements stuck together and do a whole body least square. Probably, this could also lead to another way to get human joint angles through a sort of integration based IK plus proper initialisation
from human-dynamics-estimation.
Joint accelerations (
$\ddot{q}$ )...
The filter used is the one in https://github.com/RealTimeBiomechanics/Filter, and a reference paper on that is https://www.researchgate.net/publication/238835613_Accurate_derivative_estimation_from_noisy_data_a_state-space_approach.
I would be glad, when the time comes, to try integrating in that filter the model-based direct link acceleration computation (without numerical derivation) I've been working on. We could get the joint accelerations with a small change in that computation, or just using the same approach as for the velocities:
$$
\begin{align}
a_i = a_c - a_p \newline
a_i - \dot{J}_i \dot{q}_i = J_i \ddot{q}_i \newline
\ddot{q}_i = J_i^{\dagger} \left( a_i - \dot{J}_i \dot{q}_i \right) \newline
\end{align}
$$
where the relative jacobian with respect to joint
Btw, @lrapetti do you have a copy of that paper? I've requested the full-text but it could be long to get an answer..
from human-dynamics-estimation.
@nunoguedelha
Yes, what I meant is given basically what you wrote above. More precisely, what I was suggesting for human joint velocity and position estimation is:
- Perform nonlinear optimisation to get
$q_0$ - Obtain human velocities from least squares, i.e.
$\nu = J^{\dagger}\omega$ , where$\omega$ is a vector stacking all angular velocities measured from the sensors -
Smart integrate
$\nu$ using$q_0$ obtained in (1 as initialisation to get$q(t)$ . Here, correction terms that depend on obtained (from integration) and measured rotation matrixes are fundamental to be added. So, the integration will integrate$\nu = J^{\dagger}(\omega + \text{correctionTerms})$
This is something that it is basically already in place for the walking controllers (integration based IK) and even at the simulink level
CC
@lrapetti @GiulioRomualdi @gabrielenava @kouroshD
from human-dynamics-estimation.
- See what information is needed from the xsens suit through wearables here
All the information used in the previous version is still available. We can see that from the xsens suit we are still getting the (virtual) links velocities (https://github.com/Yeshasvitvs/wearables/blob/master/devices/XsensSuit/src/XsensSuit.cpp#L479).
from human-dynamics-estimation.
I think as a first instance we can implement joint velocities as in the previous implementation. As for the joint acceleration, currently, we are not using them as an input of the Berdy algorithm so there is no need to compute them (but it may be useful in the future).
from human-dynamics-estimation.
I did a preliminary implementation in https://github.com/Yeshasvitvs/human-dynamics-estimation/commit/7e2978b71ea9e5b44173abf8cf0113e439cdf34c. I see the joint velocities are streamed, we should check if the values obtained are acceptable (we could compare it with the offline estimation).
computeJointVelocities()
was actually already implemented when porting the WarkerPool
from the old implementation, but the link velocities were all set to zero and that's why we were computing zero joint velocities. In my commit, I have implemented the reading of link velocities data (getLinkVelocityFromInputData()
) and I am passing the computed joint velocities from the WalkerPool
to the output.
Concerning the velocity of the floating base link, I am directly using the velocity given by the Xsens (see solution.baseVelocity
).
from human-dynamics-estimation.
I guess this is partially related to @nunoguedelha's work.
from human-dynamics-estimation.
Nice @lrapetti. Let's talk F2F about this. Another possibility may be that using all the angular velocity measurements stuck together and do a whole body least square. Probably, this could also lead to another way to get human joint angles through a sort of integration based IK plus proper initialisation
Probably that's what you meant, but it can still be a linear least-squares, i.e a pseudo-inverse for the whole body (just the joints, so excluding the floating base). I mean, we can formulate the problem having a vector
$$
\dot{q} = J^{\dagger} v
$$
from human-dynamics-estimation.
or just using the same approach as for the velocities:
$$
\begin{align}
a_i = a_c - a_p \newline
a_i - \dot{J}_i \dot{q}_i = J_i \ddot{q}_i \newline
\ddot{q}_i = J_i^{\dagger} \left( a_i - \dot{J}_i \dot{q}_i \right) \newline
\end{align}
$$
I was thinking the same. It may be worth to try to use the same approach for the aceleration (it should come out quite easy to be tested).
from human-dynamics-estimation.
I just forgot to mention that in (10) (11) and (12) the
from human-dynamics-estimation.
What I was suggesting above is being implemented in #226.
Closing.
from human-dynamics-estimation.
Related Issues (20)
- [HumanLogger] Logger silently failing to save file when attach device not found HOT 15
- Remove teleoperation models for icub2.5 and icub3 HOT 2
- Remove implementation of both IWrapper and IMultipleWrapper from devices HOT 2
- Add joint information to HumanLogger HOT 2
- Migrate MacOS CI from homebrew to conda HOT 2
- Human Logger not terminating when directory not created HOT 3
- [HumanLogger] logger not starting because interface is not ready HOT 2
- Replace usage of `analogServer` HOT 17
- Change Wrapper/Remapper naming convention to `nws`/`nwc` HOT 2
- Add status information to `IHumanState`, `IHumanDynamics` and `IHumanWrench`
- Implement HumanWrenchWrapper and HumanWrenchRemapper devices HOT 1
- HumanControlBoard fails to attach to iHumanState HOT 2
- HumanStateVisualizer is stuck waiting data from HumanStateWrench HOT 2
- CI failing on Windows HOT 3
- Release human-dynamics-estimation v3.0.0 HOT 2
- Add video recording in HumanLogger HOT 1
- cannot set `useDirectBaseMeasurement` to true HOT 1
- Compilation failure with ``yarp`` 3.10
- RViz crashes when launched by yarpmanager
- Re-enable macos and Windows CI April 2024 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from human-dynamics-estimation.