RflySimSDK v4.11
RflySimSDK说明文档
载入中...
搜索中...
未找到
rfly_unitree.h
1#pragma once
2
4#include <math.h>
5#include <stdio.h>
6#include <string.h>
7#include <vector>
8#include <algorithm> // std::transform
9#include <cctype>
10#include "rfly_data.h"
11#include "rfly_udp.h"
12
13#define MAX_BUF_LEN 300 // More than max mavlink msg len
14
15enum UnitreeDogMode{
16 Damp = 1,
17 BalanceStand,
18 StopMove,
19 PStandUp,
20 StandDown,
21 RecoveryStand,
22 Sit,
23 RiseSit,
24 SwitchGait,
25 BodyHeight,
26 FootRaiseHeight,
27 SpeedLevel,
28 Hello,
29 Stretch,
30 SwitchJoystick,
31 ContinuousGait,
32 Wallow,
33 Pose,
34 Scrape,
35 FrontFlip,
36 FrontJump,
37 FrontPounce,
38 Dance
39};
40
41class RflyUnitree {
42 public:
43
44 RflySimData data;
45 UDPServer udp;
46
47 //MavHealthData phm;
48 std::string TargetIP;
49 int TargetPort;
50 int CopterID;
51 int RecvPort;
52 std::string RecvIP;
53 char buf[MAX_BUF_LEN+1];
54 bool isUpdate=false;
55 bool isRcc=false;
56 double GpsOrin[3]={0};
57 bool isReal=false;
58
59
60 int SelfCheckMainState=0;
61 int SelfCheckSubState=0;
62 double lastTime=0;
63
64
65 int offCtrlState=0;
66 double offLastTime=0;
67
68 uint64_t m_start_time = 0;
69 GenericInOut28 m_cmd;
70 GenericInOut28 m_recv;
71 SOut2Simulator m_recv_ue;
72 Ue4ExtMsg m_send_ue;
73
74 // Dog status, the output of S func
75 double m_global_pos[3] = {0};
76 double m_ang_euler[3] = {0};
77 double m_local_pos[3] = {0};
78 double m_local_vel[3] = {0};
79 double m_battery_info = 100;
80
81 RflyUnitree(){
82 m_cmd.ioSilInts[0] = 5;
83 m_send_ue.checksum = 1234567894;
84 }
85 ~RflyUnitree(){
86
87 }
88
89 bool RecvNoblock(){
90 int retry = 0;
91 while(true){ // Read all data in the upd buf zone
92 int recvlen=udp.RecvNoblock(buf,RecvIP,RecvPort,MAX_BUF_LEN);
93
94 // Five times has no useful message, will break
95 if (udp.needFilter && (RecvIP != TargetIP)){
96 retry++;
97 if (retry > 5)
98 break;
99 continue;
100 }
101 retry = 0;
102 if(recvlen>0){
103 onUdpMessage((uint8_t*)buf, recvlen);
104 isUpdate=true;
105 }else{
106 break;
107 }
108 }
109 return isUpdate;
110 }
111
112 void onUdpMessage(uint8_t *buf, int recvlen){
113 if(isReal){
114 if (recvlen == sizeof(GenericInOut28)){
115 unpackStruct(buf, m_recv);
116 for (int i = 0; i < 3; i++){
117 m_global_pos[i] = m_recv.ioSilFloats[i];
118 m_ang_euler[i] = m_recv.ioSilFloats[i+3];
119 m_local_pos[i] = m_recv.ioSilFloats[i+6];
120 m_local_vel[i] = m_recv.ioSilFloats[i+9];
121 }
122 m_battery_info = m_recv.ioSilFloats[12];
123 }
124
125 }
126 else{
127 if (recvlen == sizeof(SOut2Simulator)){
128 unpackStruct(buf, m_recv_ue);
129 for (int i = 0; i < 3; i++){
130 m_global_pos[i] = m_recv_ue.PosE[i];
131 m_ang_euler[i] = m_recv_ue.AngEuler[i];
132 m_local_pos[i] = m_recv_ue.PosE[i];
133 m_local_vel[i] = m_recv_ue.VelE[i];
134 }
135 }
136 }
137 }
138
139 void SendMsg(){
140 unsigned int length;
141 if (isReal){
142 length = packStruct(m_cmd, (uint8_t*)buf);
143 }
144 else{
145 length = packStruct(m_send_ue, (uint8_t*)buf);
146 }
147
148 if(length>0){
149 buf[length]='0';
150 udp.SendTo((const char *)buf,length,TargetIP,TargetPort);
151 // std::cout << "send message to TargetIP \t"<<TargetIP << "TargetPort\t" << TargetPort << std::endl;
152 }
153 }
154
155 void setBit(int &num, int n) {
156 // 生成掩码:第n位为1,其余位为0
157 int mask = 1 << n;
158 // 执行按位或操作,将第n位设为1
159 num = num | mask;
160 }
161
162
163 void SendSetAction(int mode)
164 {
165 m_cmd.ioSilInts[1] = 0;
166 setBit(m_cmd.ioSilInts[1], 0);
167 setBit(m_cmd.ioSilInts[1], 5);
168 m_cmd.ioSilInts[2] = mode;
169 SendMsg();
170 }
171
172 void SendMove(float vx, float vy, float yaw_rate)
173 {
174 m_cmd.ioSilInts[1] = 0;
175 setBit(m_cmd.ioSilInts[1], 0);
176 setBit(m_cmd.ioSilInts[1], 19);
177 m_cmd.ioSilFloats[3] = vx;
178 m_cmd.ioSilFloats[4] = vy;
179 m_cmd.ioSilFloats[14] = yaw_rate;
180 SendMsg();
181 }
182
183 bool isBitTrue(uint32_t value, int bitIndex) {
184 return (value & (1U << bitIndex)) != 0;
185 }
186
187 // input vector, input dim, sim time (s)
188 void SendMavlinkReal(double **u, double t){
189
190 int cmdBitmap = (int)*u[1];
191 int typeMask = (int)*u[2];
192
193 if (isBitTrue(cmdBitmap, 0)){
194 if (isBitTrue(cmdBitmap, 5)){
195 // std::cout << "SendSetAction: " <<typeMask << std::endl;
196 SendSetAction(typeMask);
197 }
198 }
199 if (isBitTrue(cmdBitmap, 19)){
200 // std::cout << "SendMove: " <<(float)*u[11] << "\t" << (float)*u[12] << "\t" << (float)*u[22] << std::endl;
201 SendMove((float)*u[11], (float)*u[12], (float)*u[22]);
202 }
203 }
204
205 void SendUECtrl(double **u, double t){
206 int cmdBitmap = (int)*u[1];
207 int typeMask = (int)*u[2];
208 m_send_ue.runnedTime = t;
209 for (int i=0; i< 16; i++)
210 m_send_ue.ExtToUE4[i] = 0;
211 if (isBitTrue(cmdBitmap, 0)){
212 if (isBitTrue(cmdBitmap, 5)){
213 m_send_ue.ExtToUE4[0] = 2;
214 m_send_ue.ExtToUE4[1] = typeMask;
215 SendMsg();
216 }
217 }
218 if (isBitTrue(cmdBitmap, 19)){
219 m_send_ue.ExtToUE4[0] = 26112;
220 m_send_ue.ExtToUE4[8] = -*u[22];
221 m_send_ue.ExtToUE4[9] = *u[11];
222 m_send_ue.ExtToUE4[10] = -*u[12];
223 m_send_ue.ExtToUE4[14] = 2;
224 SendMsg();
225 }
226
227 }
228
229};
定义 rfly_udp.h:558
定义 rfly_udp.h:195
定义 rfly_data.h:93
定义 rfly_data.h:291
定义 rfly_data.h:332