Skip to content

Commit 3dbd27b

Browse files
authored
Merge pull request #4 from manumerous/feature/external-torque-cost
External torque cost
2 parents 2fb7b95 + fad33d4 commit 3dbd27b

File tree

18 files changed

+368
-224
lines changed

18 files changed

+368
-224
lines changed

.github/workflows/build_test.yml

+14-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
name: Build Tests
1+
name: Full Install & Build Tests
22

33
on:
44
push:
55
branches:
66
- master
77
pull_request:
88
branches:
9-
- "*"
9+
- '**' # double asterisk matches any branch
10+
types: [opened, synchronize, reopened]
1011

1112
jobs:
1213
build:
@@ -30,15 +31,20 @@ jobs:
3031
restore-keys: |
3132
${{ runner.os }}-apt-
3233
33-
- name: Install Dependencies
34+
- name: Install Base Dependencies
3435
run: |
3536
sudo apt-get update && sudo apt-get upgrade -y
36-
# Install dependencies listed in dependencies.txt
37-
# Make sure dependencies.txt is at the root of your repo or update the path accordingly
38-
xargs -a dependencies.txt sudo apt-get install -y
37+
sudo apt-get update && apt-get install -y --no-install-recommends \
38+
curl gnupg2 lsb-release software-properties-common \
39+
locales \
40+
git \
41+
x11-apps \
42+
mesa-utils \
43+
gettext-base
3944
40-
# Install additional ROS packages
41-
sudo apt-get install -y ros-jazzy-ament-cmake-clang-format ros-jazzy-joint-state-publisher-gui ros-jazzy-xacro ros-jazzy-mcap-vendor ros-jazzy-interactive-markers
45+
- name: Install Project Dependencies
46+
run: |
47+
envsubst < dependencies.txt | xargs sudo apt-get install -y --no-install-recommends
4248
4349
- name: Initialize submodules
4450
run: |

