diff --git a/src/include/Djitellowhite.h b/src/include/Djitellowhite.h new file mode 100644 index 0000000..bfaa936 --- /dev/null +++ b/src/include/Djitellowhite.h @@ -0,0 +1,80 @@ +#ifndef _DJITELLOWHITE_H +#define _DJITELLOWHITE_H +#include +#include +#include +#include +#include +#include +/*Library for interacting with DJI Ryze Tello drones.*/ + + +//coding = utf - 8 + +/* """C++ wrapper to interact with the Ryze Tello drone using the official Tello api. + Tello API documentation: + [1.3](https://dl-cdn.ryzerobotics.com/downloads/tello/20180910/Tello%20SDK%20Documentation%20EN_1.3.pdf) +*/ + +#define RESPONSE_TIMEOUT 7 //in seconds +#define TAKEOFF_TIMEOUT 20 //in seconds +#define FRAME_GRAB_TIMEOUT 3 +#define TIME_BTW_COMMANDS 0.1 //in seconds +#define TIME_BTW_RC_CONTROL_COMMANDS 0.001 //in seconds +#define RETRY_COUNT 3 //number of retries after a failed command + + +//Video stream, server socket +#define VS_UDP_IP "0.0.0.0" +#define VS_UDP_PORT 11111 + +#define CONTROL_UDP_PORT 8889 +#define STATE_UDP_PORT 8890 + +#define BUFFER_SIZE 1024 +//Constants for video settings +#define BITRATE_AUTO 0 +#define BITRATE_1MBPS 1 +#define BITRATE_2MBPS 2 +#define BITRATE_3MBPS 3 +#define BITRATE_4MBPS 4 +#define BITRATE_5MBPS 5 +#define RESOLUTION_480P "low" +#define RESOLUTION_720P "high" +#define FPS_5 "low" +#define FPS_15 "middle" +#define FPS_30 "high" +#define CAMERA_FORWARD 0 +#define CAMERA_DOWNWARD 1 +//日志模块暂时不写 + +class Tello { +private: + int sock; + bool stream_on; + unsigned long host; +public: + Tello(const char* IP); + ~Tello(); + void set_conf(int socket); + unsigned long gethost(); + void get_connect(sockaddr_in serveraddr); + void takeoff(sockaddr_in serveraddr); + void land(sockaddr_in serveraddr); + void forward(sockaddr_in serveraddr); + void back(sockaddr_in serveraddr); + void left(sockaddr_in serveraddr); + void right(sockaddr_in serveraddr); + void up(sockaddr_in serveraddr); + void down(sockaddr_in serveraddr); + void cw(sockaddr_in serveraddr); + void ccw(sockaddr_in serveraddr); + bool send_message(char* msg,sockaddr_in server_addr,int timeout = RESPONSE_TIMEOUT); + static void *udp_response_receiver(void* arg); + void get_video(sockaddr_in serveraddr); +}; + + + + +#endif diff --git a/src/include/Hardwarelistener.h b/src/include/Hardwarelistener.h new file mode 100644 index 0000000..599fa82 --- /dev/null +++ b/src/include/Hardwarelistener.h @@ -0,0 +1,6 @@ +#ifndef _HARDWARELISTENER_H +#define _HARDWARELISTENER_H +#include "Djitellowhite.h" +int listenkeyboard(Tello T,sockaddr_in serveraddr); +int scanKeyboard(); +#endif diff --git a/src/main/Djitellowhite.cpp b/src/main/Djitellowhite.cpp new file mode 100644 index 0000000..c8a8f52 --- /dev/null +++ b/src/main/Djitellowhite.cpp @@ -0,0 +1,146 @@ +#include"Djitellowhite.h" +#include +#include + + +#include +#include +#include + +#include +#include + +using namespace cv; +using namespace std; +Tello::Tello(const char* IP) { + this->stream_on=false; + this->host = inet_addr(IP); + cout << "create successfully!" << endl; + +} +Tello::~Tello() {} +void Tello::set_conf(int socket){ + this->sock = socket; +} +void Tello::get_connect(sockaddr_in serveraddr) { + char tmp[10] = {"command"}; + send_message(tmp,serveraddr,0);// 0 -> timeout + cout << "connect successfully!" <host; +} +void Tello::takeoff(sockaddr_in serveraddr) { + char tmp[10] = {"takeoff"}; + send_message(tmp,serveraddr,0);// 0 -> timeout + cout << "takeoff successfully!" < timeout + cout << "land successfully!" <sock,buffer,strlen(buffer),0,(struct sockaddr *)&server_addr, sizeof(server_addr)); + return true; +} +void* Tello::udp_response_receiver(void* arg){ + //int m_SockServer; //创建socket对象 + //sockaddr_in serveraddr; //创建sockaddr_in对象储存自身信息(当有多个端口,可以多个绑定) + //sockaddr_in serveraddrfrom; + + //serveraddr.sin_family = AF_INET; //设置服务器地址家族 + //serveraddr.sin_port = htons(8889); //设置服务器端口号 + //serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0"); + //m_SockServer = socket(AF_INET, SOCK_DGRAM, 0); //创建一个临时变量并赋值给m_SockServer + //int i = bind(m_SockServer, (sockaddr*)&serveraddr, sizeof(serveraddr)); //把名字和套接字绑定 + //std::cout << "bind:" << i << std::endl; + + int socket = *(int *)arg; + + cout << "receive start" << endl; + while(1){ + char buffer[20]; + int iret; + memset(buffer,0,sizeof(buffer)); + + iret = recv(socket, buffer,20,MSG_WAITALL); + if(iret > 0 && iret <10){ + printf("Message from tello: %s\n", buffer); + } + } +} +void Tello::forward(sockaddr_in serveraddr){ + char tmp[15] = {"forward 20"}; + send_message(tmp,serveraddr,0);// 0 -> timeout + cout << "forward successfully!" < timeout + cout << "back successfully!" < timeout + cout << "left successfully!" < timeout + cout << "right successfully!" < timeout + cout << "up successfully!" < timeout + cout << "down successfully!" < timeout + cout << "cw successfully!" < timeout + cout << "ccw successfully!" <stream_on = true; + + cout << "vid"; + VideoCapture cap("udp://@0.0.0.0:11111"); + cout << "cap"; + if(!cap.isOpened()){ + cout << "fuck off"; + return; + } + + Mat frame; + cout << "continue!"; + while(1){ + cap>>frame; + if(frame.empty()) + break; + imshow("video",frame); + waitKey(20); + + } + cap.release(); + + +} diff --git a/src/main/Djitellowhite.o b/src/main/Djitellowhite.o new file mode 100644 index 0000000..12a9638 Binary files /dev/null and b/src/main/Djitellowhite.o differ diff --git a/src/main/Triplet.cpp b/src/main/Triplet.cpp new file mode 100644 index 0000000..9c0ef65 --- /dev/null +++ b/src/main/Triplet.cpp @@ -0,0 +1,45 @@ +#include"Djitellowhite.h" +#include"Hardwarelistener.h" +#include +using namespace std; +int main(void){ + Tello T("192.168.10.1"); + int socket_fd, err; + + if((socket_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) + { + cout << "initialized error" << endl; + cout << 0; + return -1; + } + + //cout << 1 << socket_fd; + T.set_conf(socket_fd); + + pthread_t thread_receive; + err = pthread_create(&thread_receive,nullptr,T.udp_response_receiver,&socket_fd); + sleep(3); + struct sockaddr_in serveraddr; + memset(&serveraddr,0,sizeof(serveraddr)); + serveraddr.sin_family=AF_INET; + serveraddr.sin_addr.s_addr=T.gethost(); + serveraddr.sin_port=htons(CONTROL_UDP_PORT); + + + + if(err!=0) + { + cout << err << " " << "can't create thread"; + } + + T.get_connect(serveraddr); + //sleep(1); + //T.takeoff(serveraddr); + T.get_video(serveraddr); + sleep(5); + //T.land(serveraddr); + + pthread_join(thread_receive,NULL); + listenkeyboard(T,serveraddr); + return 0; +} diff --git a/src/main/keyboard.cpp b/src/main/keyboard.cpp new file mode 100644 index 0000000..dcf3ade --- /dev/null +++ b/src/main/keyboard.cpp @@ -0,0 +1,57 @@ +#include +#include +#include "Hardwarelistener.h" +#include + +using namespace std; +int scanKeyboard() +{ + + int in; + + struct termios new_settings; + struct termios stored_settings; + //设置终端参数 + tcgetattr(0,&stored_settings); + new_settings = stored_settings; + new_settings.c_lflag &= (~ICANON); + new_settings.c_cc[VTIME] = 0; + tcgetattr(0,&stored_settings); + new_settings.c_cc[VMIN] = 1; + tcsetattr(0,TCSANOW,&new_settings); + in = getchar(); + tcsetattr(0,TCSANOW,&stored_settings); + + return in; + +} + +//测试函数 +int listenkeyboard(Tello T, sockaddr_in serveraddr){ + while(1){ + switch(scanKeyboard()) + { + case (int)'w': + cout << "forward"<< endl; + T.forward(serveraddr); + break; + case (int)'s': + cout << "back" << endl; + T.back(serveraddr); + break; + case (int)'a': + cout << "left" < +#include +#include +#include +#include +#include +#include +#include +#define PORT 8890 + +void udp_server(int sockfd) +{ + + socklen_t len; + char buf[1024] = {0}; + struct sockaddr_in server_addr; + int n; + int opt = 1; + len = sizeof(server_addr); + memset(&buf, 0, sizeof(buf)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = htonl(INADDR_ANY); + server_addr.sin_port = htons(PORT); + + setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //当服务器非正常断开的时候重启服务器,不会进入TIME_WAIT状态 + + if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + printf("can not bind\n"); + exit(1); + } + + while (1) { + printf("========wait for client's request========\n"); + n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&server_addr, &len); + buf[n] = '\0'; + printf("receive client's data: %s\n", buf); + sendto(sockfd, buf, n, 0, (struct sockaddr *)&server_addr, len); + printf("send data to client: %s\n", buf); + } + + close(sockfd); +} + +int main(int argc, char **argv) +{ + int sockfd; + + if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { + printf("create socket false\n"); + exit(1); + } + + udp_server(sockfd); + + exit(0); +} + +