111

代码逻辑捋顺 文件注释 看看固定值,进行修改 看下网络问题

导弹发射部分逻辑与载具上的显示联系

  • 可能问题1 在目标设备上运行不起来 用release版本
  • 可能问题2 修改过的qgc无法连接无人机 解决方法: ?
  • 可能问题3 连接上无人机但是接收不到自定义的mavlink消息 解决方法:?
  • 可能问题4 消息格式对不上 解决方法:现场改mavlink协议并修改对应代码
  • 可能问题5 qgc发送的udp消息无人机接收不到 解决方法:查看发送的消息是否发送到了组播地址
  • 可能问题6 无人机发送载荷后,地面站不显示 检查地面站收到的载荷和无人机的id的对应关系

在主界面也显示各个区域 实现
将配置界面设置风格一致 实现

看一看主界面的保证多机的轨迹都显示 实现

流程
配置任务区按钮 发消息1
收到消息2后 弹出提示绘制四个子任务区

配置各个无人机的载荷 发消息3
收到消息4后 弹出提示 发送消息5(按钮?自动?

收到消息7后 弹出提示表示打击就位

展示轨迹 最后有个毁伤效果

通信部分如果需要修改的话:
修改协议,在ardu..和common里修改协议名字\编号\验证
custommavlinkudp里修改handle函数和send函数
//紧急需要验证的是发送端的系统id和组件id应该是多少
各个调用发送信息部分的参数修改

突然发现的bug:

无人机接收到删除区域的消息后是否应该再广播删除消息?
无人接收到id相同的消息后应该是进行修改,这部分的逻辑没实现

include

include

include <sys/socket.h>

include <netinet/in.h>

include <arpa/inet.h>

bool sendUDPMessage(int sockfd, const char* destIP, uint16_t destPort,
int8_t messageType,
const float* longitudes,
const float* latitudes,
const int8_t* nodeTypes) {
// 计算消息总长度
const size_t MSG_SIZE = sizeof(int8_t) + 2 * 100 * sizeof(float) + 100 * sizeof(int8_t);
char buffer[MSG_SIZE];
char* ptr = buffer;

// 填充消息类型
*ptr = messageType;
ptr += sizeof(int8_t);

// 填充经度数组
memcpy(ptr, longitudes, 100 * sizeof(float));
ptr += 100 * sizeof(float);

// 填充纬度数组
memcpy(ptr, latitudes, 100 * sizeof(float));
ptr += 100 * sizeof(float);

// 填充节点类型数组
memcpy(ptr, nodeTypes, 100 * sizeof(int8_t));

// 设置目标地址
struct sockaddr_in destAddr;
memset(&destAddr, 0, sizeof(destAddr));
destAddr.sin_family = AF_INET;
destAddr.sin_port = htons(destPort);
inet_pton(AF_INET, destIP, &destAddr.sin_addr);

// 发送消息
ssize_t bytesSent = sendto(sockfd, buffer, MSG_SIZE, 0, 
                           (struct sockaddr*)&destAddr, sizeof(destAddr));

return bytesSent == MSG_SIZE;

}

include

include

include

// 用于生成100个float类型的经度数组
std::vector generateLongitudeArray() {
std::vector longitudes(100);
for (auto& value : longitudes) {
value = static_cast(rand()) / RAND_MAX * 360.0f - 180.0f; // 随机生成-180到180之间的浮点数
}
return longitudes;
}

// 用于生成100个float类型的纬度数组
std::vector generateLatitudeArray() {
std::vector latitudes(100);
for (auto& value : latitudes) {
value = static_cast(rand()) / RAND_MAX * 180.0f - 90.0f; // 随机生成-90到90之间的浮点数
}
return latitudes;
}

// 用于生成100个int8类型的节点类型数组
std::vector<int8_t> generateNodeTypeArray() {
std::vector<int8_t> nodeTypes(100);
for (auto& value : nodeTypes) {
value = static_cast<int8_t>(rand() % 256); // 随机生成0到255之间的整数
}
return nodeTypes;
}

include

include

include

include

include

class CustomMavlinkUdp {
public:
CustomMavlinkUdp(const QString& configFilePath);
void initialize();

private:
QString configFilePath;
QString sendIP;
void getLocalIPAddress();
bool isLocalIPAddress(const QString& ip);
};

CustomMavlinkUdp::CustomMavlinkUdp(const QString& configFilePath)
configFilePath(configFilePath) {
initialize();
}

void CustomMavlinkUdp::initialize() {
QSettings settings(configFilePath, QSettings::IniFormat);
sendIP = settings.value("NetWork/SendIP").toString();

if (isLocalIPAddress(sendIP)) {
    qDebug() << "SendIP from config is a local IP: " << sendIP;
} else {
    qDebug() << "SendIP from config is not a local IP. Getting local IP.";
    getLocalIPAddress();
    qDebug() << "Local IP obtained: " << sendIP;
}

}

bool CustomMavlinkUdp::isLocalIPAddress(const QString& ip) {
const QList& allAddresses = QNetworkInterface::allAddresses();
for (const QHostAddress& address : allAddresses) {
if (address.toString() == ip) {
return true;
}
}
return false;
}

void CustomMavlinkUdp::getLocalIPAddress() {
const QList& allAddresses = QNetworkInterface::allAddresses();
for (const QHostAddress& address : allAddresses) {
if (address.protocol() == QAbstractSocket::IPv4Protocol &&
address != QHostAddress::LocalHost) {
sendIP = address.toString();
return;
}
}
// 如果没有找到合适的IP,默认使用localhost
sendIP = QHostAddress(QHostAddress::LocalHost).toString();
}

int main() {
QString configFilePath = "/path/to/config.ini";
CustomMavlinkUdp customMavlinkUdp(configFilePath);

return 0;

}

posted @ 2024-07-10 11:52  灰色耳机  阅读(14)  评论(0编辑  收藏  举报