vlambda博客
学习文章列表

Robomaster TT无人机 ,C++ Socket连接方法

李化波
C++ 控制 TT无人机 首飞成功[破涕为笑]
视频号

大疆TT无人机,开放了SDK,可以通过明文协议,控制TT无人机。之前有用Python编程控制,效果挺好。今年四川省的无人机竞赛规则是,如果用C++编程加10分,尽管最后没有执行这一规则,但是一直心欠欠的这个问题。

Robomaster TT无人机 ,C++ Socket连接方法

最近,公司老板很看重五大学科竞赛之信息学奥赛,其实要追溯到2018年了,那个时候老板就在想怎么与信息学对上,时间已经过去了3年了,今年与CCF四川组委会有了良好合作,上层还有金牌教练站岗,作为苗子筛选通道的科技创新普及教育,我们要把硬件编程和信息学建立连接,用C++来控制TT无人机这个问题,就迫切需要解决掉

大疆开放了SDK,有这样的基础。经过了反应琢磨,多位大佬协助下,终于在网上找到了以下程序,


#include<winsock2.h>#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#pragma comment(lib,"ws2_32.lib")# define BUFFER_SIZE 1024 //缓冲区大小int main(){ SOCKET sock_Client; //客户端用于通信的Socket WSADATA WSAData; char receBuf[BUFFER_SIZE]; //发送数据的缓冲区 char sendBuf[BUFFER_SIZE]; //接受数据的缓冲区
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) { printf("初始化失败!"); return -1; }
//初始化 sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket SOCKADDR_IN addr_server; //服务器的地址数据结构 addr_server.sin_family = AF_INET; addr_server.sin_port = htons(8889);//端口号为4567 addr_server.sin_addr.S_un.S_addr = inet_addr("192.168.10.1"); //127.0.0.1为本电脑IP地址 SOCKADDR_IN sock; int len = sizeof(sock); while (true) { cout << "请输入要传送的数据:"; cin >> sendBuf; sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR)); //int last=recv(sock_Client, receBuf, strlen(receBuf), 0); // (调用recv和recvfrom都可以) int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len); if (last>0) { receBuf[last] = '\0'; //给字符数组加一个'\0',表示结束了。不然输出有乱码 if (strcmp(receBuf, "bye") == 0) { cout << "服务器不跟我聊天了..." << endl;//当服务器发来bye时,关闭socket closesocket(sock_Client); break; } else { printf("接收到数据:%s\n", receBuf); }
}
} closesocket(sock_Client); WSACleanup();

return 0;}
/*关于WSAStartup方法和WSACleanup方法引用出错的解决: 错误: 编译的时候出现 undefined reference to `__imp_WSAStartup' undefined reference to `__imp_WSACleanup' 在一般编译器中不会直接连接编译wsock动态库,需要手动添加库
在vc中,点项目(project-->project option)在makefile中输入-L"ws2_32"   在dvc C++中点击工具(Tool)-->编译选项(Compile Option)在编译命令框中输入-lwsock32*/

在这里附上老徐的CSDN文章链接https://www.cnblogs.com/DOMLX/p/9601511.html,非常感谢有前辈的贡献,让我这个小白可以有激动人心那一刻。其实我也是经过了好多天的查阅资料,测试,几次想放弃,大疆市场告诉我,根据 Python来改,研发是不可能来帮我解决这个问题的,他们没有这个计划。

老板喊来了金牌教练李老师,以及在小美好的高能支持下,实现了socket套接字与TT无人机的通信,代码如下。

运行环境是DEV-C++,需要添加动态库

 在dvc C++中点击工具(Tool)-->编译选项(Compile Option)在编译命令框中输入-lwsock32


附上大疆 官方对明文SDK介绍 https://robomaster-dev.readthedocs.io/zh_CN/latest/text_sdk/intro.html


连接到无人机,运行程序,输入command,即可以takeoff了