<NME> BushingForce.h
<BEF> #ifndef OPENSIM_BUSHING_FORCE_H_
#define OPENSIM_BUSHING_FORCE_H_
/* -------------------------------------------------------------------------- *
 *                          OpenSim:  BushingForce.h                          *
 * -------------------------------------------------------------------------- *
 * The OpenSim API is a toolkit for musculoskeletal modeling and simulation.  *
 * See http://opensim.stanford.edu and the NOTICE file for more information.  *
 * OpenSim is developed at Stanford University and supported by the US        *
 * National Institutes of Health (U54 GM072970, R24 HD065690) and by DARPA    *
 * through the Warrior Web program.                                           *
 *                                                                            *
 * Copyright (c) 2005-2017 Stanford University and the Authors                *
 * Author(s): Ajay Seth                                                       *
 *                                                                            *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may    *
 * not use this file except in compliance with the License. You may obtain a  *
 * copy of the License at http://www.apache.org/licenses/LICENSE-2.0.         *
 *                                                                            *
 * Unless required by applicable law or agreed to in writing, software        *
 * distributed under the License is distributed on an "AS IS" BASIS,          *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
 * See the License for the specific language governing permissions and        *
 * limitations under the License.                                             *
 * -------------------------------------------------------------------------- */


// INCLUDE
#include "Force.h"
#include <OpenSim/Simulation/Model/TwoFrameLinker.h>
#include <OpenSim/Simulation/Model/PhysicalFrame.h>

