转发多台px4仿真UDP数据到地面站

转发脚本的任务需求

仿真采用UDP通信方式,在 wsl 中仿真三台飞机,项目需要将一台电脑中的三台飞机的数据打包发送到另一台飞机的地面站,但地面站是无法直接访问另一台主机的 wsl 中的端口的,wsl 中的端口需要本机才能访问,接收数据,因此,需要编写一个脚本在主机运行,接收 wsl 中仿真飞机的数据,通过主机的 ip 与端口发送给 app 的主机 ip 与端口(),并且,接收 app 的命令,转发给三台飞机(命令中会包含飞机id,因此脚本不需要做筛选,直接转发给三个即可)。

目标端口与本机都需要在同一个局域网下(连接同一个wifi),整体框图如下:

脚本编写的注意点

仿真飞机的发送端口

仿真飞控在没有收到地面站心跳包时,是往 14550 端口发送数据的,只有在收到自己预先配置的接收端口接收到数据后,才会往配置的接收端口发送数据,一般配置的端口都是 18570,多台飞机就往后顺延,18571,18572

地面站发送心跳也是必须往飞机配置的端口发送心跳才行,例如飞机是18570,那么必须往这个端口发心跳,飞控才会改为往18570发送数据。

代码:

#! /usr/bin/env python
# -*-coding:utf-8-*
import socket

import socket
import threading
import time

# 监控gcs发送的心跳包并转发给飞机的心跳端口 14550 (心跳端口为多机共用端口)
def udp_listen_gcs_to_uav(gcs_sock, uav1_sock, uav2_sock, uav3_sock, uav_ip, uav1_port, uav2_port, uav3_port):
    # print("listen GCS UDP port") 
       
    while True:
        # 接收数据        
        buffer_size = 255  #缓冲区大小        
        gcs_data, gcs_addr = gcs_sock.recvfrom(buffer_size)  #读取gcs发送过来的数据包,转发给wsl的飞控 
        print("addr:", gcs_addr, "data:", gcs_data)

        #发送数据到wsl的飞机地址与端口        
        uav1_sock.sendto(gcs_data, (uav_ip, uav1_port))
        uav2_sock.sendto(gcs_data, (uav_ip, uav2_port))
        uav3_sock.sendto(gcs_data, (uav_ip, uav3_port))


# 监控uav1 18570 端口发送的消息并转发给gcs端口
def udp_listen_uav_to_gcs(uav_sock, gsc_sock, gcs_ip, gcs_port):
    # print("listen uav UDP port:") 
       
    while True:
        # 接收数据        
        buffer_size = 255  #缓冲区大小        
        uav_data, uav_addr = uav_sock.recvfrom(buffer_size)  #读取gcs发送过来的数据包,转发给wsl的飞控 
        # print("uav_addr:", uav_addr, "uav_data:", uav_data)  
              
        # 发送数据到wsl的飞机地址与端口        
        gsc_sock.sendto(uav_data, (gcs_ip, gcs_port))

def main():
    self_UDP_IP = "172.16.20.86"  # 本机IP UDP通信可以不使用此字段    
    gcs_tx_ip = "172.16.20.16"    # gcs发送ip    
    gcs_tx_port = 14650  # gcs发送端口    
    gcs_rx_ip = "172.16.20.16"   # gcs接收ip    
    gcs_rx_port = 14650  # gcs接收端口    
    uav_ip = "172.27.21.175"  # 飞机的ip都是相同的    
    uav1_port = 18570   # 飞机1的端口号  在发送了心跳包后,需要与飞机在此端口进行通信    
    uav2_port = 18571   # 飞机1的端口号  在发送了心跳包后,需要与飞机在此端口进行通信    
    uav3_port = 18572   # 飞机1的端口号  在发送了心跳包后,需要与飞机在此端口进行通信    
    
    #创建与地面站以及与飞机通信的sock,之后传入各个线程    
    gcs_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    gcs_sock.bind(('', gcs_tx_port))
    # 绑定使用哪个端口发送  要让飞机往18570发送数据,因此心跳包也要从18570发送,飞控从18570接收到心跳包后,就会往18570发送自身数据    
    uav1_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    uav1_sock.bind(('', uav1_port))
    uav2_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    uav2_sock.bind(('', uav2_port))
    uav3_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    uav3_sock.bind(('', uav3_port))


    # 创建线程 监听gcs的包之后转发给飞控心跳端口 14550    
    listen_gcs_to_uav_thread = threading.Thread(target=udp_listen_gcs_to_uav, args=[gcs_sock, uav1_sock, uav2_sock, uav3_sock, uav_ip, uav1_port, uav2_port, uav3_port])

    # 创建线程 监听wsl中的uav1,2,3端口消息 18570,18571,18572  并转发给gcs端口    
    listen_uav1_to_gcs_thread = threading.Thread(target=udp_listen_uav_to_gcs, args=[uav1_sock, gcs_sock, gcs_rx_ip, gcs_rx_port])
    listen_uav2_to_gcs_thread = threading.Thread(target=udp_listen_uav_to_gcs, args=[uav2_sock, gcs_sock, gcs_rx_ip, gcs_rx_port])
    listen_uav3_to_gcs_thread = threading.Thread(target=udp_listen_uav_to_gcs, args=[uav3_sock, gcs_sock, gcs_rx_ip, gcs_rx_port])

    listen_gcs_to_uav_thread.start()
    listen_uav1_to_gcs_thread.start()
    listen_uav2_to_gcs_thread.start()
    listen_uav3_to_gcs_thread.start()

    # 等待线程结束    
    listen_gcs_to_uav_thread.join()  # 等待心跳包发送完成后就启动下一个任务    
    listen_uav1_to_gcs_thread.join()
    listen_uav2_to_gcs_thread.join()
    listen_uav3_to_gcs_thread.join()

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    main()

