22 * @example basics3_primitive_execution.cpp
33 * This tutorial executes several basic robot primitives (unit skills). For detailed documentation
44 * on all available primitives, please see [Flexiv Primitives](https://www.flexiv.com/primitives/).
5- * @copyright Copyright (C) 2016-2025 Flexiv Ltd. All Rights Reserved.
5+ * @copyright Copyright (C) 2016-2026 Flexiv Ltd. All Rights Reserved.
66 * @author Flexiv
77 */
88
1313#include < iostream>
1414#include < iomanip>
1515#include < thread>
16+ #include < algorithm>
1617
1718using namespace flexiv ;
1819
@@ -74,6 +75,9 @@ int main(int argc, char* argv[])
7475
7576 // Execute Primitives
7677 // =========================================================================================
78+ // All available joint groups of the robot
79+ const auto joint_groups = robot.groups ();
80+
7781 // Switch to primitive execution mode
7882 robot.SwitchMode (rdk::Mode::NRT_PRIMITIVE_EXECUTION);
7983
@@ -84,10 +88,17 @@ int main(int argc, char* argv[])
8488 spdlog::info (" Executing primitive: Home" );
8589
8690 // Send command to robot
87- robot.ExecutePrimitive (" Home" , std::map<std::string, rdk::FlexivDataTypes> {});
91+ std::map<rdk::JointGroup, rdk::PrimitiveArgs> pt_args;
92+ for (const auto & group : joint_groups) {
93+ pt_args[group] = rdk::PrimitiveArgs (" Home" , {});
94+ }
95+ robot.ExecutePrimitive (pt_args);
8896
8997 // Wait for reached target
90- while (!std::get<int >(robot.primitive_states ()[" reachedTarget" ])) {
98+ while (!std::all_of (joint_groups.begin (), joint_groups.end (), [&robot](const auto & group) {
99+ return std::get<int >(
100+ robot.primitive_states ().at (group).names_and_values .at (" reachedTarget" ));
101+ })) {
91102 std::this_thread::sleep_for (std::chrono::seconds (1 ));
92103 }
93104
@@ -103,24 +114,35 @@ int main(int argc, char* argv[])
103114 spdlog::info (" Executing primitive: MoveJ" );
104115
105116 // Send command to robot
106- robot.ExecutePrimitive (" MoveJ" ,
107- {
108- {" target" , rdk::JPos ({30 , -45 , 0 , 90 , 0 , 40 , 30 }, {-50 , 30 })},
109- {" waypoints" ,
110- std::vector<rdk::JPos> {rdk::JPos ({10 , -30 , 10 , 30 , 10 , 15 , 10 }, {-15 , 10 }),
111- rdk::JPos ({20 , -60 , -10 , 60 , -10 , 30 , 20 }, {-30 , 20 })}},
112- });
117+ pt_args.clear ();
118+ for (const auto & group : joint_groups) {
119+ pt_args[group] = rdk::PrimitiveArgs (" MoveJ" ,
120+ {
121+ {" target" , rdk::JPos ({30 , -45 , 0 , 90 , 0 , 40 , 30 }, {-50 , 30 })},
122+ {" waypoints" ,
123+ std::vector<rdk::JPos> {rdk::JPos ({10 , -30 , 10 , 30 , 10 , 15 , 10 }, {-15 , 10 }),
124+ rdk::JPos ({20 , -60 , -10 , 60 , -10 , 30 , 20 }, {-30 , 20 })}},
125+ });
126+ }
127+ robot.ExecutePrimitive (pt_args);
113128
114129 // Most primitives won't exit by themselves and require users to explicitly trigger
115130 // transitions based on specific primitive states. Here we check if the primitive state
116131 // [reachedTarget] becomes true and trigger the transition manually by sending a new
117132 // primitive command.
118- while (!std::get<int >(robot.primitive_states ()[" reachedTarget" ])) {
133+ while (!std::all_of (joint_groups.begin (), joint_groups.end (), [&robot](const auto & group) {
134+ return std::get<int >(
135+ robot.primitive_states ().at (group).names_and_values .at (" reachedTarget" ));
136+ })) {
119137 // Print current primitive states
120138 spdlog::info (" Current primitive states:" );
121- for (const auto & st : robot.primitive_states ()) {
122- std::cout << st.first << " : " << rdk::utility::FlexivTypes2Str (st.second );
123- std::cout << std::endl;
139+ for (const auto & group : joint_groups) {
140+ std::cout << rdk::kJointGroupNames .at (group) << " :" << std::endl;
141+ const auto primitive_states = robot.primitive_states ().at (group).names_and_values ;
142+ for (const auto & st : primitive_states) {
143+ std::cout << st.first << " : " << rdk::utility::FlexivTypes2Str (st.second );
144+ std::cout << std::endl;
145+ }
124146 }
125147 std::this_thread::sleep_for (std::chrono::seconds (1 ));
126148 }
@@ -138,19 +160,25 @@ int main(int argc, char* argv[])
138160 spdlog::info (" Executing primitive: MoveL" );
139161
140162 // Send command to robot
141- robot.ExecutePrimitive (" MoveL" ,
142- {
143- {" target" , rdk::Coord ({0.65 , -0.3 , 0.2 }, {180 , 0 , 180 }, {" WORLD" , " WORLD_ORIGIN" })},
144- {" waypoints" ,
145- std::vector<rdk::Coord> {
146- rdk::Coord ({0.45 , 0.1 , 0.2 }, {180 , 0 , 180 }, {" WORLD" , " WORLD_ORIGIN" }),
147- rdk::Coord ({0.45 , -0.3 , 0.2 }, {180 , 0 , 180 }, {" WORLD" , " WORLD_ORIGIN" })}},
148- {" vel" , 0.6 },
149- {" zoneRadius" , " Z50" },
150- });
163+ pt_args.clear ();
164+ for (const auto & group : joint_groups) {
165+ pt_args[group] = rdk::PrimitiveArgs (" MoveL" ,
166+ {{" target" ,
167+ rdk::Coord ({0.3 , -0.1 , 0.2 }, {160 , 20 , 180 }, {" WORLD" , " WORLD_ORIGIN" })},
168+ {" waypoints" ,
169+ std::vector<rdk::Coord> {rdk::Coord ({0.1 , 0.1 , 0.1 }, {-160 , -20 , 180 },
170+ {" WORLD" , " WORLD_ORIGIN" }),
171+ rdk::Coord ({0.3 , 0.2 , 0.1 }, {180 , 0 , 180 }, {" WORLD" , " WORLD_ORIGIN" })}},
172+
173+ {" vel" , 0.6 }, {" zoneRadius" , " Z50" }});
174+ }
175+ robot.ExecutePrimitive (pt_args);
151176
152177 // Wait for reached target
153- while (!std::get<int >(robot.primitive_states ()[" reachedTarget" ])) {
178+ while (!std::all_of (joint_groups.begin (), joint_groups.end (), [&robot](const auto & group) {
179+ return std::get<int >(
180+ robot.primitive_states ().at (group).names_and_values .at (" reachedTarget" ));
181+ })) {
154182 std::this_thread::sleep_for (std::chrono::seconds (1 ));
155183 }
156184
@@ -166,13 +194,20 @@ int main(int argc, char* argv[])
166194 auto targetEulerDeg = rdk::utility::Rad2Deg (rdk::utility::Quat2EulerZYX (targetQuat));
167195
168196 // Send command to robot. This motion will hold current TCP position and only do rotation
169- robot.ExecutePrimitive (
170- " MoveL" , {
171- {" target" , rdk::Coord ({0.0 , 0.0 , 0.0 }, targetEulerDeg, {" TRAJ" , " START" })},
172- {" vel" , 0.2 },
173- });
197+ pt_args.clear ();
198+ for (const auto & group : joint_groups) {
199+ pt_args[group] = rdk::PrimitiveArgs (" MoveL" ,
200+ {
201+ {" target" , rdk::Coord ({0.0 , 0.0 , 0.0 }, targetEulerDeg, {" TRAJ" , " START" })},
202+ {" vel" , 0.2 },
203+ });
204+ }
205+ robot.ExecutePrimitive (pt_args);
174206 // Wait for reached target
175- while (!std::get<int >(robot.primitive_states ()[" reachedTarget" ])) {
207+ while (!std::all_of (joint_groups.begin (), joint_groups.end (), [&robot](const auto & group) {
208+ return std::get<int >(
209+ robot.primitive_states ().at (group).names_and_values .at (" reachedTarget" ));
210+ })) {
176211 std::this_thread::sleep_for (std::chrono::seconds (1 ));
177212 }
178213
0 commit comments