namespace OpenSim {

//==============================================================================
//                             BUSHING FORCE
//==============================================================================
/**
 * A class implementing a Bushing Force.
 * A Bushing Force is the force proportional to the deviation of two frames.
 * One can think of the Bushing as being composed of 3 linear and 3 torsional
 * spring-dampers, which act along or about the bushing frames. Orientations
 * are measured as x-y-z body-fixed Euler rotations, which are treated as
 * though they were uncoupled. Damping is proportional to the deflection rate of 
 * change (e.g. Euler angle derivatives) which is NOT the angular velocity between
 * the two frames. That makes this bushing model suitable only for relatively
 * small relative orientation deviations between the frames.
 * The underlying Force in Simbody is a SimtK::Force::LinearBushing.
 *
 * @author Ajay Seth
 */
class OSIMSIMULATION_API BushingForce 
    : public TwoFrameLinker<Force, PhysicalFrame> {
OpenSim_DECLARE_CONCRETE_OBJECT(BushingForce, TwoFrameLinker);
public:
//==============================================================================
// PROPERTIES
//==============================================================================
    // Physical properties of the bushing force
    OpenSim_DECLARE_PROPERTY(rotational_stiffness, SimTK::Vec3,
        "Stiffness parameters resisting rotational deviation (Nm/rad).");
    OpenSim_DECLARE_PROPERTY(translational_stiffness, SimTK::Vec3,
        "Stiffness parameters resisting relative translation (N/m).");
    OpenSim_DECLARE_PROPERTY(rotational_damping, SimTK::Vec3,
        "Damping parameters resisting angular deviation rate. (Nm/(rad/s))");
    OpenSim_DECLARE_PROPERTY(translational_damping, SimTK::Vec3,
        "Damping parameters resisting relative translational velocity. (N/(m/s))");
//==============================================================================
// PUBLIC METHODS
//==============================================================================
    /** Default constructor leaves frames unspecified and sets all bushing 
        stiffness and damping properties to zero. **/
    BushingForce();

    /** Convenience Constructor.
    Create a BushingForce between two PhysicalFrames, frame1 and frame2.
    @param[in] name         the name of this BushingForce
    @param[in] frame1       the bushing's first PhysicalFrame
    @param[in] frame2       the bushing's second PhysicalFrame
    */
    BushingForce(const std::string& name,
                 const PhysicalFrame& frame1,
                 const PhysicalFrame& frame2);

    /** Convenience Constructor.
    Create a BushingForce between two PhysicalFrames, frame1 and frame2.
    @param[in] name         the name of this BushingForce
    @param[in] frame1Name   the name of the bushing's first PhysicalFrame
    @param[in] frame2Name   the name of the bushing's second PhysicalFrame
    */
    BushingForce(const std::string& name,
                 const std::string& frame1Name,
                 const std::string& frame2Name);

    /** Construct a BushingForce given physical frames that it
     * tries to keep aligned by generating a passive force according to the
    Construct a BushingForce where the two frames are specified by the name
    and offset transforms on the respective frames.

    @param[in] name             the name of this BushingForce 
    @param[in] frame1Name       first PhysicalFrame that the bushing connects
    @param[in] offsetOnFrame1   offset Transform on the first frame
    @param[in] frame2Name       second PhysicalFrame that the bushing connects
    @param[in] offsetOnFrame2   offset Transform on the second frame
    @param[in] transStiffness   Vec3 of translational dx,dy,dz stiffnesses
    @param[in] rotStiffness     Vec3 of rotational dq_x, dq_y, dq_z stiffnesses
    @param[in] transDamping     Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_
    @param[in] rotStiffness     Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.
    */
    BushingForce(const std::string &name,
        const std::string& frame1Name, const SimTK::Transform& transformInFrame1,
                 const std::string& frame1Name,
                 const std::string& frame2Name,
                 const SimTK::Vec3& transStiffness,
                 const SimTK::Vec3& rotStiffness,
                 const SimTK::Vec3& transDamping,
                 const SimTK::Vec3& rotDamping);

    /** Convenience Constructor
    Construct a BushingForce between two frames with offset transforms on the
    respective frames.

    @param[in] name              the name of this BushingForce
    @param[in] frame1            first PhysicalFrame that the bushing connects
    @param[in] transformInFrame1 offset Transform on the first frame
    @param[in] frame2            second PhysicalFrame that the bushing connects
    @param[in] transformInFrame2 offset Transform on the second frame
                                   bushing frame orientation in frame 1.
    @param[in] frame2Name          name of the second PhysicalFrame of the bushing
    @param[in] locationInFrame2    Vec3 location of the weld in the second frame
    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the
                                   bushing frame orientation in frame2.
    @param[in] transStiffness      Vec3 of translational dx,dy,dz stiffnesses
    @param[in] rotStiffness        Vec3 of rotational dq_x, dq_y, dq_z stiffnesses
    @param[in] transDamping   Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_
    @param[in] rotStiffness   Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.
    */
    BushingForce(const std::string &name,
        const std::string& frame1Name,

    /** Convenience Constructor
    Construct a BushingForce where the two frames are specified by the name
    and offset transforms on the respective frames.

    @param[in] name              the name of this BushingForce 
    @param[in] frame1Name        first PhysicalFrame that the bushing connects
    @param[in] transformInFrame1 offset Transform on the first frame
    @param[in] frame2Name        second PhysicalFrame that the bushing connects
    @param[in] transformInFrame2 offset Transform on the second frame
    @param[in] transStiffness    translational (dx, dy, dz) stiffnesses
    @param[in] rotStiffness      rotational (dq_x, dq_y, dq_z) stiffnesses
    @param[in] transDamping      translational (dx/dt, dy/dt, dz/dt) damping
    @param[in] rotDamping        rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping
    */
    BushingForce(const std::string &name,
        const std::string& frame1Name, const SimTK::Transform& transformInFrame1,
        const std::string& frame2Name, const SimTK::Transform& transformInFrame2,
        const SimTK::Vec3& transStiffness,
        const SimTK::Vec3& rotStiffness,
        const SimTK::Vec3& transDamping,
        const SimTK::Vec3& rotDamping);


    /** Backwards compatible Convenience Constructor
    Construct a BushingForce where the bushing frames are specified in terms of their
    location and orientation in their respective PhysicalFrames and passive force
    defined by the physical properties of the bushing. See property declarations
    for more information. 
    @param[in] name                the name of this BushingForce
    @param[in] frame1Name          name of the first PhysicalFrame of the bushing
    @param[in] locationInFrame1    Vec3 location of the bushing in the first frame
    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the
                                   bushing frame orientation in frame 1.
    @param[in] frame2Name          name of the second PhysicalFrame of the bushing
    @param[in] locationInFrame2    Vec3 location of the weld in the second frame
    @param[in] orientationInFrame2 Vec3 of the XYZ body-fixed Euler angles of the
                                   bushing frame orientation in frame2.
    @param[in] transStiffness      translational (dx, dy, dz) stiffnesses
    @param[in] rotStiffness        rotational (dq_x, dq_y, dq_z) stiffnesses
    @param[in] transDamping        translational (dx/dt, dy/dt, dz/dt) damping
    @param[in] rotDamping          rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping
    */
    BushingForce(const std::string &name,
        const std::string& frame1Name,
        const SimTK::Vec3& locationInFrame1, const SimTK::Vec3& orientationInFrame1,
        const std::string& frame2Name,
        const SimTK::Vec3& locationInFrame2, const SimTK::Vec3& orientationInFrame2,
        const SimTK::Vec3& transStiffness,
        const SimTK::Vec3& rotStiffness,
        const SimTK::Vec3& transDamping,
        const SimTK::Vec3& rotDamping);

    // Uses default (compiler-generated) destructor, copy constructor, and copy
    // assignment operator.

    /** Potential energy is the elastic energy stored in the bushing. */
    double computePotentialEnergy(const SimTK::State& s) const final override;

    //--------------------------------------------------------------------------
    // Reporting
    //--------------------------------------------------------------------------
    /** 
     * Provide name(s) of the quantities (column labels) of the force value(s) 
     * to be reported. */
    OpenSim::Array<std::string> getRecordLabels() const override;
    /**
    *  Provide the value(s) to be reported that correspond to the labels */
    OpenSim::Array<double> getRecordValues(const SimTK::State& state) const override;

private:
    //--------------------------------------------------------------------------
    // Implement ModelComponent interface.
    //--------------------------------------------------------------------------
    // Create a SimTK::Force::LinearBushing which implements this BushingForce.
    void extendAddToSystemAfterSubcomponents(SimTK::MultibodySystem& system) 
                                                                    const override;

    void setNull();
    void constructProperties();
//==============================================================================
};  // END of class BushingForce
//==============================================================================
//==============================================================================

} // end of namespace OpenSim

#endif // OPENSIM_BUSHING_FORCE_H_



<MSG> Merge pull request #713 from opensim-org/bushing-force-doxygen

Fix doxygen warnings from BushingForce.
<DFF> @@ -96,15 +96,15 @@ public:
     Construct a BushingForce where the two frames are specified by the name
     and offset transforms on the respective frames.
 
-    @param[in] name             the name of this BushingForce 
-    @param[in] frame1Name       first PhysicalFrame that the bushing connects
-    @param[in] offsetOnFrame1   offset Transform on the first frame
-    @param[in] frame2Name       second PhysicalFrame that the bushing connects
-    @param[in] offsetOnFrame2   offset Transform on the second frame
-    @param[in] transStiffness   Vec3 of translational dx,dy,dz stiffnesses
-    @param[in] rotStiffness     Vec3 of rotational dq_x, dq_y, dq_z stiffnesses
-    @param[in] transDamping     Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_
-    @param[in] rotStiffness     Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.
+    @param[in] name              the name of this BushingForce 
+    @param[in] frame1Name        first PhysicalFrame that the bushing connects
+    @param[in] transformInFrame1 offset Transform on the first frame
+    @param[in] frame2Name        second PhysicalFrame that the bushing connects
+    @param[in] transformInFrame2 offset Transform on the second frame
+    @param[in] transStiffness    translational (dx, dy, dz) stiffnesses
+    @param[in] rotStiffness      rotational (dq_x, dq_y, dq_z) stiffnesses
+    @param[in] transDamping      translational (dx/dt, dy/dt, dz/dt) damping
+    @param[in] rotDamping        rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping
     */
     BushingForce(const std::string &name,
         const std::string& frame1Name, const SimTK::Transform& transformInFrame1,
@@ -127,12 +127,12 @@ public:
                                    bushing frame orientation in frame 1.
     @param[in] frame2Name          name of the second PhysicalFrame of the bushing
     @param[in] locationInFrame2    Vec3 location of the weld in the second frame
-    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the
+    @param[in] orientationInFrame2 Vec3 of the XYZ body-fixed Euler angles of the
                                    bushing frame orientation in frame2.
-    @param[in] transStiffness      Vec3 of translational dx,dy,dz stiffnesses
-    @param[in] rotStiffness        Vec3 of rotational dq_x, dq_y, dq_z stiffnesses
-    @param[in] transDamping   Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_
-    @param[in] rotStiffness   Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.
+    @param[in] transStiffness      translational (dx, dy, dz) stiffnesses
+    @param[in] rotStiffness        rotational (dq_x, dq_y, dq_z) stiffnesses
+    @param[in] transDamping        translational (dx/dt, dy/dt, dz/dt) damping
+    @param[in] rotDamping          rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping
     */
     BushingForce(const std::string &name,
         const std::string& frame1Name,

{'commit': 'diff --git a/OpenSim/Simulation/Model/BushingForce.h b/OpenSim/Simulation/Model/BushingForce.h\nindex c4cb40df1..1bfb7c6cc 100644\n--- a/OpenSim/Simulation/Model/BushingForce.h\n+++ b/OpenSim/Simulation/Model/BushingForce.h\n@@ -96,15 +96,15 @@ public:\n     Construct a BushingForce where the two frames are specified by the name\n     and offset transforms on the respective frames.\n \n-    @param[in] name             the name of this BushingForce \n-    @param[in] frame1Name       first PhysicalFrame that the bushing connects\n-    @param[in] offsetOnFrame1   offset Transform on the first frame\n-    @param[in] frame2Name       second PhysicalFrame that the bushing connects\n-    @param[in] offsetOnFrame2   offset Transform on the second frame\n-    @param[in] transStiffness   Vec3 of translational dx,dy,dz stiffnesses\n-    @param[in] rotStiffness     Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n-    @param[in] transDamping     Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n-    @param[in] rotStiffness     Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n+    @param[in] name              the name of this BushingForce \n+    @param[in] frame1Name        first PhysicalFrame that the bushing connects\n+    @param[in] transformInFrame1 offset Transform on the first frame\n+    @param[in] frame2Name        second PhysicalFrame that the bushing connects\n+    @param[in] transformInFrame2 offset Transform on the second frame\n+    @param[in] transStiffness    translational (dx, dy, dz) stiffnesses\n+    @param[in] rotStiffness      rotational (dq_x, dq_y, dq_z) stiffnesses\n+    @param[in] transDamping      translational (dx/dt, dy/dt, dz/dt) damping\n+    @param[in] rotDamping        rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n     */\n     BushingForce(const std::string &name,\n         const std::string& frame1Name, const SimTK::Transform& transformInFrame1,\n@@ -127,12 +127,12 @@ public:\n                                    bushing frame orientation in frame 1.\n     @param[in] frame2Name          name of the second PhysicalFrame of the bushing\n     @param[in] locationInFrame2    Vec3 location of the weld in the second frame\n-    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the\n+    @param[in] orientationInFrame2 Vec3 of the XYZ body-fixed Euler angles of the\n                                    bushing frame orientation in frame2.\n-    @param[in] transStiffness      Vec3 of translational dx,dy,dz stiffnesses\n-    @param[in] rotStiffness        Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n-    @param[in] transDamping   Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n-    @param[in] rotStiffness   Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n+    @param[in] transStiffness      translational (dx, dy, dz) stiffnesses\n+    @param[in] rotStiffness        rotational (dq_x, dq_y, dq_z) stiffnesses\n+    @param[in] transDamping        translational (dx/dt, dy/dt, dz/dt) damping\n+    @param[in] rotDamping          rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n     */\n     BushingForce(const std::string &name,\n         const std::string& frame1Name,\n', 'commit_subject': 'Merge pull request #713 from opensim-org/bushing-force-doxygen', 'repo_name': 'opensim-org/opensim-core', 'committer': {'name': 'Michael Sherman', 'email': '10753a9e287eb14724b3c33ef4445ac080c07e6b@stanford.edu', 'time_sec': '1448044042', 'tz_offset': '-480', 'date': {'seconds': '1448044042'}}, 'commit_tree': '486464539bc8e56e5e1a59f7431c3e20de658541', 'commit_message': 'Merge pull request #713 from opensim-org/bushing-force-doxygen\n\nFix doxygen warnings from BushingForce.', 'language_name': 'Shell', 'license': 'apache-2.0', 'hunks': '@@ -96,15 +96,15 @@ public:\n     Construct a BushingForce where the two frames are specified by the name\n     and offset transforms on the respective frames.\n \n-    @param[in] name             the name of this BushingForce \n-    @param[in] frame1Name       first PhysicalFrame that the bushing connects\n-    @param[in] offsetOnFrame1   offset Transform on the first frame\n-    @param[in] frame2Name       second PhysicalFrame that the bushing connects\n-    @param[in] offsetOnFrame2   offset Transform on the second frame\n-    @param[in] transStiffness   Vec3 of translational dx,dy,dz stiffnesses\n-    @param[in] rotStiffness     Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n-    @param[in] transDamping     Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n-    @param[in] rotStiffness     Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n+    @param[in] name              the name of this BushingForce \n+    @param[in] frame1Name        first PhysicalFrame that the bushing connects\n+    @param[in] transformInFrame1 offset Transform on the first frame\n+    @param[in] frame2Name        second PhysicalFrame that the bushing connects\n+    @param[in] transformInFrame2 offset Transform on the second frame\n+    @param[in] transStiffness    translational (dx, dy, dz) stiffnesses\n+    @param[in] rotStiffness      rotational (dq_x, dq_y, dq_z) stiffnesses\n+    @param[in] transDamping      translational (dx/dt, dy/dt, dz/dt) damping\n+    @param[in] rotDamping        rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n     */\n     BushingForce(const std::string &name,\n         const std::string& frame1Name, const SimTK::Transform& transformInFrame1,\n@@ -127,12 +127,12 @@ public:\n                                    bushing frame orientation in frame 1.\n     @param[in] frame2Name          name of the second PhysicalFrame of the bushing\n     @param[in] locationInFrame2    Vec3 location of the weld in the second frame\n-    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the\n+    @param[in] orientationInFrame2 Vec3 of the XYZ body-fixed Euler angles of the\n                                    bushing frame orientation in frame2.\n-    @param[in] transStiffness      Vec3 of translational dx,dy,dz stiffnesses\n-    @param[in] rotStiffness        Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n-    @param[in] transDamping   Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n-    @param[in] rotStiffness   Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n+    @param[in] transStiffness      translational (dx, dy, dz) stiffnesses\n+    @param[in] rotStiffness        rotational (dq_x, dq_y, dq_z) stiffnesses\n+    @param[in] transDamping        translational (dx/dt, dy/dt, dz/dt) damping\n+    @param[in] rotDamping          rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n     */\n     BushingForce(const std::string &name,\n         const std::string& frame1Name,\n', 'addition_count': 14, 'deletion_count': 14, 'src_file': 'a/OpenSim/Simulation/Model/BushingForce.h', 'tgt_file': 'b/OpenSim/Simulation/Model/BushingForce.h', 'file_extension': '.h', 'before_file': '#ifndef OPENSIM_BUSHING_FORCE_H_\n#define OPENSIM_BUSHING_FORCE_H_\n/* -------------------------------------------------------------------------- *\n *                          OpenSim:  BushingForce.h                          *\n * -------------------------------------------------------------------------- *\n * The OpenSim API is a toolkit for musculoskeletal modeling and simulation.  *\n * See http://opensim.stanford.edu and the NOTICE file for more information.  *\n * OpenSim is developed at Stanford University and supported by the US        *\n * National Institutes of Health (U54 GM072970, R24 HD065690) and by DARPA    *\n * through the Warrior Web program.                                           *\n *                                                                            *\n * Copyright (c) 2005-2017 Stanford University and the Authors                *\n * Author(s): Ajay Seth                                                       *\n *                                                                            *\n * Licensed under the Apache License, Version 2.0 (the "License"); you may    *\n * not use this file except in compliance with the License. You may obtain a  *\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0.         *\n *                                                                            *\n * Unless required by applicable law or agreed to in writing, software        *\n * distributed under the License is distributed on an "AS IS" BASIS,          *\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *\n * See the License for the specific language governing permissions and        *\n * limitations under the License.                                             *\n * -------------------------------------------------------------------------- */\n\n\n// INCLUDE\n#include "Force.h"\n#include <OpenSim/Simulation/Model/TwoFrameLinker.h>\n#include <OpenSim/Simulation/Model/PhysicalFrame.h>\n\nnamespace OpenSim {\n\n//==============================================================================\n//                             BUSHING FORCE\n//==============================================================================\n/**\n * A class implementing a Bushing Force.\n * A Bushing Force is the force proportional to the deviation of two frames.\n * One can think of the Bushing as being composed of 3 linear and 3 torsional\n * spring-dampers, which act along or about the bushing frames. Orientations\n * are measured as x-y-z body-fixed Euler rotations, which are treated as\n * though they were uncoupled. Damping is proportional to the deflection rate of \n * change (e.g. Euler angle derivatives) which is NOT the angular velocity between\n * the two frames. That makes this bushing model suitable only for relatively\n * small relative orientation deviations between the frames.\n * The underlying Force in Simbody is a SimtK::Force::LinearBushing.\n *\n * @author Ajay Seth\n */\nclass OSIMSIMULATION_API BushingForce \n    : public TwoFrameLinker<Force, PhysicalFrame> {\nOpenSim_DECLARE_CONCRETE_OBJECT(BushingForce, TwoFrameLinker);\npublic:\n//==============================================================================\n// PROPERTIES\n//==============================================================================\n    // Physical properties of the bushing force\n    OpenSim_DECLARE_PROPERTY(rotational_stiffness, SimTK::Vec3,\n        "Stiffness parameters resisting rotational deviation (Nm/rad).");\n    OpenSim_DECLARE_PROPERTY(translational_stiffness, SimTK::Vec3,\n        "Stiffness parameters resisting relative translation (N/m).");\n    OpenSim_DECLARE_PROPERTY(rotational_damping, SimTK::Vec3,\n        "Damping parameters resisting angular deviation rate. (Nm/(rad/s))");\n    OpenSim_DECLARE_PROPERTY(translational_damping, SimTK::Vec3,\n        "Damping parameters resisting relative translational velocity. (N/(m/s))");\n//==============================================================================\n// PUBLIC METHODS\n//==============================================================================\n    /** Default constructor leaves frames unspecified and sets all bushing \n        stiffness and damping properties to zero. **/\n    BushingForce();\n\n    /** Convenience Constructor.\n    Create a BushingForce between two PhysicalFrames, frame1 and frame2.\n    @param[in] name         the name of this BushingForce\n    @param[in] frame1       the bushing\'s first PhysicalFrame\n    @param[in] frame2       the bushing\'s second PhysicalFrame\n    */\n    BushingForce(const std::string& name,\n                 const PhysicalFrame& frame1,\n                 const PhysicalFrame& frame2);\n\n    /** Convenience Constructor.\n    Create a BushingForce between two PhysicalFrames, frame1 and frame2.\n    @param[in] name         the name of this BushingForce\n    @param[in] frame1Name   the name of the bushing\'s first PhysicalFrame\n    @param[in] frame2Name   the name of the bushing\'s second PhysicalFrame\n    */\n    BushingForce(const std::string& name,\n                 const std::string& frame1Name,\n                 const std::string& frame2Name);\n\n    /** Construct a BushingForce given physical frames that it\n     * tries to keep aligned by generating a passive force according to the\n    Construct a BushingForce where the two frames are specified by the name\n    and offset transforms on the respective frames.\n\n    @param[in] name             the name of this BushingForce \n    @param[in] frame1Name       first PhysicalFrame that the bushing connects\n    @param[in] offsetOnFrame1   offset Transform on the first frame\n    @param[in] frame2Name       second PhysicalFrame that the bushing connects\n    @param[in] offsetOnFrame2   offset Transform on the second frame\n    @param[in] transStiffness   Vec3 of translational dx,dy,dz stiffnesses\n    @param[in] rotStiffness     Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n    @param[in] transDamping     Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n    @param[in] rotStiffness     Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n    */\n    BushingForce(const std::string &name,\n        const std::string& frame1Name, const SimTK::Transform& transformInFrame1,\n                 const std::string& frame1Name,\n                 const std::string& frame2Name,\n                 const SimTK::Vec3& transStiffness,\n                 const SimTK::Vec3& rotStiffness,\n                 const SimTK::Vec3& transDamping,\n                 const SimTK::Vec3& rotDamping);\n\n    /** Convenience Constructor\n    Construct a BushingForce between two frames with offset transforms on the\n    respective frames.\n\n    @param[in] name              the name of this BushingForce\n    @param[in] frame1            first PhysicalFrame that the bushing connects\n    @param[in] transformInFrame1 offset Transform on the first frame\n    @param[in] frame2            second PhysicalFrame that the bushing connects\n    @param[in] transformInFrame2 offset Transform on the second frame\n                                   bushing frame orientation in frame 1.\n    @param[in] frame2Name          name of the second PhysicalFrame of the bushing\n    @param[in] locationInFrame2    Vec3 location of the weld in the second frame\n    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the\n                                   bushing frame orientation in frame2.\n    @param[in] transStiffness      Vec3 of translational dx,dy,dz stiffnesses\n    @param[in] rotStiffness        Vec3 of rotational dq_x, dq_y, dq_z stiffnesses\n    @param[in] transDamping   Vec3 of translational (dx/dt, dy/dt, dz/dt) damping_\n    @param[in] rotStiffness   Vec3 of rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping.\n    */\n    BushingForce(const std::string &name,\n        const std::string& frame1Name,\n\n    /** Convenience Constructor\n    Construct a BushingForce where the two frames are specified by the name\n    and offset transforms on the respective frames.\n\n    @param[in] name              the name of this BushingForce \n    @param[in] frame1Name        first PhysicalFrame that the bushing connects\n    @param[in] transformInFrame1 offset Transform on the first frame\n    @param[in] frame2Name        second PhysicalFrame that the bushing connects\n    @param[in] transformInFrame2 offset Transform on the second frame\n    @param[in] transStiffness    translational (dx, dy, dz) stiffnesses\n    @param[in] rotStiffness      rotational (dq_x, dq_y, dq_z) stiffnesses\n    @param[in] transDamping      translational (dx/dt, dy/dt, dz/dt) damping\n    @param[in] rotDamping        rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n    */\n    BushingForce(const std::string &name,\n        const std::string& frame1Name, const SimTK::Transform& transformInFrame1,\n        const std::string& frame2Name, const SimTK::Transform& transformInFrame2,\n        const SimTK::Vec3& transStiffness,\n        const SimTK::Vec3& rotStiffness,\n        const SimTK::Vec3& transDamping,\n        const SimTK::Vec3& rotDamping);\n\n\n    /** Backwards compatible Convenience Constructor\n    Construct a BushingForce where the bushing frames are specified in terms of their\n    location and orientation in their respective PhysicalFrames and passive force\n    defined by the physical properties of the bushing. See property declarations\n    for more information. \n    @param[in] name                the name of this BushingForce\n    @param[in] frame1Name          name of the first PhysicalFrame of the bushing\n    @param[in] locationInFrame1    Vec3 location of the bushing in the first frame\n    @param[in] orientationInFrame1 Vec3 of the XYZ body-fixed Euler angles of the\n                                   bushing frame orientation in frame 1.\n    @param[in] frame2Name          name of the second PhysicalFrame of the bushing\n    @param[in] locationInFrame2    Vec3 location of the weld in the second frame\n    @param[in] orientationInFrame2 Vec3 of the XYZ body-fixed Euler angles of the\n                                   bushing frame orientation in frame2.\n    @param[in] transStiffness      translational (dx, dy, dz) stiffnesses\n    @param[in] rotStiffness        rotational (dq_x, dq_y, dq_z) stiffnesses\n    @param[in] transDamping        translational (dx/dt, dy/dt, dz/dt) damping\n    @param[in] rotDamping          rotational (dq_x/dt, dq_y/dt, dq_z/dt) damping\n    */\n    BushingForce(const std::string &name,\n        const std::string& frame1Name,\n        const SimTK::Vec3& locationInFrame1, const SimTK::Vec3& orientationInFrame1,\n        const std::string& frame2Name,\n        const SimTK::Vec3& locationInFrame2, const SimTK::Vec3& orientationInFrame2,\n        const SimTK::Vec3& transStiffness,\n        const SimTK::Vec3& rotStiffness,\n        const SimTK::Vec3& transDamping,\n        const SimTK::Vec3& rotDamping);\n\n    // Uses default (compiler-generated) destructor, copy constructor, and copy\n    // assignment operator.\n\n    /** Potential energy is the elastic energy stored in the bushing. */\n    double computePotentialEnergy(const SimTK::State& s) const final override;\n\n    //--------------------------------------------------------------------------\n    // Reporting\n    //--------------------------------------------------------------------------\n    /** \n     * Provide name(s) of the quantities (column labels) of the force value(s) \n     * to be reported. */\n    OpenSim::Array<std::string> getRecordLabels() const override;\n    /**\n    *  Provide the value(s) to be reported that correspond to the labels */\n    OpenSim::Array<double> getRecordValues(const SimTK::State& state) const override;\n\nprivate:\n    //--------------------------------------------------------------------------\n    // Implement ModelComponent interface.\n    //--------------------------------------------------------------------------\n    // Create a SimTK::Force::LinearBushing which implements this BushingForce.\n    void extendAddToSystemAfterSubcomponents(SimTK::MultibodySystem& system) \n                                                                    const override;\n\n    void setNull();\n    void constructProperties();\n//==============================================================================\n};  // END of class BushingForce\n//==============================================================================\n//==============================================================================\n\n} // end of namespace OpenSim\n\n#endif // OPENSIM_BUSHING_FORCE_H_\n\n\n', 'message': 'Merge pull request #713 from opensim-org/bushing-force-doxygen\n\nFix doxygen warnings from BushingForce.', 'author_name': 'Michael Sherman', 'lang': 'h'}