humanoid_nmpc/humanoid_centroidal_mpc/src/CentroidalMpcInterface.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,6 @@ void CentroidalMpcInterface::setupOptimalControlProblem() {
205205
problemPtr_->softConstraintPtr->add(footName + "_frictionForceCone", factory.getFrictionForceConeConstraint(i));
206206
problemPtr_->softConstraintPtr->add(footName + "_contactMomentXY",
207207
factory.getContactMomentXYConstraint(i, footName + "_contact_moment_XY_constraint"));
208-
problemPtr_->equalityConstraintPtr->add(footName + "_contactMomentZ",
209-
factory.getContactMomentZConstraint(i, footName + "_contact_moment_Z_constraint"));
210208
problemPtr_->equalityConstraintPtr->add(footName + "_zeroWrench", factory.getZeroWrenchConstraint(i));
211209
problemPtr_->equalityConstraintPtr->add(footName + "_zeroVelocity", getStanceFootConstraint(*eeKinematicsPtr, i));
212210
problemPtr_->equalityConstraintPtr->add(footName + "_normalVelocity", getNormalVelocityConstraint(*eeKinematicsPtr, i));
@@ -219,6 +217,7 @@ void CentroidalMpcInterface::setupOptimalControlProblem() {
219217
problemPtr_->costPtr->add(footTrackingCostName, std::unique_ptr<StateInputCost>(new CentroidalMpcEndEffectorFootCost(
220218
*referenceManagerPtr_, footTrackingCostWeights, *pinocchioInterfacePtr_,
221219
*mpcRobotModelADPtr_, i, footTrackingCostName, modelSettings_)));
220+
problemPtr_->costPtr->add(footName + "_ExternalTorqueQuadraticCost", factory.getExternalTorqueQuadraticCost(i));
222221
}
223222

224223
// Pre-computation

humanoid_nmpc/humanoid_common_mpc/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ add_library(${PROJECT_NAME}
8282
src/constraint/EndEffectorKinematicsTwistConstraint.cpp
8383
src/constraint/FrictionForceConeConstraint.cpp
8484
src/constraint/ContactMomentXYConstraintCppAd.cpp
85-
src/constraint/ContactMomentZConstraint.cpp
8685
src/constraint/EndEffectorKinematicsLinearVelConstraint.cpp
8786
src/cost/StateInputQuadraticCost.cpp
8887
src/cost/EndEffectorKinematicCostHelpers.cpp
8988
src/cost/EndEffectorKinematicsQuadraticCost.cpp
89+
src/cost/ExternalTorqueQuadraticCostAD.cpp
9090
src/command/TargetTrajectoriesCalculatorBase.cpp
9191
src/gait/Gait.cpp
9292
src/gait/GaitSchedule.cpp

humanoid_nmpc/humanoid_common_mpc/include/humanoid_common_mpc/HumanoidCostConstraintFactory.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ class HumanoidCostConstraintFactory {
7272

7373
std::unique_ptr<StateInputCost> getContactMomentXYConstraint(size_t contactPointIndex, const std::string& name) const;
7474

75-
std::unique_ptr<StateInputConstraint> getContactMomentZConstraint(size_t contactPointIndex, const std::string& name) const;
76-
7775
std::unique_ptr<StateInputConstraint> getZeroWrenchConstraint(size_t contactPointIndex) const;
7876

7977
std::unique_ptr<StateInputCost> getFrictionForceConeConstraint(size_t contactPointIndex) const;
8078

79+
std::unique_ptr<StateInputCost> getExternalTorqueQuadraticCost(size_t contactPointIndex) const;
80+
8181
private:
8282
std::string taskFile_;
8383
std::string referenceFile_;

humanoid_nmpc/humanoid_common_mpc/include/humanoid_common_mpc/HumanoidPreComputation.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class HumanoidPreComputation : public PreComputation {
6868
protected:
6969
HumanoidPreComputation(const HumanoidPreComputation& rhs);
7070

71-
void updatePinocchioFramePlacements(const vector_t& generalizedCoordinates);
71+
void updatePinocchioModelKinematics(const vector_t& generalizedCoordinates);
7272

7373
PinocchioInterface pinocchioInterface_;
7474
const SwingTrajectoryPlanner* swingTrajectoryPlannerPtr_;
+44-28
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/******************************************************************************
2-
Copyright (c) 2024, 1X Technologies. All rights reserved.
2+
Copyright (c) 2025, Manuel Yves Galliker. All rights reserved.
33
44
Redistribution and use in source and binary forms, with or without
55
modification, are permitted provided that the following conditions are met:
@@ -29,51 +29,67 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929

3030
#pragma once
3131

32-
#include <ocs2_core/constraint/StateInputConstraintCppAd.h>
32+
#include <ocs2_core/cost/StateInputGaussNewtonCostAd.h>
3333
#include <ocs2_pinocchio_interface/PinocchioInterface.h>
34+
#include <ocs2_robotic_tools/end_effector/EndEffectorKinematics.h>
35+
#include <pinocchio/algorithm/frames.hpp>
3436

3537
#include "humanoid_common_mpc/common/ModelSettings.h"
3638
#include "humanoid_common_mpc/common/MpcRobotModelBase.h"
37-
#include "humanoid_common_mpc/common/Types.h"
3839
#include "humanoid_common_mpc/reference_manager/SwitchedModelReferenceManager.h"
3940

41+
#include "humanoid_common_mpc/cost/EndEffectorKinematicCostHelpers.h"
42+
4043
namespace ocs2::humanoid {
4144

42-
class ContactMomentZConstraint final : public StateInputConstraintCppAd {
45+
class ExternalTorqueQuadraticCostAD : public ocs2::StateInputCostGaussNewtonAd {
4346
public:
44-
/*
45-
* Constructor
46-
* @param [in] referenceManager : Switched model ReferenceManager.
47-
* @param [in] contactPointIndex : The 3 DoF contact index.
48-
*/
49-
ContactMomentZConstraint(const SwitchedModelReferenceManager& referenceManager,
50-
const PinocchioInterface& pinocchioInterface,
51-
const MpcRobotModelBase<ad_scalar_t>& mpcRobotModel,
52-
size_t contactPointIndex,
53-
std::string costName,
54-
const ModelSettings& modelSettings);
55-
56-
~ContactMomentZConstraint() override = default;
57-
ContactMomentZConstraint* clone() const override { return new ContactMomentZConstraint(*this); }
47+
struct Config {
48+
std::vector<std::string> activeJointNames;
49+
vector_t weights;
50+
};
51+
52+
ExternalTorqueQuadraticCostAD(size_t endEffectorIndex,
53+
Config config,
54+
const SwitchedModelReferenceManager& referenceManager,
55+
const PinocchioInterface& pinocchioInterface,
56+
const MpcRobotModelBase<ad_scalar_t>& mpcRobotModelAD,
57+
const ModelSettings& modelSettings);
58+
59+
~ExternalTorqueQuadraticCostAD() override = default;
60+
ExternalTorqueQuadraticCostAD* clone() const override { return new ExternalTorqueQuadraticCostAD(*this); }
61+
62+
virtual vector_t getParameters(scalar_t time,
63+
const TargetTrajectories& targetTrajectories,
64+
const PreComputation& preComputation) const override;
5865

5966
bool isActive(scalar_t time) const override;
60-
void setActive(bool active) override { isActive_ = active; }
61-
bool getActive() const override { return isActive_; }
62-
size_t getNumConstraints(scalar_t time) const override { return n_constraints; }
67+
void setActive(bool active) { isActive_ = active; }
68+
bool getActive() const { return isActive_; }
6369

64-
private:
65-
ContactMomentZConstraint(const ContactMomentZConstraint& rhs);
70+
void getWeights(vector_t& weights) const { weights = sqrtWeights_.cwiseProduct(sqrtWeights_); }
71+
void setWeights(const vector_t& weights) { sqrtWeights_ = weights.cwiseSqrt(); }
6672

67-
ad_vector_t constraintFunction(ad_scalar_t time,
73+
static ExternalTorqueQuadraticCostAD::Config loadConfigFromFile(const std::string& filename,
74+
const std::string& fieldname,
75+
bool verbose = true);
76+
77+
protected:
78+
ExternalTorqueQuadraticCostAD(const ExternalTorqueQuadraticCostAD& other);
79+
80+
ad_vector_t costVectorFunction(ad_scalar_t time,
6881
const ad_vector_t& state,
6982
const ad_vector_t& input,
70-
const ad_vector_t& parameters) const override;
83+
const ad_vector_t& parameters) override;
7184

85+
const size_t contactPointIndex_;
86+
const pinocchio::FrameIndex frameID_;
87+
const size_t n_parameters_;
88+
vector_t sqrtWeights_;
89+
const std::vector<std::string> activeJointNames_;
7290
const SwitchedModelReferenceManager* referenceManagerPtr_;
7391
PinocchioInterfaceCppAd pinocchioInterfaceCppAd_;
74-
const MpcRobotModelBase<ad_scalar_t>* mpcRobotModelPtr_;
75-
const size_t contactPointIndex_;
76-
static const int n_constraints = 1;
92+
const std::unique_ptr<MpcRobotModelBase<ad_scalar_t>> mpcRobotModelADPtr;
7793
bool isActive_ = true;
7894
};
7995

humanoid_nmpc/humanoid_common_mpc/src/HumanoidCostConstraintFactory.cpp

+18-11
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4646
#include <humanoid_common_mpc/cost/StateInputQuadraticCost.h>
4747
#include <humanoid_common_mpc/pinocchio_model/pinocchioUtils.h>
4848
#include "humanoid_common_mpc/constraint/ContactMomentXYConstraintCppAd.h"
49-
#include "humanoid_common_mpc/constraint/ContactMomentZConstraint.h"
5049
#include "humanoid_common_mpc/constraint/FootCollisionConstraint.h"
5150
#include "humanoid_common_mpc/constraint/JointLimitsSoftConstraint.h"
51+
#include "humanoid_common_mpc/cost/ExternalTorqueQuadraticCostAD.h"
5252

5353
namespace ocs2::humanoid {
5454

@@ -175,16 +175,6 @@ std::unique_ptr<StateInputCost> HumanoidCostConstraintFactory::getContactMomentX
175175
/******************************************************************************************************/
176176
/******************************************************************************************************/
177177

178-
std::unique_ptr<StateInputConstraint> HumanoidCostConstraintFactory::getContactMomentZConstraint(size_t contactPointIndex,
179-
const std::string& name) const {
180-
return std::unique_ptr<StateInputConstraint>(new ContactMomentZConstraint(*referenceManagerPtr_, *pinocchioInterfacePtr_,
181-
*mpcRobotModelADPtr_, contactPointIndex, name, modelSettings_));
182-
}
183-
184-
/******************************************************************************************************/
185-
/******************************************************************************************************/
186-
/******************************************************************************************************/
187-
188178
std::unique_ptr<StateInputConstraint> HumanoidCostConstraintFactory::getZeroWrenchConstraint(size_t contactPointIndex) const {
189179
return std::unique_ptr<StateInputConstraint>(new ZeroWrenchConstraint(*referenceManagerPtr_, contactPointIndex, *mpcRobotModelPtr_));
190180
}
@@ -240,4 +230,21 @@ std::unique_ptr<StateCost> HumanoidCostConstraintFactory::getTerminalCost() cons
240230
/******************************************************************************************************/
241231
/******************************************************************************************************/
242232

233+
std::unique_ptr<StateInputCost> HumanoidCostConstraintFactory::getExternalTorqueQuadraticCost(size_t contactPointIndex) const {
234+
std::string fieldName;
235+
if (contactPointIndex == 0) {
236+
fieldName = "left_leg_torque_cost.";
237+
}
238+
if (contactPointIndex == 1) {
239+
fieldName = "right_leg_torque_cost.";
240+
}
241+
ExternalTorqueQuadraticCostAD::Config config = ExternalTorqueQuadraticCostAD::loadConfigFromFile(taskFile_, fieldName, verbose_);
242+
return std::make_unique<ExternalTorqueQuadraticCostAD>(contactPointIndex, config, *referenceManagerPtr_, *pinocchioInterfacePtr_,
243+
*mpcRobotModelADPtr_, modelSettings_);
244+
}
245+
246+
/******************************************************************************************************/
247+
/******************************************************************************************************/
248+
/******************************************************************************************************/
249+
243250
} // namespace ocs2::humanoid

humanoid_nmpc/humanoid_common_mpc/src/HumanoidPreComputation.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ HumanoidPreComputation* HumanoidPreComputation::clone() const {
8080
/******************************************************************************************************/
8181
/******************************************************************************************************/
8282

83-
void HumanoidPreComputation::updatePinocchioFramePlacements(const vector_t& generalizedCoordinates) {
83+
void HumanoidPreComputation::updatePinocchioModelKinematics(const vector_t& q) {
8484
const pinocchio::Model& model = pinocchioInterface_.getModel();
8585
pinocchio::Data& data = pinocchioInterface_.getData();
8686

8787
// Perform the forward kinematics over the kinematic tree
88-
pinocchio::forwardKinematics(model, data, generalizedCoordinates);
88+
pinocchio::forwardKinematics(model, data, q);
8989
pinocchio::updateFramePlacements(model, data);
9090
}
9191

@@ -97,6 +97,8 @@ void HumanoidPreComputation::request(RequestSet request, scalar_t t, const vecto
9797
return;
9898
}
9999

100+
updatePinocchioModelKinematics(mpcRobotModelPtr_->getGeneralizedCoordinates(x));
101+
100102
// lambda to set config for normal velocity constraints
101103
auto eeNormalVelConConfig = [&](size_t footIndex) {
102104
EndEffectorKinematicsLinearVelConstraint::Config config;
@@ -111,8 +113,6 @@ void HumanoidPreComputation::request(RequestSet request, scalar_t t, const vecto
111113
};
112114

113115
if (request.contains(Request::Constraint)) {
114-
updatePinocchioFramePlacements(mpcRobotModelPtr_->getGeneralizedCoordinates(x));
115-
116116
for (size_t i = 0; i < N_CONTACTS; i++) {
117117
eeNormalVelConConfigs_[i] = eeNormalVelConConfig(i);
118118
pinocchio::FrameIndex frameID = pinocchioInterface_.getModel().getFrameId(mpcRobotModelPtr_->modelSettings.contactNames6DoF[i]);

0 commit comments

Comments
 (0)