6 #ifndef FLEXIV_RDK_UTILITY_HPP_
7 #define FLEXIV_RDK_UTILITY_HPP_
10 #include <Eigen/Eigen>
14 namespace flexiv::rdk {
21 return group == JointGroup::ARM_1 || group == JointGroup::ARM_2;
38 if (!std::holds_alternative<int>(state_it->second)) {
42 return std::get<int>(state_it->second) != 0;
52 const std::map<JointGroup, PrimitiveStates>& primitive_states,
const std::string& state_name)
54 return std::all_of(primitive_states.begin(), primitive_states.end(),
55 [&](
const auto& entry) { return PrimitiveStateTrue(entry.second, state_name); });
67 const std::map<JointGroup, PrimitiveStates>& primitive_states,
68 const std::map<JointGroup, std::string>& state_names)
70 return std::all_of(primitive_states.begin(), primitive_states.end(), [&](
const auto& entry) {
71 if (!state_names.contains(entry.first)) {
85 inline std::array<double, 3>
Quat2EulerZYX(
const std::array<double, 4>& quat)
88 Eigen::Quaterniond q(quat[0], quat[1], quat[2], quat[3]);
91 auto euler_ZYX = q.toRotationMatrix().eulerAngles(2, 1, 0);
94 return (std::array<double, 3> {euler_ZYX[2], euler_ZYX[1], euler_ZYX[0]});
102 constexpr
double kPi = 3.14159265358979323846;
103 return (rad / kPi * 180.0);
110 inline std::array<double, N>
Rad2Deg(
const std::array<double, N>& rad_arr)
112 std::array<double, N> deg_arr;
113 for (
size_t i = 0; i < N; i++) {
114 deg_arr[i] =
Rad2Deg(rad_arr[i]);
122 inline std::vector<double>
Rad2Deg(
const std::vector<double>& rad_vec)
124 std::vector<double> deg_vec;
125 for (
const auto& v : rad_vec) {
138 template <
typename T>
140 const std::vector<T>& vec,
size_t decimal = 3,
const std::string& separator =
" ")
142 std::string padding =
"";
143 std::ostringstream oss;
144 oss.precision(decimal);
147 for (
const auto& v : vec) {
161 template <
typename T,
size_t N>
163 const std::array<T, N>& arr,
size_t decimal = 3,
const std::string& separator =
" ")
165 std::vector<T> vec(N);
166 std::copy(arr.begin(), arr.end(), vec.begin());
167 return Vec2Str(vec, decimal, separator);
180 if (
auto* val = std::get_if<int>(&variant)) {
181 return Vec2Str(std::vector<int> {*val}, decimal);
182 }
else if (
auto* val = std::get_if<double>(&variant)) {
183 return Vec2Str(std::vector<double> {*val}, decimal);
184 }
else if (
auto* val = std::get_if<std::string>(&variant)) {
186 }
else if (
auto* val = std::get_if<rdk::Coord>(&variant)) {
188 }
else if (
auto* vec = std::get_if<std::vector<int>>(&variant)) {
189 return Vec2Str(*vec, decimal, separator);
190 }
else if (
auto* vec = std::get_if<std::vector<double>>(&variant)) {
191 return Vec2Str(*vec, decimal, separator);
192 }
else if (
auto* vec = std::get_if<std::vector<std::string>>(&variant)) {
193 return Vec2Str(*vec, decimal, separator);
194 }
else if (
auto* vec = std::get_if<std::vector<rdk::Coord>>(&variant)) {
197 for (
const auto& v : (*vec)) {
198 ret += v.str() +
" : ";
202 ret.erase(ret.size() - 3);
219 for (
int i = 0; i < argc; i++) {
220 for (
const auto& v : ref_strings) {
221 if (v == std::string(argv[i])) {
Header file containing various constant expressions, data structures, and enums.
JointGroup
All possible joint groups of the robot.
std::variant< int, double, std::string, rdk::JPos, rdk::Coord, std::vector< int >, std::vector< double >, std::vector< std::string >, std::vector< rdk::JPos >, std::vector< rdk::Coord > > FlexivDataTypes
States data of a primitive.
std::map< std::string, FlexivDataTypes > names_and_values
std::array< double, 3 > Quat2EulerZYX(const std::array< double, 4 > &quat)
Convert quaternion to Euler angles with ZYX axis rotations.
bool ProgramArgsExist(int argc, char **argv, const std::string &ref_strings)
Check if one specific string exists in the program arguments.
std::string Vec2Str(const std::vector< T > &vec, size_t decimal=3, const std::string &separator=" ")
Convert an std::vector to a string.
bool IsSingleArmGroup(JointGroup group)
Whether the specified group represents a single arm.
bool PrimitiveStateTrue(const PrimitiveStates &primitive_states, const std::string &state_name)
Check whether one primitive state is true.
std::string FlexivTypes2Str(const rdk::FlexivDataTypes &variant, size_t decimal=3, const std::string &separator=" ")
Convert the commonly used std::variant to a string.
double Rad2Deg(double rad)
Convert radians to degrees for a single value.
bool ProgramArgsExistAny(int argc, char **argv, const std::vector< std::string > &ref_strings)
Check if any provided strings exist in the program arguments.
bool PrimitiveStateTrueForGroups(const std::map< JointGroup, PrimitiveStates > &primitive_states, const std::string &state_name)
Check whether one primitive state is true for all groups included in [primitive_states].
std::string Arr2Str(const std::array< T, N > &arr, size_t decimal=3, const std::string &separator=" ")
Convert an std::array to a string.