% 用于与FlightGear飞行模拟器进行数据交换
clc;clear;
% 创建UDP对象
%配置FlightGear服务器参数
flightgearIP = "127.0.0.1"; % FlightGear运行的IP地址
flightgearPort = 5502; % FlightGear接收UDP数据的端口
udpSender = udpport("Datagram", "IPV4");
% % 启动接收回调

% 油门测试控制--使用throttle_control.xml 和FixedAltitudeControl2.xml用如下启动命令
% start "" "D:\Program Files\FlightGear 2020.3\bin\fgfs.exe" ^
% fgfs --aircraft=c172p --generic=socket,in,60,127.0.0.1,5502,udp,throttle_control --generic=socket,out,60,127.0.0.1,5501,udp,FixedAltitudeControl2 --lat=37.62 --lon=-122.38 --altitude=0 --heading=90 --vc=0 --timeofday=noon
% % 主循环 - 向FlightGear发送控制命令
for i = 1:1000
% 创建控制数据--以油门控制为例
controls = 1 ; %sin(i/50)
% 将控制数据打包为字节数组
dataBytes = typecast(double(controls), 'uint8');
% matlab中默认的为小端字节,需要转换成和自定义中协议保持一致为大端字节序
data = flip(dataBytes); %转换字节序,
% 发送数据到FlightGear
write(udpSender, data, flightgearIP, flightgearPort);
% 等待一小段时间
pause(0.05);
end
%}
%{
% 使用control_input.xml和FixedAltitudeControl2.xml协议文件
%使用如下启动命令:start "" "D:\Program Files\FlightGear 2020.3\bin\fgfs.exe" ^
%fgfs --aircraft=c172p --generic=socket,in,60,127.0.0.1,5502,udp,control_input --generic=socket,out,60,127.0.0.1,5501,udp,FixedAltitudeControl2 --lat=37.62 --lon=-122.38 --altitude=0 --heading=90 --vc=0 --timeofday=noon
% 主循环 - 向FlightGear发送控制命令
for i = 1:100
% 创建控制数据
% 格式: [副翼, 升降舵, 方向舵, 油门]bbXXxxxxxxx
controls = [0.0, 0.0, 0.0, 0.0]; % 初始控制值
% 修改控制值以进行不同的测试
controls(1) = 2*sin(i); % 副翼正弦波
controls(2) = 1*sin(i) ; % 升降舵余弦波
controls(3) = 5*sin(i) ; % 方向舵正弦波
controls(4) = sin(i) ;
%控制输入数量
ctrl_num = size(controls,2);
dataBytes = zeros(1,ctrl_num);
data = zeros(1,ctrl_num*8);
for k = 1: ctrl_num
% 将控制数据打包为字节数组
if k <= 1
dataBytes = typecast(double(controls(k)), 'uint8');
data(1,k:k*8) = flip(dataBytes);
else
dataBytes = typecast(double(controls(k)), 'uint8');
data(1,(k-1)*8+1:k*8) = flip(dataBytes);
end
end
for k = 1: ctrl_num
% 发送数据到FlightGear
write(udpSender, data, flightgearIP, flightgearPort);
fprintf('发送控制数据: 副翼=%.4f, 升降舵=%.4f, 方向舵=%.4f, 油门=%.4f\n', ...
controls(1), controls(2), controls(3), controls(4));
% 等待时间
pause(0.01);
end
end
%}
delete(udpSender);
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删