CollisionAvoidanceCore.h
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @package ...
17 * @author Jianfeng Gao ( jianfeng dot gao at kit dot edu )
18 * @date 2024
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22
23#pragma once
24
25#include <VirtualRobot/VirtualRobot.h>
26
27#include <simox/control/dynamics/RBDLModel.h>
28#include <simox/control/environment/CollisionRobotInterface.h>
29#include <simox/control/environment/fwd.h>
30#include <simox/control/impl/simox/robot/Robot.h>
31#include <simox/control/robot/RobotInterface.h>
32
34
36#include <armarx/control/common/control_law/aron/CollisionAvoidanceConfig.aron.generated.h>
37
39{
40
41 namespace law = armarx::control::common::control_law;
42
43 /**
44 * @defgroup Library-CollisionAvoidanceBase CollisionAvoidanceBase
45 * @ingroup Library-RobotUnit-NJointControllers
46 * A description of the library CollisionAvoidanceBase.
47 *
48 * @class CollisionAvoidanceBase
49 * @ingroup Library-CollisionAvoidanceBase
50 * @brief Brief description of class CollisionAvoidanceBase.
51 *
52 * Detailed description of class CollisionAvoidanceBase.
53 */
55 {
56
57 public:
58 using SCRobot = law::CollisionAvoidanceController::SCRobot;
59 using DistanceResults = law::CollisionAvoidanceController::DistanceResults;
60 using CollisionRobotIndices = law::CollisionAvoidanceController::CollisionRobotIndices;
61 using CtrlConfig = law::arondto::CollisionAvoidanceConfig;
62 using Config = law::arondto::CollisionAvoidanceConfigDict;
63 using RtStatus = law::CollisionAvoidanceController::RtStatusForSafetyStrategy;
64 using RecoveryState = law::CollisionAvoidanceController::RecoveryState;
65
66 using CollisionRobot = simox::control::environment::CollisionRobotInterface;
67 using DynamicsModel = simox::control::dynamics::RBDLModel;
68
70 {
71 std::string nodeSetName;
72
73 /// !!!!!!! Note that, all the data below should only be accessed in rt thread !!!!!!!
74 VirtualRobot::RobotNodeSetPtr rtRNS;
75
76 /// controller (maths)
77 law::CollisionAvoidanceController controller;
78 RtStatus rts; // should only be used in rt thread
81
82 /// self-collision avoidance
83 std::unique_ptr<DynamicsModel> dynamicsModel;
86
88 const std::string& robotNodeSetName,
89 const SCRobot& scRobot,
91 const Config& c,
92 const std::vector<size_t>& velCtrlIndex);
93
94 void reset(const Config& c, const std::vector<size_t>& velCtrlIndex);
95 };
96
98 const Config& cfg,
99 const std::map<std::string, std::vector<size_t>>& velCtrlIndices);
100 virtual ~CollisionAvoidanceBase();
101
102 virtual void rtCollisionChecking();
103 void rtLimbControllerRun(const std::string& robotNodeSetName,
104 const Eigen::VectorXf& qpos,
105 const Eigen::VectorXf& qvelFiltered,
106 float torqueLimit,
107 const Eigen::VectorXf& impedanceJointTorque,
108 double deltaT);
109 void rtPreActivate();
110 void rtPostDeactivate();
112
113 std::map<std::string, NodeSetData> collLimb;
114 Config userCfg; // used in nonRT
116
117 void validateConfigData(const Config& cfg);
118 void setUserCfg(const Config& cfg);
119
120 protected:
121 std::unique_ptr<CollisionRobot> collisionRobot;
122 std::unique_ptr<SCRobot> scRobot;
123 VirtualRobot::RobotNodeSetPtr scRobotNodeSet;
125
126 std::vector<std::string>
127 actuatedJointNames; /// TODO, rename to actuatedJointNames, Not needed anymore?
128 Eigen::VectorXd qposActuatedJoints;
129 std::vector<unsigned int> translationJointIndex;
130 //int qposActuatedJointsIndex;
131
132 /// !!! individualColObjects has to be set to true !!!
133 /// if not set to true, the body and the arms become attractive, be aware
134 const simox::control::environment::CompDistArgs compDistArgs =
135 simox::control::environment::CompDistArgs{.nearestPoints = true,
136 .individualColObjects = true};
137
138 Config rtCfg; // used in RT
139
140 private:
141 float preFilterDistance = 0.6; // in meter
142 std::map<std::string, std::vector<size_t>> velCtrlIdx;
143 // int maxCollisionPairs = 100;
144
145 const bool reduceModel = false; // not needed anymore
146
147 simox::control::environment::CompDistArgs selfColAvoidanceArgs;
148
149 VirtualRobot::RobotPtr rtRobot; // TODO not needed?
150 VirtualRobot::RobotNodeSetPtr rtRobotNodeSet;
151 };
152
153 using CollisionAvoidanceBasePtr = std::shared_ptr<CollisionAvoidanceBase>;
154} // namespace armarx::control::njoint_controller::core
constexpr T c
A simple triple buffer for lockfree comunication between a single writer and a single reader.
const simox::control::environment::CompDistArgs compDistArgs
!
law::CollisionAvoidanceController::DistanceResults DistanceResults
law::CollisionAvoidanceController::CollisionRobotIndices CollisionRobotIndices
Eigen::VectorXd qposActuatedJoints
TODO, rename to actuatedJointNames, Not needed anymore?
law::CollisionAvoidanceController::RtStatusForSafetyStrategy RtStatus
simox::control::environment::CollisionRobotInterface CollisionRobot
void rtLimbControllerRun(const std::string &robotNodeSetName, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float torqueLimit, const Eigen::VectorXf &impedanceJointTorque, double deltaT)
CollisionAvoidanceBase(const VirtualRobot::RobotPtr &rtRobot, const Config &cfg, const std::map< std::string, std::vector< size_t > > &velCtrlIndices)
law::CollisionAvoidanceController::RecoveryState RecoveryState
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
std::shared_ptr< CollisionAvoidanceBase > CollisionAvoidanceBasePtr
VirtualRobot::RobotNodeSetPtr rtRNS
!!!!!!! Note that, all the data below should only be accessed in rt thread !!!!!!!
void reset(const Config &c, const std::vector< size_t > &velCtrlIndex)
std::unique_ptr< DynamicsModel > dynamicsModel
self-collision avoidance
NodeSetData(const VirtualRobot::RobotPtr &rtRobot, const std::string &robotNodeSetName, const SCRobot &scRobot, const DistanceResults &collisionPairs, const Config &c, const std::vector< size_t > &velCtrlIndex)