Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add Impedance task #100

Merged
merged 42 commits into from
Jan 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
79bc0f7
[mc_tasks] add ImpedanceTask.
mmurooka Dec 5, 2020
0e0b743
[samples] add mc_impedance_controller.
mmurooka Dec 5, 2020
3a10174
[ImpedanceTask] treat delta in impedance equation because it is more …
mmurooka Dec 10, 2020
54d954a
Apply suggestions from code review
mmurooka Dec 10, 2020
21ef564
Apply conflicted suggestions from code review.
mmurooka Dec 10, 2020
b09e5d2
[ImpedanceTask] update for clang-format.
mmurooka Dec 10, 2020
c8b9335
[ImpedanceTask] fix the multiplication order (otherwise build error).
mmurooka Dec 10, 2020
869b35f
[ImpedanceTask] Add json schema
arntanguy Dec 10, 2020
e0ae2d0
[bugfix] Call reset when creating admittance/impedance from YAML
arntanguy Dec 10, 2020
d68d4ea
[ImpedanceTask] add oriScale argument to Constructor.
mmurooka Dec 10, 2020
6938675
[ImpedanceTask] apply low-pass filter to measured wrench.
mmurooka Dec 12, 2020
fef8141
[mc_filter/LowPass] add method to set sampling period.
mmurooka Dec 12, 2020
02364ce
[ImpedanceTask] clamp impedance parameters.
mmurooka Dec 12, 2020
2207ce4
[ImpedanceTask] set limit of compliance delta.
mmurooka Dec 12, 2020
c4497dc
[ImpedanceTask] change the default parameters to the more safe value.
mmurooka Dec 15, 2020
c84d230
[TrajectoryTasks] Return Trajectory samples efficiently
arntanguy Dec 17, 2020
937f8de
[jvrc1] Add fixed-based variant JVRC1Fixed
arntanguy Dec 17, 2020
6f55387
[ImpedanceTask] Improve Impedance sample
arntanguy Dec 17, 2020
92d513c
[BodySensorObserver] Bugfix orthogonality, options for update
arntanguy Dec 21, 2020
340b22c
[ImpedanceTask] Honour target when loading from yaml
arntanguy Dec 21, 2020
aa9f18b
[doc] Add tutorial about sample controllers
arntanguy Dec 21, 2020
f40928c
[doc] Impedance sample requires JVRC1Fixed
arntanguy Dec 21, 2020
91e8932
[ImpedanceTask] Remove redundant call to target
arntanguy Dec 22, 2020
78a5fc4
[ImpedanceTask] Display circle trajectory in sample controller
arntanguy Dec 22, 2020
4d4e252
[ImpedanceTask] set dt of low-pass filter in addToSolver.
mmurooka Jan 5, 2021
c02611c
Fix JVRC1 export for static build
gergondet Jan 6, 2021
9062643
Use allocate_shared for ImpedanceTask loading
gergondet Jan 6, 2021
a0fa610
Rename desired -> target for consistency in the framework
gergondet Jan 6, 2021
3dc43fc
[mc_rtc] Add logging support for sva::ImpedanceVecd
gergondet Jan 7, 2021
23d0a91
[samples/Impedance] Support non-fixed robots
gergondet Jan 7, 2021
3037f48
[ImpedanceTask] Introduce ImpedanceGains
gergondet Jan 7, 2021
f8c165b
[doc] fix typo in list-of-samples.md
mmurooka Jan 7, 2021
4f82a63
[samples/Impedance] Set the correct gains
gergondet Jan 7, 2021
72adb40
Fix linking issue
gergondet Jan 7, 2021
dfa450f
spring() should return the spring parameter
gergondet Jan 7, 2021
712587c
[samples/Impedance] Fix the sample for non-fixed based robots
gergondet Jan 7, 2021
71b04b9
[ImpedanceTask] Set more reasonable default gains
gergondet Jan 7, 2021
35d5cef
add header commnet.
mmurooka Jan 7, 2021
348e16c
[samples/Impedance] update damping parameter to make impedance robust.
mmurooka Jan 7, 2021
a396e59
[ImpedanceTask] Replace the individual gains GUI inputs with a single…
gergondet Jan 8, 2021
d6c9b58
[debian] Avoid clashing install packages when utils use Python 3
gergondet Jan 8, 2021
c467c4b
Revert "[ImpedanceTask] Replace the individual gains GUI inputs with …
gergondet Jan 8, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions debian/libmc-rtc-dev.install
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ usr/include/mc_tasks/api.h
usr/include/mc_tasks/VectorOrientationTask.h
usr/include/mc_tasks/SplineTrajectoryTask.hpp
usr/include/mc_tasks/MomentumTask.h
usr/include/mc_tasks/ImpedanceGains.h
usr/include/mc_tasks/ImpedanceTask.h
usr/include/mc_tasks/lipm_stabilizer/*
usr/include/mc_trajectory/*
usr/include/mc_planning/*
Expand Down
6 changes: 5 additions & 1 deletion debian/python3-mc-rtc.install
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
usr/lib/python3*
usr/lib/python3/dist-packages/mc_control*
usr/lib/python3/dist-packages/mc_rbdyn*
usr/lib/python3/dist-packages/mc_rtc*
usr/lib/python3/dist-packages/mc_solver*
usr/lib/python3/dist-packages/mc_tasks*
11 changes: 11 additions & 0 deletions doc/_data/schemas/ConstraintSet/CompoundJointConstraint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"title": "mc_solver::CompoundJointConstraint",
"description": "Handle compound joint limits (joints whole limits depend on the position of another joint). By default this adds all the compound joints defined in the robot's module.",
"type": "object",
"properties":
{
"type": { "enum": ["compoundJoint"] },
"robot": { "$ref": "/../../common/ConstraintSet_robot.json" }
},
"required": ["type"]
}
39 changes: 39 additions & 0 deletions doc/_data/schemas/MetaTask/ImpedanceTask.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"type": "object",
"title": "mc_tasks::force::ImpedanceTask",
"description": "This task is similar to AdmittanceTask and DampingTask. Unlike those, the robot can adapt to an external force while following a target pose.",
"allOf":
[
{
"$ref": "/../../common/MetaTask_common.json"
},
{
"$ref": "/../../common/MetaTask_surface.json"
},
{
"$ref": "/../../common/SurfaceTransformTask.json"
},
{
"$ref": "/../../common/TrajectoryTaskGeneric.json"
},
{
"properties":
{
"type": { "enum": ["impedance"] },
"weight": { "default": 1000},
"stiffness": { "default": 5 },
"target": { "$ref" : "/../../SpaceVecAlg/PTransformd.json" },
"wrench": { "$ref": "/../../SpaceVecAlg/ForceVecd.json", "description": "<b>Wrench target</b> (desired force-torque)" },
"gains": { "$ref": "/../../common/ImpedanceGains.json", "description": "Impedance gains" },
"completion": { "$ref": "/../../common/completion_wrench.json" }
}
},
{
"properties":
{
"dimWeight": { "$ref": "/../../Eigen/Vector6d.json" }
}
}
],
"required": ["type", "surface"]
}
2 changes: 2 additions & 0 deletions doc/_data/schemas/Observers/BodySensor.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
{
"robot": {"type": "string", "default": "MainRobot", "description": "Name of the robot to observe" },
"updateRobot": { "type": "string", "default": "&lt;robot&gt;", "description": "Name of the robot to update" },
"updatePose": { "type": "boolean", "default": true, "description": "When true updates the real robot base pose" },
"updateVel": { "type": "boolean", "default": true, "description": "When true updates the real robot base velocity" },
"method": { "enum": ["sensor", "control"], "description": "Update from sensor or control values" },
"bodySensor": { "type": "string", "default": "Main body sensor", "description": "Body sensor used to set the floating base state (only used if method=sensor). When empty, the main body sensor will be used."},
"log":
Expand Down
11 changes: 11 additions & 0 deletions doc/_data/schemas/SpaceVecAlg/ImpedanceVecd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"title": "sva::ImpedanceVecd",
"type": "object",
"properties":
{
"angular": { "$ref": "/../../Eigen/Vector3d.json" },
"linear": { "$ref": "/../../Eigen/Vector3d.json" }
},
"required": ["angular", "linear"],
"additionalProperties": false
}
12 changes: 12 additions & 0 deletions doc/_data/schemas/common/ImpedanceGains.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"type": "object",
"title": "mc_tasks::force::ImpedanceGains",
"description": "Impedance gains configuration for mc_tasks::force::ImpedanceTask",
"properties":
{
"mass": { "$ref": "/../../SpaceVecAlg/ImpedanceVecd.json", "description": "Impedance mass parameter represented in the controlled surface" },
"damper": { "$ref": "/../../SpaceVecAlg/ImpedanceVecd.json", "description": "Impedance damper parameter represetnted in the controlled surface" },
"spring": { "$ref": "/../../SpaceVecAlg/ImpedanceVecd.json", "description": "Impedance spring parameter repesented in the controlled surface" },
"wrench": { "$ref": "/../../SpaceVecAlg/ImpedanceVecd.json", "description": "Coefficient-wise gain on the wrench error" }
}
}
3 changes: 3 additions & 0 deletions doc/_data/tutorials.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@
title: Samples
desc: This section explains the sample controllers
tutorials:
-
id: list-of-samples
title: Available sample controllers
-
id: sample-admittance
title: Admittance sample controller
Expand Down
4 changes: 4 additions & 0 deletions doc/_examples/json/ConstraintSet/CompoundJointConstraint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type": "compoundJoint",
"robot": "jvrc1"
}
21 changes: 21 additions & 0 deletions doc/_examples/json/MetaTask/ImpedanceTask.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"type": "impedance",
"surface": "RightGripper",
"target":
{
// Rotation expressed as RPY (in radian)
// May also be expressed as quaternion or rotation matrix
"rotation": [0.0, 0.0, 0.0],
"translation": [0.5, 0.5, 1.0]
},
"wrench":
{
"couple": [0.0, 0.0, 0.0],
"force": [0.0, 0.0, 20.0]
},
"wrenchGain":
{
"couple": [0.0, 0.0, 0.0],
"force": [0.0, 0.0, 0.0005]
}
}
4 changes: 4 additions & 0 deletions doc/_examples/json/SpaceVecAlg/ImpedanceVecd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"angular": [0.0, 0.0, 0.0],
"linear": [0.0, 0.0, 0.0]
}
3 changes: 3 additions & 0 deletions doc/_examples/yaml/ConstraintSet/CompoundJointConstraint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
type: compoundJoint
robot: jvrc1
13 changes: 13 additions & 0 deletions doc/_examples/yaml/MetaTask/ImpedanceTask.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
type: impedance
surface: RightGripper
targetSurface:
robot: ground
surface: AllGround
offset_translation: [0.5, 0.5, 1.2]
offset_rotation: [3.14, 0.0, 0.0]
wrench:
couple: [0.0, 0.0, 0.0]
force: [0.0, 0.0, 20.0]
wrenchGain:
couple: [0.0, 0.0, 0.0]
force: [0.0, 0.0, 0.001]
2 changes: 2 additions & 0 deletions doc/_examples/yaml/SpaceVecAlg/ImpedanceVecd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
angular: [0.0, 0.0, 0.0]
linear: [0.0, 0.0, 0.0]
6 changes: 5 additions & 1 deletion doc/tutorials/introduction/configuration.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@
<td colspan="2">These entries cover most needs you might have</td>
</tr>
{% include mc_rtc_configuration_row.html entry="MainRobot" desc="This entry dictates the main robot used by all controllers. Most interface cannot infer the correct module to use based on the simulation environment so this is the user's responsibility to make sure the two match." example="MainRobot: JVRC1" %}
{% include mc_rtc_configuration_row.html entry="Enabled" desc="Provides a list of enabled controllers." example="Enabled: [Posture, Body6d, CoM]" %}
<tr>
<th scope="row">Enabled</th>
<td>Provides a list of enabled controllers. See the <a href="{{site.baseurl}}/tutorials/samples/list-of-samples.html">list of all available sample controllers</a>.</td>
<td>{% highlight yaml %}Enabled: [Posture, EndEffector, CoM]{% endhighlight %}</td>
</tr>
{% include mc_rtc_configuration_row.html entry="Default" desc="Select which of the enabled controllers will be started first. Note that if the default controller is not enabled or if no default entry is provided then the first enabled controller in the list is chosen as a default controller." example="Default: Posture" %}
{% include mc_rtc_configuration_row.html entry="Timestep" desc="The controller's timestep." example="Timestep: 0.005" %}
{% include mc_rtc_configuration_row.html entry="Log" desc="Dictate whether or not controllers will log their output." example="Log: true" %}
Expand Down
162 changes: 162 additions & 0 deletions doc/tutorials/samples/list-of-samples.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
---
layout: tutorials
toc: true
---

In this page you will find a list of all available sample controllers provided with the framework, along with a brief description of how to run them and what to expect. More complex controllers will be further detailed in their own tutorial page.

# Posture

The `Posture` controller (see [online demonstration](https://mc-rtc-demo.netlify.app/#robot=JVRC1&controller=EndEffector)) is the simplest controller in the framework. It adds the following tasks and constraints to the QP solver.



**Tasks**
- {% doxygen mc_tasks::PostureTask %}:
Make each of the robot's DoF target a given joint position. By default this controller will target the current robot encoder values when available, or the default stance for that robot otherwise ({% doxygen mc_rbdyn::RobotModule::stance() %}). Joints can be moved through the joint sliders in the GUI (`Tasks -> posture_jvrc1 -> Target`).

**Constraints**
- {% doxygen mc_solver::ContactConstraint %}: A controller must always have a contact constraint, but it can have an empty set of contacts.
- {% doxygen mc_solver::KinematicsConstraint %}: Joint limits constraint.
- {% doxygen mc_solver::CollisionsConstraint %}: Self-collision avoidance constraint.
- {% doxygen mc_solver::CompoundJointConstraint %}: Handle joint limits for compound joints (joints whose limits depend on the value of another joint).

**Supported robots**
All [robots]({{site.baseurl}}/robots.html) supported by the framework. Note that for custom robots, all you need to do is define a default set of collision pairs and limits for the `CompoundJointConstraint` if appropriate (see the tutorial on [integrating a new robot]({{site.baseurl}}/tutorials/advanced/new-robot.html)).

**Running**
To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite interface.

```yaml
MainRobot: JVRC1
Enabled: Posture
```

# CoM

The `CoM` sample controller (see [online demonstration](https://mc-rtc-demo.netlify.app/#robot=JVRC1&controller=CoM)) has similar tasks and constraints as the `Posture` controller above.

**Tasks**
- {% doxygen mc_tasks::PostureTask %}: A posture task with low-weight to provide a default target for all joints.
- {% doxygen mc_tasks::CoMTask %}: Task controlling the robot's CoM. By default this controller targets the current task position. You can move this target using the interactive markers in the GUI (rviz).

**Constraints**
- {% doxygen mc_solver::ContactConstraint %}: Adds contacts between the left/right foot and the ground environment.
- {% doxygen mc_solver::DynamicsConstraint %}: In addition to the joint limits constraint provided by the {% doxygen mc_solver::KinematicsConstraint %} this constraint enables computation of the joint torques and friction cones.
- {% doxygen mc_solver::CollisionsConstraint %}: Self-collision avoidance constraint.
- {% doxygen mc_solver::CompoundJointConstraint %}: Handle joint limits for compound joints (joints whose limits depend on the value of another joint).

**Supported robots**
All biped [robots]({{site.baseurl}}/robots.html) supported by the framework. Note that for custom robots, all you need to do is define a `LeftFoot` and `RightFoot` surface in [your robot description]({{site.baseurl}}/tutorials/advanced/new-robot.html).


**Running**
To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite interface.

```yaml
MainRobot: JVRC1
Enabled: CoM
```

# EndEffector

The `EndEffector` controller (see [online demonstration](https://mc-rtc-demo.netlify.app/#robot=JVRC1&controller=EndEffector)) has the same tasks and constraints as the `CoM` controller above. In addition to controlling the CoM position, it adds an {% doxygen mc_tasks::EndEffectorTask %} to control the position and orientation of the robot's hand end-effector.

**Supported robots**
All biped [robots]({{site.baseurl}}/robots.html) supported by the framework. Note that for custom robots, all you need to do is define a `LeftFoot` and `RightFoot` surfaces and an `r_wrist` body in [your robot]({{site.baseurl}}/tutorials/advanced/new-robot.html).

**Running**
To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite interface.

```yaml
MainRobot: JVRC1
Enabled: EndEffector
```

# Text

The `Text` sample controller demonstrate use of the {% doxygen mc_tasks::MetaTasks %} and {% doxygen mc_solver::ConstraintSetLoader %} to load [tasks]({{site.baseurl}}/json.html#MetaTask}} and [constraints]({{site.baseurl}}/json.html#ConstraintSet) from their YAML configuration.

**Running**
To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite interface.

```yaml
MainRobot: JVRC1
Enabled: Text
```

The default configuration for this controller is similar to the `EndEffector` controller. You can try writing your own configuration in `~/.config/mc_rtc/controllers/Text.yaml`. For example, the following configuration re-creates the `CoM` controller and moves the `CoM` above the `LeftFoot` surface:

```yaml
Text:
constraints:
- type: dynamics
- type: contact
- type: collision
- type: compoundJoint
tasks:
- type: com
weight: 1000
above: [LeftFoot]
contacts:
- r1Surface: LeftFoot
r2Surface: AllGround
isFixed: false
- r1Surface: RightFoot
r2Surface: AllGround
isFixed: false
```

# Admittance

The `Admittance` sample controller demonstrates the use of the {% doxygen mc_tasks::force::AdmittanceTask %} though a simple FSM making the `JVRC1` robot push a wall with a desired force.

**Detailed description**: see the [Admittance Sample Controller tutorial]({{site.baseurl}}/tutorials/samples/sample-admittance.html)

**Supported robots**: `JVRC1`.

**Prerequisites**: Please make sure that the hand force sensors have been calibrated beforehand using the [ForceSensorCalibration controller](https://github.com/jrl-umi3218/mc_force_sensor_calibration_controller).

**Running**

To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite dynamic simulation (e.g Choreonoid...).

```yaml
MainRobot: JVRC1
Enabled: Admittance
```

# Impedance

The `Impedance` sample controller demonstrates the use of the {% doxygen mc_tasks::force::ImpedanceTask %} to simulataneously perform position and force control of the robot's end-effector.

**Supported robots**: `JVRC1Fixed`.

**Prerequisites**: Please make sure that the hand force sensors have been calibrated beforehand using the [ForceSensorCalibration controller](https://github.com/jrl-umi3218/mc_force_sensor_calibration_controller).

**Running**

To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite dynamic simulation (e.g Choreonoid...). In choreonoid you can apply external forces by clicking on the moving hand and dragging it. It will follow you to some extent and return to it's expected position along the trajectory when you relase the force. Note that you may add additional {% doxygen mc_tasks::force::ImpedanceTask %} to the free end-effectors throught the GUI (`Global -> Add Tasks -> ImpedanceTask`).

```yaml
MainRobot: JVRC1Fixed
Enabled: Impedance
```

# LIPMStabilizer

The `LIPMStabilizer` sample controller demonstrates the use of the {% doxygen mc_tasks::StabilizerTask %} and its corresponding convenience FSM state {% doxygen mc_state::StabilizerStandingState %} though a simple quasi-static FSM making the robot stand and step while keeping balance.

**Detailed description**: see [the LIPM Stabilizer tutorial]({{site.baseurl}}/tutorials/recipes/lipm-stabilizer.html)

**Supported robots**: All biped [robots]({{site.baseurl}}/robots.html) supported by the framework.

**Running**

To run this controller, simply put in [your mc_rtc configuration]({{site.baseurl}}/tutorials/introduction/configuration.html), and [run the controller]({{site.baseurl}}/tutorials/introduction/running-a-controller.html) using your favorite dynamic simulation (e.g Choreonoid...).

```yaml
MainRobot: JVRC1
Enabled: LIPMStabilizer
```

20 changes: 17 additions & 3 deletions include/mc_filter/LowPass.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@ struct LowPass
reset(T::Zero());
}

/** Get cutoff period.
*
*/
/** Get cutoff period. */
double cutoffPeriod() const
{
return cutoffPeriod_;
Expand Down Expand Up @@ -87,11 +85,27 @@ struct LowPass
return eval_;
}

