This is a simple example of using a marker tracking goal.
#include <OpenSim/Simulation/SimbodyEngine/PinJoint.h>
#include <OpenSim/Simulation/MarkersReference.h>
#include <OpenSim/Actuators/CoordinateActuator.h>
#include <Moco/osimMoco.h>
std::unique_ptr<Model> createDoublePendulumModel() {
    auto model = make_unique<Model>();
    model->setName("double_pendulum");
    using SimTK::Vec3;
    using SimTK::Inertia;
    
    
    auto* b0 = new OpenSim::Body("b0", 1, Vec3(0), Inertia(1));
    model->addBody(b0);
    auto* b1 = new OpenSim::Body("b1", 1, Vec3(0), Inertia(1));
    model->addBody(b1);
    
    auto* m0 = new Marker("m0", *b0, Vec3(0));
    auto* m1 = new Marker("m1", *b1, Vec3(0));
    model->addMarker(m0);
    model->addMarker(m1);
    
    auto* j0 = new PinJoint("j0", model->getGround(), Vec3(0), Vec3(0),
        *b0, Vec3(-1, 0, 0), Vec3(0));
    auto& q0 = j0->updCoordinate();
    q0.setRangeMin(-10);
    q0.setRangeMax(10);
    q0.setName("q0");
    auto* j1 = new PinJoint("j1",
        *b0, Vec3(0), Vec3(0), *b1, Vec3(-1, 0, 0), Vec3(0));
    auto& q1 = j1->updCoordinate();
    q1.setRangeMin(-10);
    q1.setRangeMax(10);
    q1.setName("q1");
    model->addJoint(j0);
    model->addJoint(j1);
    auto* tau0 = new CoordinateActuator();
    tau0->setCoordinate(&j0->updCoordinate());
    tau0->setName("tau0");
    tau0->setOptimalForce(1);
    tau0->setMinControl(-40);
    tau0->setMaxControl(40);
    model->addComponent(tau0);
    auto* tau1 = new CoordinateActuator();
    tau1->setCoordinate(&j1->updCoordinate());
    tau1->setName("tau1");
    tau1->setOptimalForce(1);
    tau1->setMinControl(-40);
    tau1->setMaxControl(40);
    model->addComponent(tau1);
    
    Ellipsoid bodyGeometry(0.5, 0.1, 0.1);
    SimTK::Transform transform(SimTK::Vec3(-0.5, 0, 0));
    auto* b0Center = new PhysicalOffsetFrame("b0_center", *b0, transform);
    b0->addComponent(b0Center);
    b0Center->attachGeometry(bodyGeometry.clone());
    auto* b1Center = new PhysicalOffsetFrame("b1_center", *b1, transform);
    b1->addComponent(b1Center);
    b1Center->attachGeometry(bodyGeometry.clone());
    model->finalizeConnections();
    return model;
}
int main() {
    study.setName("double_pendulum_marker_tracking");
    
    
    
    
    problem.
setModel(createDoublePendulumModel());
    
    
    double finalTime = 1.0;
    
    
    
    TimeSeriesTableVec3 markerTrajectories;
    markerTrajectories.setColumnLabels({"/markerset/m0", "/markerset/m1"});
    for (double time = 0; time < finalTime; time += 0.01) {
        SimTK::Real q0 = (time / 1.0) * 0.5 * SimTK::Pi;
        SimTK::Real q1 = (time / 1.0) * 0.25 * SimTK::Pi;
        SimTK::Vec3 m0(cos(q0), sin(q0), 0);
        SimTK::Vec3 m1 = m0 + SimTK::Vec3(cos(q0 + q1), sin(q0 + q1), 0);
        markerTrajectories.appendRow(time, {m0, m1});
    }
    
    Set<MarkerWeight> markerWeights;
    markerWeights.cloneAndAppend({"/markerset/m0", 100});
    markerWeights.cloneAndAppend({"/markerset/m1", 10});
    
    MarkersReference ref(markerTrajectories, markerWeights);
    
    
    
    solver.set_num_mesh_intervals(50);
    solver.set_verbosity(2);
    solver.set_optim_hessian_approximation("exact");
    
    
    solution.
write(
"exampleMarkerTracking_solution.sto");
    return EXIT_SUCCESS;
}