gusimplewhiteboard
HAL_ArmTarget.hpp
Go to the documentation of this file.
1
11#ifndef HalArmTarget_DEFINED
12#define HalArmTarget_DEFINED
13
14#include "wb_hal_armtarget.h"
15//#include <cmath>
16#include <sstream>
17
18//#ifndef M_PIF
19//#define M_PIF static_cast<float>(M_PI)
20//#endif // M_PIF
21
22namespace guWhiteboard
23{
62 {
63
64 public:
68// HalArmTarget(const uint8_t &target_arm = LEFT_ARM): wb_hal_armtarget(target_arm) {}
69
77 const float shoulderpitch = 0,
78 const float shoulderroll = 0,
79 const float elbowroll = 0,
80 const float elbowyaw = 0,
81 const float wristyaw = 0,
82 const float hand_PCT = 0,
83 const float shoulderpitchstiffness = 0,
84 const float shoulderrollstiffness = 0,
85 const float elbowrollstiffness = 0,
86 const float elbowyawstiffness = 0,
87 const float wristyawstiffness = 0,
88 const float handstiffness = 0,
89 const bool shoulderpitch_active = true,
90 const bool shoulderroll_active = true,
91 const bool elbowroll_active = true,
92 const bool elbowyaw_active = true,
93 const bool wrist_active = true,
94 const bool hand_active = true,
95 const int32_t movement_time = 1000000,
96 const uint8_t pliability = 10,
97 const bool arm_stop = false,
98 const bool inRadians = false)
100 {
101 if (inRadians) {
104 wristyaw, hand_PCT);
105 } else {
108 wristyaw, hand_PCT);
109 }
111 set_target_arm_stop(arm_stop);
121 }
122
123// HalArmTarget(const uint8_t &target_arm = LEFT_ARM,
124// const float shoulderpitch_DEG = 0,
125// const float shoulderroll_DEG = 0,
126// const float elbowroll_DEG = 0,
127// const float elbowyaw_DEG = 0,
128// const float wristyaw_DEG = 0,
129// const float hand_PCT = 0,
130// const float shoulderpitchstiffness = 0,
131// const float target_shoulderrollstiffness = 0,
132// const float target_elbowrollstiffness = 0,
133// const float target_elbowyawstiffness = 0,
134// const float target_wristyawstiffness = 0,
135// const bool shoulderpitch_active = true,
136// const bool shoulderroll_active = true,
137// const bool elbowroll_active = true,
138// const bool elbowyaw_active = true,
139// const bool wrist_active = true,
140// const bool hand_active = true,
141// const int32_t movement_time = 1000000,
142// set_target_pliability(pliability);
143// : wb_hal_armtarget(target_arm)
144// {
145// setPose_Deg(shoulderpitch_DEG, shoulderroll_DEG,
146// elbowroll_DEG, elbowyaw_DEG,
147// wristyaw_DEG, hand_PCT);
148// set_target_movement_time(movement_time);
149// set_shoulderpitchstiffness(shoulderpitchstiffness);
150// set_shoulderrollstiffness(shoulderrollstiffness);
151// set_elbowrollstiffness(elbowrollstiffness);
152// set_elbowyawstiffness(elbowyawstiffness);
153// set_wristyawstiffness(wristyawstiffness);
154// set_handstiffness(handstiffness);
155// setArmPliability(shoulderpitch_active, shoulderroll_active, elbowroll_active,
156// elbowyaw_active, wrist_active, hand_active);
157// }
158
159//MARK: Arm - General
168 void tieToArm(uint8_t arm)
169 {
170 set_target_arm(arm);
171 }
172
173//MARK: Arm - Movements
174
187 float shoulderroll,
188 float elbowroll,
189 float elbowyaw,
190 float wristyaw,
191 float hand,
192 int32_t time = INT_MAX)
193 {
196 wristyaw, hand);
198 }
199
212 float shoulderroll,
213 float elbowroll,
214 float elbowyaw,
215 float wristyaw,
216 float hand,
217 int32_t time = INT_MAX)
218 {
221 wristyaw, hand);
223 }
224
231 void stop() {
233 }
234
235
241 void ready() {
242 set_target_arm_stop(false);
243 }
244
245
256 void isAtGoal(bool goalReached)
257 {
258 set_target_arm_at_goal(goalReached);
259 }
260
273 bool atGoal()
274 {
275 return target_arm_at_goal();
276 }
277
291 {
292 int16_t shoulderpitchMargin = static_cast<int16_t>(abs(target_shoulderpitch() - status.target_shoulderpitch()));
293 int16_t shoulderrollMargin = static_cast<int16_t>(abs(target_shoulderroll() - status.target_shoulderroll()));
294 int16_t elbowrollMargin = static_cast<int16_t>(abs(target_elbowroll() - status.target_elbowroll()));
295 int16_t elbowyawMargin = static_cast<int16_t>(abs(target_elbowyaw() - status.target_elbowyaw()));
296 //#ifdef NAO_V3
297 // int16_t wristyawMargin = static_cast<int16_t>(abs(target_wristyaw - status.target_wristyaw()));
298 // uint8_t handMargin = static_cast<uint8_t>(abs(target_hand() - status.target_hand()));
299 if ( (shoulderpitchMargin <= tolerance.target_shoulderpitch())
300 && (shoulderrollMargin <= tolerance.target_shoulderroll())
301 && (elbowrollMargin <= tolerance.target_elbowroll())
302 && (elbowyawMargin <= tolerance.target_elbowyaw())
303 //#ifdef NAO_V3
304 // && (wristyawMargin <= tolerance.target_wristyaw())
305 // && (handMargin <= tolerance.target_hand())
306 )
307 {
308 return true;
309 }
310 return false;
311 }
312
313//MARK: Arm - Pose
314
326 float shoulderroll,
327 float elbowroll,
328 float elbowyaw,
329 float wristyaw,
330 float hand)
331 {
337 set_hand(hand);
338 }
339
351 float shoulderroll,
352 float elbowroll,
353 float elbowyaw,
354 float wristyaw,
355 float hand)
356 {
362 set_hand(hand);
363 }
364
365
372 void mirrorArm(const HalArmTarget &other)
373 {
374 // Roll and Yaw angles need to be mirrored, others just copied.
395 }
396
403 void copyPose(const HalArmTarget &other)
404 {
411 }
412
419 void mirrorPose(const HalArmTarget &other)
420 {
427 }
428
437 bool hasSamePose(const HalArmTarget &other)
438 {
439 if (
442 && target_elbowroll() == other.target_elbowroll()
443 && target_elbowyaw() == other.target_elbowyaw()
444 && target_wristyaw() == other.target_wristyaw()
445 && target_hand() == other.target_hand()
446 )
447 {
448 return true;
449 }
450 return false;
451 }
452
462 {
463 if (
466 && target_elbowroll() == -other.target_elbowroll()
467 && target_elbowyaw() == -other.target_elbowyaw()
468 && target_wristyaw() == -other.target_wristyaw()
469 && target_hand() == other.target_hand()
470 )
471 {
472 return true;
473 }
474 return false;
475 }
476
477//MARK: Arm - Stiffness
478
485 {
491 set_handstiffness(1.0f);
492 }
493
501 {
507 set_handstiffness(0.6f);
508 }
509
517 void setArmStiffness(float stiffness)
518 {
519 if ((stiffness <= 1.0f) && (stiffness >=0.0f)) {
521 set_shoulderrollstiffness(stiffness);
522 set_elbowrollstiffness(stiffness);
523 set_elbowyawstiffness(stiffness);
524 set_wristyawstiffness(stiffness);
525 set_handstiffness(stiffness);
526 }
527 }
528
535 {
541 set_handstiffness(0.0f);
542 }
543
544
551 void copyStiffness(const HalArmTarget &other)
552 {
559 }
560
561
562
571 {
572 if (
579 )
580 {
581 return true;
582 }
583 return false;
584 }
585
586//MARK: Arm - Pliability
587
598 {
605 }
606
619 {
626 }
627
628
635 bool elbowyaw, bool wristyaw, bool hand)
636 {
643 }
644
651 }
652
659 }
660
667 }
668
669//MARK: CUSTOM SETTERS (Converting floats into Integer representations)
671 void set_shoulderpitch_DEG(float setting) {
672 set_target_shoulderpitch(static_cast<int16_t>(setting * 10.0f));
673 }
674
675 void set_shoulderroll_DEG(float setting) {
676 set_target_shoulderroll(static_cast<int16_t>(setting * 10.0f));
677 }
678
679 void set_elbowroll_DEG(float setting) {
680 set_target_elbowroll(static_cast<int16_t>(setting * 10.0f));
681 }
682
683 void set_elbowyaw_DEG(float setting) {
684 set_target_elbowyaw(static_cast<int16_t>(setting * 10.0f));
685 }
686
687 void set_wristyaw_DEG(float setting) {
688 set_target_wristyaw(static_cast<int16_t>(setting * 10.0f));
689 }
690
692 void set_shoulderpitch_RAD(float setting) {
693 set_target_shoulderpitch(static_cast<int16_t>(setting* DEG_OVER_RAD_10));
694 }
695
696 void set_shoulderroll_RAD(float setting) {
697 set_target_shoulderroll(static_cast<int16_t>(setting * DEG_OVER_RAD_10));
698 }
699
700 void set_elbowroll_RAD(float setting) {
701 set_target_elbowroll(static_cast<int16_t>(setting * DEG_OVER_RAD_10));
702 }
703
704 void set_elbowyaw_RAD(float setting) {
705 set_target_elbowyaw(static_cast<int16_t>(setting * DEG_OVER_RAD_10));
706 }
707
708 void set_wristyaw_RAD(float setting) {
709 set_target_wristyaw(static_cast<int16_t>(setting * DEG_OVER_RAD_10));
710 }
711
713 void set_hand(float setting) {
714 set_target_hand(static_cast<uint8_t>(setting * 100.0f));
715 }
716
718 void set_shoulderpitchstiffness(float setting) {
719 set_target_shoulderpitchstiffness(static_cast<uint8_t>(setting * 100.0f));
720 }
721
722 void set_shoulderrollstiffness(float setting) {
723 set_target_shoulderrollstiffness(static_cast<uint8_t>(setting * 100.0f));
724 }
725
726 void set_elbowrollstiffness(float setting) {
727 set_target_elbowrollstiffness(static_cast<uint8_t>(setting * 100.0f));
728 }
729
730 void set_elbowyawstiffness(float setting) {
731 set_target_elbowyawstiffness(static_cast<uint8_t>(setting * 100.0f));
732 }
733
734 void set_wristyawstiffness(float setting) {
735 set_target_wristyawstiffness(static_cast<uint8_t>(setting * 100.0f));
736 }
737
738 void set_handstiffness(float setting) {
739 set_target_handstiffness(static_cast<uint8_t>(setting * 100.0f));
740 }
741
742
744// void set_movement_time(int32_t time) {
745// set_target_movement_time(time);
746// }
747
748//MARK: CUSTOM GETTERS (Converting Integer representations back to floats)
751 return static_cast<float>(target_shoulderpitch() * 0.1f);
752 }
753
755 return static_cast<float>(target_shoulderroll() * 0.1f);
756 }
757
759 return static_cast<float>(target_elbowroll() * 0.1f);
760 }
761
763 return static_cast<float>(target_elbowyaw() * 0.1f);
764 }
765
767 return static_cast<float>(target_wristyaw() * 0.1f);
768 }
769
772 return static_cast<float>(target_shoulderpitch()) * RAD_OVER_DEG_10;
773 }
774
776 return static_cast<float>(target_shoulderroll()) * RAD_OVER_DEG_10;
777 }
778
780 return static_cast<float>(target_elbowroll()) * RAD_OVER_DEG_10;
781 }
782
784 return static_cast<float>(target_elbowyaw()) * RAD_OVER_DEG_10;
785 }
786
788 return static_cast<float>(target_wristyaw()) * RAD_OVER_DEG_10;
789 }
790
792 float get_hand() {
793 return static_cast<float>(target_hand()) * 0.01f;
794 }
795
798 return static_cast<float>(target_shoulderpitchstiffness()) * 0.01f;
799 }
800
802 return static_cast<float>(target_shoulderrollstiffness()) * 0.01f;
803 }
804
806 return static_cast<float>(target_elbowrollstiffness()) * 0.01f;
807 }
808
810 return static_cast<float>(target_elbowyawstiffness()) * 0.01f;
811 }
812
814 return static_cast<float>(target_wristyawstiffness()) * 0.01f;
815 }
816
818 return static_cast<float>(target_handstiffness()) * 0.01f;
819 }
820
821//MARK: WHITEBOAR POSTER STRING CONVERSION & Description
822
826 std::string description() const
827 {
828 std::stringstream ss;
829 ss << static_cast<int>(target_shoulderpitch()) << " | "
830 << static_cast<int>(target_shoulderroll()) << " | "
831 << static_cast<int>(target_elbowroll()) << " | "
832 << static_cast<int>(target_elbowyaw()) << " | "
833 << static_cast<int>(target_wristyaw()) << " | "
834 << static_cast<int>(target_hand()) << " | "
835 << static_cast<int>(target_shoulderpitchstiffness()) << " | "
836 << static_cast<int>(target_shoulderrollstiffness()) << " | "
837 << static_cast<int>(target_elbowrollstiffness()) << " | "
838 << static_cast<int>(target_elbowyawstiffness()) << " | "
839 << static_cast<int>(target_wristyawstiffness()) << " | "
840 << static_cast<int>(target_handstiffness()) << " | "
841 << static_cast<int>(target_shoulderpitch_active()) << " | "
842 << static_cast<int>(target_shoulderroll_active()) << " | "
843 << static_cast<int>(target_elbowroll_active()) << " | "
844 << static_cast<int>(target_elbowyaw_active()) << " | "
845 << static_cast<int>(target_wrist_active()) << " | "
846 << static_cast<int>(target_hand_active()) << " | "
847 << static_cast<int>(target_movement_time()) << " | "
848 << static_cast<int>(target_pliability()) << " | "
849 << static_cast<int>(target_arm_at_goal()) << " | "
850 << static_cast<int>(target_arm_stop());
851 return ss.str();
852 }
853
854
855#ifdef WHITEBOARD_POSTER_STRING_CONVERSION
860 HalArmTarget(const std::string &str) { from_string(str); }
861
866 void from_string(const std::string &str)
867 {
868 fprintf(stderr, "NYI - Have it back: %s\n", const_cast<char *>(str.c_str()));
869 }
870
875#endif // WHITEBOARD_POSTER_STRING_CONVERSION
876 };
877}
878
879#endif //HAL_HeadTarget_DEFINED
Class for moving a SINGLE robotic arm with up to 6 degrees of freedom using local coords of each join...
void set_shoulderpitch_RAD(float setting)
Movement Setters (Radians)
void set_target_hand_active(const unsigned int &t_newValue)
unsigned int target_arm_stop() const
bool atTargetLocation(HalArmTarget status, HalArmTarget tolerance)
Client side test to determine if arm is at the target location, allowing for specified tolerances.
void set_shoulderpitchstiffness(float setting)
Stiffness Setters.
void set_target_wrist_active(const unsigned int &t_newValue)
void set_target_shoulderroll_active(const unsigned int &t_newValue)
void set_elbowrollstiffness(float setting)
void set_target_shoulderpitchstiffness(const uint8_t &t_newValue)
void set_target_arm_at_goal(const unsigned int &t_newValue)
void setArmStiffness(float stiffness)
Convenience function to set uniform stiffness on all arm joints to a custom value.
void setArmStiffnessNormal()
Convenience function to set the stiffness of all the arm's joints to what Aldebaran considers 'normal...
void stop()
Command the arm to stop at its current location and not act on motion commands until ready() is calle...
void setPose_Rad(float shoulderpitch, float shoulderroll, float elbowroll, float elbowyaw, float wristyaw, float hand)
Set Pose in radians.
void set_target_elbowroll(const int16_t &t_newValue)
uint8_t & target_wristyawstiffness()
void set_target_elbowrollstiffness(const uint8_t &t_newValue)
void set_wristyawstiffness(float setting)
void set_elbowroll_RAD(float setting)
unsigned int target_hand_active() const
void set_target_movement_time(const int32_t &t_newValue)
unsigned int target_elbowyaw_active() const
void set_target_elbowyawstiffness(const uint8_t &t_newValue)
uint8_t & target_shoulderrollstiffness()
void set_elbowyaw_DEG(float setting)
bool atGoal()
Arm at Goal Getter Clients/Machines should use this getter to test if the DCM has reported that the a...
void set_target_wristyaw(const int16_t &t_newValue)
void set_target_hand(const uint8_t &t_newValue)
uint8_t & target_elbowrollstiffness()
void ready()
Set arm to ready state (Default) The arm will act on motion commands.
void tieToArm(uint8_t arm)
Specify which arm this instance manages.
uint8_t & target_shoulderpitchstiffness()
uint8_t & target_elbowyawstiffness()
void setArmStiffnessOff()
Convenience function to turn off stiffness in all the arm's joints (0.0f).
void copyStiffness(const HalArmTarget &other)
Convenience function to copy stiffness settings from one HalArmTarget object to another.
void set_handstiffness(float setting)
void set_elbowyawstiffness(float setting)
void copyPose(const HalArmTarget &other)
Convenience function to copy pose settings from one HalArmTarget object to another.
void set_wristyaw_RAD(float setting)
void setArmPliability(bool shoulderpitch, bool shoulderroll, bool elbowroll, bool elbowyaw, bool wristyaw, bool hand)
Individually set the active/passive state of each joint.
void set_shoulderroll_RAD(float setting)
void set_target_wristyawstiffness(const uint8_t &t_newValue)
void setPose_Deg(float shoulderpitch, float shoulderroll, float elbowroll, float elbowyaw, float wristyaw, float hand)
Set Pose in degrees.
float get_hand()
Hand Movement Getter.
void set_target_arm_stop(const unsigned int &t_newValue)
void from_string(const std::string &str)
Parser for recreating this class (NYI)
void set_shoulderroll_DEG(float setting)
void set_target_elbowyaw_active(const unsigned int &t_newValue)
void set_target_shoulderrollstiffness(const uint8_t &t_newValue)
void set_shoulderpitch_DEG(float setting)
Movement Setters (Degrees)
unsigned int target_wrist_active() const
void set_target_handstiffness(const uint8_t &t_newValue)
void set_hand(float setting)
Hand Movement Setter.
void set_wristyaw_DEG(float setting)
void set_target_pliability(const uint8_t &t_newValue)
void goToWithTime_Rad(float shoulderpitch, float shoulderroll, float elbowroll, float elbowyaw, float wristyaw, float hand, int32_t time=INT_MAX)
move to position in radians over a given time
bool hasSamePose(const HalArmTarget &other)
Tests if this HalArmTarget object has the same pose settings as the other HalArmTarget object.
void set_target_arm(const uint8_t &t_newValue)
void mirrorPose(const HalArmTarget &other)
Convenience function to mirror pose settings about the XZ plane from one HalArmTarget object to anoth...
HalArmTarget(const uint8_t &target_arm=0, const float shoulderpitch=0, const float shoulderroll=0, const float elbowroll=0, const float elbowyaw=0, const float wristyaw=0, const float hand_PCT=0, const float shoulderpitchstiffness=0, const float shoulderrollstiffness=0, const float elbowrollstiffness=0, const float elbowyawstiffness=0, const float wristyawstiffness=0, const float handstiffness=0, const bool shoulderpitch_active=true, const bool shoulderroll_active=true, const bool elbowroll_active=true, const bool elbowyaw_active=true, const bool wrist_active=true, const bool hand_active=true, const int32_t movement_time=1000000, const uint8_t pliability=10, const bool arm_stop=false, const bool inRadians=false)
Constructor, defaults to LEFT_ARM.
void set_target_shoulderroll(const int16_t &t_newValue)
void set_elbowroll_DEG(float setting)
bool isArmAllActive()
Are all of the arm's joints set to active.
float get_shoulderpitchstiffness()
Stiffness Getters.
void set_target_shoulderpitch_active(const unsigned int &t_newValue)
unsigned int target_elbowroll_active() const
void setArmPassive()
Set arm to be Passive Manually moving the arm causes the arm to remain in the new position.
void goToWithTime_Deg(float shoulderpitch, float shoulderroll, float elbowroll, float elbowyaw, float wristyaw, float hand, int32_t time=INT_MAX)
move to position expressed in degrees over a given time
void set_target_elbowroll_active(const unsigned int &t_newValue)
void set_target_shoulderpitch(const int16_t &t_newValue)
bool hasSameMirroredPose(const HalArmTarget &other)
Tests if this HalArmTarget object has the same mirrored pose settings as the other HalArmTarget objec...
bool hasSameStiffness(const HalArmTarget &other)
Tests if this HalArmTarget object has the same stiffness settings as the other HalArmTarget object.
void setArmActive()
Set arm to be Active (DEDAULT DCM state) The arm is active and manual movements will be resisted,...
float get_shoulderpitch_RAD()
Movement Getters (Radians)
HalArmTarget(const std::string &str)
String constructor (NYI)
void set_elbowyaw_RAD(float setting)
unsigned int target_arm_at_goal() const
unsigned int target_shoulderpitch_active() const
void isAtGoal(bool goalReached)
Arm at Goal Setter Clients/Machines should not use this method.
void setArmStiffnessMax()
Convenience function to set the stiffness of all the arm's joints to the maximum (1....
unsigned int target_shoulderroll_active() const
void set_shoulderrollstiffness(float setting)
bool isArmPassive()
Are any of the arm's joints set to passive.
void mirrorArm(const HalArmTarget &other)
Convenience function to mirror arm settings about the XZ plane from one HalArmTarget object to anothe...
std::string description() const
Description function.
void set_target_elbowyaw(const int16_t &t_newValue)
bool isArmAllPassive()
Are all of the arm's joints set to passive.
float get_shoulderpitch_DEG()
Movement Getters (Degrees)
/file APM_Interface.h
HalArmTarget c struct.
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t wristyaw
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t wristyawstiffness
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t elbowyawstiffness
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool bool bool bool int32_t uint8_t pliability
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t elbowyaw
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t shoulderrollstiffness
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t shoulderpitch
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool bool bool bool hand_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool shoulderroll_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t elbowroll
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool bool bool wrist_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t handstiffness
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool shoulderpitch_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t shoulderroll
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool bool bool bool int32_t movement_time
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool bool elbowyaw_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t uint8_t bool bool bool elbowroll_active
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t hand
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t shoulderpitchstiffness
target_shoulderpitch target_elbowroll target_wristyaw target_hand target_shoulderrollstiffness target_elbowyawstiffness target_handstiffness int16_t int16_t int16_t int16_t int16_t uint8_t uint8_t uint8_t uint8_t elbowrollstiffness
#define LEFT_ARM