在上述代码中,UDP 在接收时是用不到此ip的,也就是 gcs_sock.bind(('', gcs_tx_port)),函数中的 ip 可以不填,只需要将端口号填对即可,但在发送时,需要指定 ip,而且在给飞控发送心跳时,需要绑定端口号为飞机的端口号

<think>好的,我需要帮助用户找到PX4版本1.13.3用于多机仿真的源码。首先,用户提到了PX4 1.13.3和多机仿真,我需要回忆PX4的版本管理和下载方式。 根据用户提供的引用[2],里面提到在Ubuntu20.04下安装PX4_v1.13.3和MAVROS,可能源码下载部分有相关步骤。通常PX4的源码是通过Git克隆的,但特定版本需要使用标签切换。用户需要的是1.13.3版本,这个版本可能是一个特定的标签或者分支。 接下来,用户需要多机仿真的配置。引用[1]提到多机仿真的命令,比如设置环境变量PX4_SIM_SPEED_FACTOR和make命令。但不同版本的PX4可能在仿真配置上有差异,特别是1.13.3可能需要特定的启动文件或参数。 另外,引用[3]提到北大智航杯竞赛仿真环境基于PX4 1.13,用户遇到的问题是因为版本不匹配,所以用户必须确保下载正确的1.13.3版本源码才能避免兼容性问题。 步骤应该包括:克隆PX4仓库,切换到v1.13.3标签,然后初始化子模块。之后,配置多机仿真可能需要修改启动文件或使用特定的launch文件,比如indoor1.launch,但需要确认该版本是否支持。 需要提醒用户注意子模块的更新,因为切换标签后可能需要运行git submodule update来同步依赖。此外,多机仿真可能需要额外的配置步骤,如设置多个实例的端口和通信参数。 最后,用户可能需要参考官方文档或社区资源来确保多机仿真的正确设置,特别是针对1.13.3版本的具体指导。需要确保所有步骤清晰,避免出现版本不匹配的问题。</think>以下是获取PX4 v1.13.3多机仿真源码的完整步骤: ### 一、源码下载方法 1. 克隆PX4源码仓库 ```bash git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot ``` 2. 切换到v1.13.3版本(该版本包含多机仿真功能) ```bash git checkout v1.13.3 git submodule update --init --recursive ``` > 注:必须执行子模块更新才能保证功能完整性[^2] ### 二、多机仿真配置 1. 启动基础环境(需先安装jMAVSim) ```bash make distclean export PX4_SIM_SPEED_FACTOR=2 make px4_sitl_default jmavsim ``` 2. 新建终端窗口启动第二架无人机(注意端口设置) ```bash cd ~/PX4-Autopilot source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo roslaunch px4 multi_uav_mavros_sitl.launch ``` > 多机通信通过不同UDP端口实现(14540/14550)[^1] ### 三、版本验证 ```bash cat VERSION # 应显示:1.13.3 ``` 若出现indoor1.launch等启动文件错误,需检查是否从其他版本错误复制了文件[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值