这几天为了解决这些问题一直在发愁,今天晚上终于成功了,前后算起来花了将近4天的时间,现在做一个总结。
想要在QT中制作一个上位机实现三个主要功能:
- 使用UDP协议接收外部发过来的数据
- 对接受到的UDP数据进行处理,得到想要的数据
- 将处理好的数据按照ROS的格式和要求使用TCP协议转发出去
在此过程中遇到两个主要的问题:
问题一: 成员变量是类对象,且该类对象的构造函数是含有参数的
UDP部分的功能已经实现,主要的实现程序如下:
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//分配空间,指定父对象
udpSocket = new QUdpSocket(this);
//绑定
udpSocket->bind(10022);
setWindowTitle("本端口为:10022");
//当对方成功发送数据过来
//自动触发 readyRead()
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dealMsg()));
}
void Widget::dealMsg()
{
//读取对方发送的内容
char buf[1024] = {0};
QHostAddress cliAddr; //对方IP
quint16 port; //对方端口
qint64 len = udpSocket->readDatagram(buf,sizeof(buf),&cliAddr,&port);
if(len > 0)
{
//格式化
QString str = QString ("%1").arg(buf); //获取的数据
//给编辑区设置内容
ui->textEdit->append(str);
}
}
Widget::~Widget()
{
delete ui;
}
而ros与windows通信的例程可以参考我之前写的一篇博客:《基于rosserial_windows实现ROS与windows通信(亲测可行)》
其中给的代码例程如下:
/* rosserial_hello_world.cpp : Example of sending command velocities from Windows using rosserial
*/