Robomaster TT无人机 ,C++ Socket连接方法
李化波
C++ 控制 TT无人机 首飞成功[破涕为笑]
视频号
大疆TT无人机,开放了SDK,可以通过明文协议,控制TT无人机。之前有用Python编程控制,效果挺好。今年四川省的无人机竞赛规则是,如果用C++编程加10分,尽管最后没有执行这一规则,但是一直心欠欠的这个问题。
最近,公司老板很看重五大学科竞赛之信息学奥赛,其实要追溯到2018年了,那个时候老板就在想怎么与信息学对上,时间已经过去了3年了,今年与CCF四川组委会有了良好合作,上层还有金牌教练站岗,作为苗子筛选通道的科技创新普及教育,我们要把硬件编程和信息学建立连接,用C++来控制TT无人机这个问题,就迫切需要解决掉
大疆开放了SDK,有这样的基础。经过了反应琢磨,多位大佬协助下,终于在网上找到了以下程序,
using namespace std;
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了