NetWrenchObserver.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-2019, CNRS-UM LIRMM
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
29 
30 namespace lipm_walking
31 {
32 
33 NetWrenchObserver::NetWrenchObserver() : sensorNames_({"LeftFootForceSensor", "RightFootForceSensor"}) {}
34 
35 NetWrenchObserver::NetWrenchObserver(const std::vector<std::string> & sensorNames) : sensorNames_(sensorNames) {}
36 
37 void NetWrenchObserver::update(const mc_rbdyn::Robot & robot, const Contact & contact)
38 {
39  updateNetWrench(robot);
40  updateNetZMP(contact);
41 }
42 
43 void NetWrenchObserver::updateNetWrench(const mc_rbdyn::Robot & robot)
44 {
45  netWrench_ = sva::ForceVecd::Zero();
46  for(std::string sensorName : sensorNames_)
47  {
48  const auto & sensor = robot.forceSensor(sensorName);
49  if(sensor.force().z() > 1.) // normal force is more than 1 [N]
50  {
51  netWrench_ += sensor.worldWrench(robot);
52  }
53  }
54 }
55 
56 void NetWrenchObserver::updateNetZMP(const Contact & contact)
57 {
58  const Eigen::Vector3d & force = netWrench_.force();
59  const Eigen::Vector3d & moment_0 = netWrench_.couple();
60  Eigen::Vector3d moment_p = moment_0 - contact.p().cross(force);
61  if(force.dot(force) > 42.) // force norm is more than 5 [N]
62  {
63  netZMP_ = contact.p() + contact.normal().cross(moment_p) / contact.normal().dot(force);
64  }
65 }
66 
67 } // namespace lipm_walking
const Eigen::Vector3d & p() const
Shorthand for position.
Definition: Contact.h:111
void update(const mc_rbdyn::Robot &robot, const Contact &contact)
Update estimates based on the sensed net contact wrench.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW NetWrenchObserver()
Empty constructor.
Main controller namespace.
Definition: build.dox:1
Contacts wrap foot frames with extra info from the footstep plan.
Definition: Contact.h:58
Eigen::Vector3d normal() const
Normal unit vector of the contact frame.
Definition: Contact.h:95