2022-11-11 19:49:41 +08:00
|
|
|
#ifndef _UNITREE_ARM_JOYSTICK_H_
|
|
|
|
#define _UNITREE_ARM_JOYSTICK_H_
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include "control/cmdPanel.h"
|
|
|
|
#include "message/joystick_common.h"
|
|
|
|
#include "message/aliengo_common.h"
|
|
|
|
#include "message/b1_common.h"
|
|
|
|
#include <math.h>
|
2022-11-14 10:19:31 +08:00
|
|
|
#include "message/udp.h"
|
2022-11-11 19:49:41 +08:00
|
|
|
|
|
|
|
using namespace UNITREE_LEGGED_SDK_ALIENGO;
|
|
|
|
// using namespace UNITREE_LEGGED_SDK_B1;
|
|
|
|
|
|
|
|
class UnitreeJoystick : public CmdPanel{
|
|
|
|
public:
|
|
|
|
UnitreeJoystick(std::vector<KeyAction*> events,
|
|
|
|
EmptyAction emptyAction, size_t channelNum = 1,
|
|
|
|
double dt = 0.002)
|
|
|
|
: CmdPanel(events, emptyAction, channelNum, dt){
|
2022-11-14 10:19:31 +08:00
|
|
|
_udp = new UDPPort("dog", "192.168.123.220", 8082, 8081);
|
|
|
|
_udp->resetIO(BlockYN::NO, HIGH_STATE_LENGTH, 500000);
|
2022-11-11 19:49:41 +08:00
|
|
|
_udpCmd = {0};
|
|
|
|
_udpState = {0};
|
|
|
|
_readThread = new LoopFunc("JoyStickRead", 0.0, boost::bind(&UnitreeJoystick::_read, this));
|
|
|
|
_runThread = new LoopFunc("CmdPanelRun", _dt, boost::bind(&UnitreeJoystick::_run, this));
|
|
|
|
_readThread->start();
|
|
|
|
_runThread->start();
|
|
|
|
};
|
|
|
|
~UnitreeJoystick(){
|
|
|
|
delete _runThread;
|
|
|
|
delete _readThread;
|
2022-11-14 10:19:31 +08:00
|
|
|
delete _udp;
|
2022-11-11 19:49:41 +08:00
|
|
|
};
|
|
|
|
private:
|
|
|
|
void _read(){
|
|
|
|
_udp->send((uint8_t*)&_udpCmd, HIGH_CMD_LENGTH);
|
|
|
|
_udp->recv((uint8_t*)&_udpState);
|
|
|
|
|
|
|
|
#ifdef CTRL_BY_ALIENGO_JOYSTICK
|
|
|
|
memcpy(&_keyData, _udpState.wirelessRemote, 40);
|
|
|
|
#else
|
|
|
|
memcpy(&_keyData, &_udpState.wirelessRemote[0], 40);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_extractCmd();
|
|
|
|
_updateState();
|
|
|
|
};
|
|
|
|
void _extractCmd(){
|
|
|
|
float joyThre = 0.5; // 手柄数值范围 +-1
|
|
|
|
|
|
|
|
if(((int)_keyData.btn.components.L1 == 1) &&
|
|
|
|
((int)_keyData.btn.components.L2 == 1)){
|
|
|
|
_keyCmd.c = "l12";
|
|
|
|
}else if((int)_keyData.btn.components.R2 == 1){
|
|
|
|
_keyCmd.c = "r2";
|
|
|
|
if((int)_keyData.btn.components.X == 1){
|
|
|
|
_keyCmd.c = "r2x";
|
|
|
|
}
|
|
|
|
}else if((int)_keyData.btn.components.R1 == 1){
|
|
|
|
_keyCmd.c = "r1";
|
|
|
|
}else if(fabs(_keyData.lx) > joyThre){
|
|
|
|
_keyData.lx > joyThre?_keyCmd.c = "left_left":_keyCmd.c = "left_right";
|
|
|
|
}else if(fabs(_keyData.ly) > joyThre){
|
|
|
|
_keyData.ly > joyThre?_keyCmd.c = "left_up":_keyCmd.c = "left_down";
|
|
|
|
}else if((int)_keyData.btn.components.up == 1){
|
|
|
|
_keyCmd.c = "up";
|
|
|
|
}else if((int)_keyData.btn.components.down == 1){
|
|
|
|
_keyCmd.c = "down";
|
|
|
|
}else if(fabs(_keyData.rx) > joyThre){
|
|
|
|
_keyData.rx > joyThre?_keyCmd.c = "right_left":_keyCmd.c = "right_right";
|
|
|
|
}else if(fabs(_keyData.ry) > joyThre){
|
|
|
|
_keyData.ry > joyThre?_keyCmd.c = "right_up":_keyCmd.c = "right_down";
|
|
|
|
}else if((int)_keyData.btn.components.Y == 1){
|
|
|
|
_keyCmd.c = "Y";
|
|
|
|
}else if((int)_keyData.btn.components.A == 1){
|
|
|
|
_keyCmd.c = "A";
|
|
|
|
}else if((int)_keyData.btn.components.X == 1){
|
|
|
|
_keyCmd.c = "X";
|
|
|
|
}else if((int)_keyData.btn.components.B == 1){
|
|
|
|
_keyCmd.c = "B";
|
|
|
|
}else if((int)_keyData.btn.components.right == 1){
|
|
|
|
_keyCmd.c = "left";
|
|
|
|
}else if((int)_keyData.btn.components.left == 1){
|
|
|
|
_keyCmd.c = "right";
|
|
|
|
}else if((int)_keyData.btn.components.up == 1){
|
|
|
|
_keyCmd.c = "up";
|
|
|
|
}else if((int)_keyData.btn.components.down == 1){
|
|
|
|
_keyCmd.c = "down";
|
|
|
|
}else if((int)_keyData.btn.components.select == 1){
|
|
|
|
_keyCmd.c = "select";
|
|
|
|
}else{
|
|
|
|
_releaseKeyboard();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
_pressKeyboard();
|
|
|
|
};
|
|
|
|
|
|
|
|
xRockerBtnDataStruct _keyData;
|
|
|
|
UDPPort *_udp;
|
|
|
|
HighCmd _udpCmd;
|
|
|
|
HighState _udpState;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _UNITREE_ARM_JOYSTICK_H_
|