From f8bbafdc2dd061a136d83bd9f671888e9f272ab6 Mon Sep 17 00:00:00 2001 From: gehongbo <1512161085@qq.com> Date: Wed, 4 May 2022 14:47:54 +0800 Subject: [PATCH] add --- src/Djitellowhite/Djitellowhite.cpp | 106 ++++++++++++++++++++++++++ src/Djitellowhite/Djitellowhite.h | 72 +++++++++++++++++ src/Djitellowhite/Hardwarelistener.h | 6 ++ src/Djitellowhite/T | Bin 0 -> 31008 bytes src/Djitellowhite/Triplet.cpp | 45 +++++++++++ src/Djitellowhite/keyboard.cpp | 52 +++++++++++++ src/Djitellowhite/libDjitellowhite.so | Bin 0 -> 18152 bytes src/Djitellowhite/makefile | 21 +++++ src/Djitellowhite/server.cpp | 58 ++++++++++++++ src/Djitellowhite/test | Bin 0 -> 31008 bytes 10 files changed, 360 insertions(+) create mode 100644 src/Djitellowhite/Djitellowhite.cpp create mode 100644 src/Djitellowhite/Djitellowhite.h create mode 100644 src/Djitellowhite/Hardwarelistener.h create mode 100755 src/Djitellowhite/T create mode 100644 src/Djitellowhite/Triplet.cpp create mode 100644 src/Djitellowhite/keyboard.cpp create mode 100755 src/Djitellowhite/libDjitellowhite.so create mode 100644 src/Djitellowhite/makefile create mode 100644 src/Djitellowhite/server.cpp create mode 100755 src/Djitellowhite/test diff --git a/src/Djitellowhite/Djitellowhite.cpp b/src/Djitellowhite/Djitellowhite.cpp new file mode 100644 index 0000000..9ebb3b5 --- /dev/null +++ b/src/Djitellowhite/Djitellowhite.cpp @@ -0,0 +1,106 @@ +#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::get_video(sockaddr_in serveraddr){ + + char tmp[10] = {"streamon"}; + send_message(tmp,serveraddr,0); + cout << "stream_on 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/Djitellowhite/Djitellowhite.h b/src/Djitellowhite/Djitellowhite.h new file mode 100644 index 0000000..b311e46 --- /dev/null +++ b/src/Djitellowhite/Djitellowhite.h @@ -0,0 +1,72 @@ +#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); + 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/Djitellowhite/Hardwarelistener.h b/src/Djitellowhite/Hardwarelistener.h new file mode 100644 index 0000000..176cde8 --- /dev/null +++ b/src/Djitellowhite/Hardwarelistener.h @@ -0,0 +1,6 @@ +#ifndef _HARDWARELISTENER_H +#define _HARDWARELISTENER_H + +int listenkeyboard(); +int scanKeyboard(); +#endif diff --git a/src/Djitellowhite/T b/src/Djitellowhite/T new file mode 100755 index 0000000000000000000000000000000000000000..b2cf1f764804d29794150c851830b28ce045ace3 GIT binary patch literal 31008 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 +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(); + return 0; +} diff --git a/src/Djitellowhite/keyboard.cpp b/src/Djitellowhite/keyboard.cpp new file mode 100644 index 0000000..3006537 --- /dev/null +++ b/src/Djitellowhite/keyboard.cpp @@ -0,0 +1,52 @@ +#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(){ + while(1){ + switch(scanKeyboard()) + { + case (int)'w': + cout << "forward"<< endl; + break; + case (int)'s': + cout << "back" << endl; + break; + case (int)'a': + cout << "left" <N+|;A>n7Zw_KW;il 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 Y&h4@;JrftQZ@fck(En@TEG}03A3X&HVE_OC literal 0 HcmV?d00001 diff --git a/src/Djitellowhite/makefile b/src/Djitellowhite/makefile new file mode 100644 index 0000000..156373e --- /dev/null +++ b/src/Djitellowhite/makefile @@ -0,0 +1,21 @@ +obj = Djitellowhite.o keyboard.cpp Triplet.cpp +CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv4) +LDFLAGS += $(shell pkg-config --libs --static opencv4) +test : $(obj) + $(CXX) -o test $(obj) $(LDFLAGS) + +Djitellowhite.o : Djitellowhite.h + $(CXX) -c Djitellowhite.cpp $(CXXFLAGS) + +keyboard.o : Hardwarelistener.h + $(CXX) -c keyboard.cpp $(CXXFLAGS) + +Triplet : Djitellowhite.h Hardwarelistener.h + $(CXX) -c Triplet.cpp -lpthread $(CXXFLAGS) + +.PHONY : clean +clean : + rm test $(obj) + + + diff --git a/src/Djitellowhite/server.cpp b/src/Djitellowhite/server.cpp new file mode 100644 index 0000000..581b3e7 --- /dev/null +++ b/src/Djitellowhite/server.cpp @@ -0,0 +1,58 @@ +#include +#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); +} + + diff --git a/src/Djitellowhite/test b/src/Djitellowhite/test new file mode 100755 index 0000000000000000000000000000000000000000..db2feaccc29394fb46549aa6b0b1b6d6b949407f GIT binary patch literal 31008 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 V6?6^`(v^QNEF`Y56|k}F{{XOSU>N`a literal 0 HcmV?d00001