kinematics-dynamics
Loading...
Searching...
No Matches
BasicCartesianControl.hpp
1// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
2
3#ifndef __BASIC_CARTESIAN_CONTROL_HPP__
4#define __BASIC_CARTESIAN_CONTROL_HPP__
5
6#include <atomic>
7#include <functional>
8#include <memory>
9#include <utility>
10#include <vector>
11
12#include <yarp/conf/version.h>
13
14#include <yarp/os/PeriodicThread.h>
15
16#include <yarp/dev/DeviceDriver.h>
17#include <yarp/dev/PolyDriver.h>
18#include <yarp/dev/ControlBoardInterfaces.h>
19#include <yarp/dev/IPreciselyTimed.h>
20
21#include <kdl/trajectory.hpp>
22
23#include "ICartesianSolver.h"
24#include "ICartesianControl.h"
25#include "BasicCartesianControl_ParamsParser.h"
26
106class BasicCartesianControl : public yarp::dev::DeviceDriver,
107 public yarp::os::PeriodicThread,
110{
111public:
112 BasicCartesianControl() : yarp::os::PeriodicThread(1.0, yarp::os::PeriodicThreadClock::Absolute)
113 {}
114
115 // -- ICartesianControl declarations. Implementation in ICartesianControlImpl.cpp --
116
117 // RPC commands
118 yarp::dev::ReturnValue getState(roboticslab::ICartesianControl::ControllerState & state) override;
119 yarp::dev::ReturnValue solvePose(const std::vector<double> & xd, std::vector<double> & q) override;
120 yarp::dev::ReturnValue moveJoint(const std::vector<double> & xd) override;
121 yarp::dev::ReturnValue moveLinear(const std::vector<double> & xd) override;
122 yarp::dev::ReturnValue moveVelocity(const std::vector<double> & xdotd) override;
123 yarp::dev::ReturnValue gravityCompensation() override;
124 yarp::dev::ReturnValue forceControl(const std::vector<double> & fd) override;
125 yarp::dev::ReturnValue stopControl() override;
126 yarp::dev::ReturnValue changeTool(const std::vector<double> & x) override;
127 yarp::dev::ReturnValue actuateTool(roboticslab::ICartesianControl::Actuator command) override;
128
129 // streaming commands
130 void pose(const std::vector<double> & x) override;
131 void twist(const std::vector<double> & xdot) override;
132 void wrench(const std::vector<double> & w) override;
133
134 // configuration getters/setters
135 yarp::dev::ReturnValue setParameter(roboticslab::ICartesianControl::Config vocab, roboticslab::ICartesianControl::config_value_t value) override;
136 yarp::dev::ReturnValue getParameter(roboticslab::ICartesianControl::Config vocab, roboticslab::ICartesianControl::config_value_t & value) override;
137 yarp::dev::ReturnValue setParameters(const roboticslab::ICartesianControl::config_map_t & params) override;
138 yarp::dev::ReturnValue getParameters(roboticslab::ICartesianControl::config_map_t & params) override;
139
140 // -------- PeriodicThread declarations. Implementation in PeriodicThreadImpl.cpp --------
141 void run() override;
142
143 // -------- DeviceDriver declarations. Implementation in IDeviceImpl.cpp --------
144 bool open(yarp::os::Searchable & config) override;
145 bool close() override;
146
147private:
149 {
150 public:
151 template <typename Fn>
152 StateWatcher(Fn && fn) : handler(std::move(fn))
153 {}
154
156 { if (handler) handler(); }
157
158 void suppress() const
159 { handler = nullptr; }
160
161 private:
162 mutable std::function<void()> handler;
163 };
164
165 double getTimestamp();
166 void setCurrentMode(roboticslab::ICartesianControl::Mode value);
167
168 bool checkJointLimits(const std::vector<double> & q);
169 bool checkJointLimits(const std::vector<double> & q, const std::vector<double> & qdot);
170 bool checkJointVelocities(const std::vector<double> & qdot);
171 bool doFailFastChecks(const std::vector<double> & initialQ);
172#if YARP_VERSION_COMPARE(>=, 4,0,0)
173 bool checkControlModes(yarp::dev::ControlModeEnum mode);
174 bool setControlModes(yarp::dev::SelectableControlModeEnum mode);
175#else
176 bool checkControlModes(int mode);
177 bool setControlModes(int mode);
178#endif
179 bool presetStreamingCommand(roboticslab::ICartesianControl::Streaming command);
180 bool computeIsocronousSpeeds(const std::vector<double> & q, const std::vector<double> & qd, std::vector<double> & qdot);
181
182 void handleMovj(const std::vector<double> & q, const StateWatcher & watcher);
183 void handleMovelVel(const std::vector<double> & q, const StateWatcher & watcher);
184 void handleMovelPosd(const std::vector<double> & q, const StateWatcher & watcher);
185 void handleMovv(const std::vector<double> & q, const StateWatcher & watcher);
186 void handleGcmp(const std::vector<double> & q, const StateWatcher & watcher);
187 void handleForc(const std::vector<double> & q, const std::vector<double> & qdot, const std::vector<double> & qdotdot, const StateWatcher & watcher);
188
189 yarp::dev::PolyDriver solverDevice;
190 roboticslab::ICartesianSolver * iCartesianSolver {nullptr};
191
192 yarp::dev::PolyDriver robotDevice;
193 yarp::dev::IControlMode * iControlMode {nullptr};
194 yarp::dev::IEncoders * iEncoders {nullptr};
195 yarp::dev::IPositionControl * iPositionControl {nullptr};
196 yarp::dev::IPositionDirect * iPositionDirect {nullptr};
197 yarp::dev::IPreciselyTimed * iPreciselyTimed {nullptr};
198 yarp::dev::ITorqueControl * iTorqueControl {nullptr};
199 yarp::dev::IVelocityControl * iVelocityControl {nullptr};
200
202
203#if YARP_VERSION_COMPARE(>=, 4,0,0)
204 std::size_t numJoints {0};
205#else
206 int numJoints {0};
207#endif
208 std::atomic<roboticslab::ICartesianControl::Mode> currentMode {roboticslab::ICartesianControl::Mode::NONE};
210
212 std::vector<double> vmoStored;
213
215 std::vector<std::unique_ptr<KDL::Trajectory>> trajectories;
216
218 std::vector<double> fd;
219
220 int encoderErrors {0};
221 double trajectoryStartTime {0.0};
222
223 std::atomic<double> maxTrajectoryDuration {0.0};
224 std::atomic<bool> cmcSuccess {true};
225 std::atomic<float> cmcProgress {1.0f}; // only meaningful for MOVEJ and MOVEL
226
227 std::vector<double> qMin, qMax;
228 std::vector<double> qdotMin, qdotMax;
229 std::vector<double> qRefSpeeds;
230};
231
232#endif // __BASIC_CARTESIAN_CONTROL_HPP__
Definition BasicCartesianControl.hpp:149
Definition BasicCartesianControl_ParamsParser.h:51
The BasicCartesianControl class implements ICartesianControl.
Definition BasicCartesianControl.hpp:110
void wrench(const std::vector< double > &w) override
Exert force.
Definition ICartesianControlImpl.cpp:682
yarp::dev::ReturnValue actuateTool(roboticslab::ICartesianControl::Actuator command) override
Actuate tool.
Definition ICartesianControlImpl.cpp:562
yarp::dev::ReturnValue getState(roboticslab::ICartesianControl::ControllerState &state) override
Current state and position.
Definition ICartesianControlImpl.cpp:29
yarp::dev::ReturnValue moveLinear(const std::vector< double > &xd) override
Linear move to target position.
Definition ICartesianControlImpl.cpp:214
yarp::dev::ReturnValue moveJoint(const std::vector< double > &xd) override
Move in joint space.
Definition ICartesianControlImpl.cpp:93
yarp::dev::ReturnValue setParameters(const roboticslab::ICartesianControl::config_map_t &params) override
Set multiple configuration parameters.
Definition ICartesianControlImpl.cpp:931
yarp::dev::ReturnValue forceControl(const std::vector< double > &fd) override
Force control.
Definition ICartesianControlImpl.cpp:457
std::vector< double > vmoStored
Definition BasicCartesianControl.hpp:212
yarp::dev::ReturnValue getParameters(roboticslab::ICartesianControl::config_map_t &params) override
Retrieve multiple configuration parameters.
Definition ICartesianControlImpl.cpp:960
yarp::dev::ReturnValue getParameter(roboticslab::ICartesianControl::Config vocab, roboticslab::ICartesianControl::config_value_t &value) override
Retrieve a configuration parameter.
Definition ICartesianControlImpl.cpp:891
yarp::dev::ReturnValue changeTool(const std::vector< double > &x) override
Change tool.
Definition ICartesianControlImpl.cpp:535
void twist(const std::vector< double > &xdot) override
Instantaneous velocity steps.
Definition ICartesianControlImpl.cpp:630
yarp::dev::ReturnValue solvePose(const std::vector< double > &xd, std::vector< double > &q) override
Inverse kinematics.
Definition ICartesianControlImpl.cpp:64
void pose(const std::vector< double > &x) override
Achieve pose.
Definition ICartesianControlImpl.cpp:574
std::vector< std::unique_ptr< KDL::Trajectory > > trajectories
Definition BasicCartesianControl.hpp:215
yarp::dev::ReturnValue setParameter(roboticslab::ICartesianControl::Config vocab, roboticslab::ICartesianControl::config_value_t value) override
Set a configuration parameter.
Definition ICartesianControlImpl.cpp:752
yarp::dev::ReturnValue stopControl() override
Stop control.
Definition ICartesianControlImpl.cpp:506
yarp::dev::ReturnValue gravityCompensation() override
Gravity compensation.
Definition ICartesianControlImpl.cpp:424
std::vector< double > fd
Definition BasicCartesianControl.hpp:218
yarp::dev::ReturnValue moveVelocity(const std::vector< double > &xdotd) override
Linear move with given velocity.
Definition ICartesianControlImpl.cpp:335
Abstract base class for a cartesian controller.
Definition ICartesianControl.h:22
Streaming
Streaming vocabs.
Definition ICartesianControl.h:44
@ NOT_SET
Streaming command not set.
Mode
Controller mode vocabs.
Definition ICartesianControl.h:57
Actuator
Actuator control vocabs.
Definition ICartesianControl.h:72
Config
Controller configuration vocabs.
Definition ICartesianControl.h:86
Abstract base class for a cartesian solver.
Definition ICartesianSolver.h:19
Frame
Lists supported reference frames.
Definition ICartesianSolver.h:23
Controller state structure.
Definition ICartesianControl.h:102