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
std::vector
for (auto& value : longitudes) {
value = static_cast
}
return longitudes;
}
// 用于生成100个float类型的纬度数组
std::vector
std::vector
for (auto& value : latitudes) {
value = static_cast
}
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
for (const QHostAddress& address : allAddresses) {
if (address.toString() == ip) {
return true;
}
}
return false;
}
void CustomMavlinkUdp::getLocalIPAddress() {
const QList
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;
}