/** Get sampling period.
*
*/
double dt() const
{
return dt_;
}

/** Set sampling period.
*
* \param dt Sampling period.
*
* \note the cutoff period is updated to satisfy the Nyquist–Shannon sampling theorem according the new sampling
* period.
*/
void dt(double dt)
{
dt_ = dt;
cutoffPeriod(cutoffPeriod_);
}

private:
T eval_;
double cutoffPeriod_ = 0.;
Expand Down
2 changes: 2 additions & 0 deletions include/mc_observers/BodySensorObserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ struct MC_OBSERVER_DLLAPI BodySensorObserver : public Observer
sva::MotionVecd accW_ = sva::MotionVecd::Zero();
std::string robot_;
std::string updateRobot_;
bool updatePose_ = true;
bool updateVel_ = true;

bool logPos_ = true;
bool logVel_ = true;
Expand Down
1 change: 1 addition & 0 deletions include/mc_rtc/log/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ IMPL_MAPPING(Eigen::Quaterniond, Quaterniond);
IMPL_MAPPING(sva::PTransformd, PTransformd);
IMPL_MAPPING(sva::ForceVecd, ForceVecd);
IMPL_MAPPING(sva::MotionVecd, MotionVecd);
IMPL_MAPPING(sva::ImpedanceVecd, MotionVecd);

#undef IMPL_MAPPING

Expand Down
Loading