Compare commits
47 Commits
b09f882369
...
aerpaw2
| Author | SHA1 | Date | |
|---|---|---|---|
| bdc31ccad5 | |||
| d5c7f4f11f | |||
| 110ff87c57 | |||
| 51e7533369 | |||
| 3fd4462f11 | |||
| 12b6e79f1e | |||
| e801018d9c | |||
| d5307f63e9 | |||
| ac52e0414d | |||
| f140b55a63 | |||
| 6b5d33962b | |||
| 8ebeda3bf0 | |||
| fe7b1b2ed3 | |||
| 252423eb29 | |||
| 351a9bd16f | |||
| 2b853466f2 | |||
| d49bf61d1d | |||
| 032f50774f | |||
| e40d2e4614 | |||
| 387d6aea56 | |||
| 0bf293c95e | |||
| db6df5f263 | |||
| d89fa38ba1 | |||
| c2fa2b524a | |||
| bb97502be5 | |||
| fb9feac23d | |||
| fd6ebf538c | |||
| a328eae126 | |||
| c060dfad06 | |||
| 05bf99f061 | |||
| 77ac58a8a2 | |||
| 525d213e6a | |||
| f434e1a685 | |||
| 330c1e5d54 | |||
| f6e1f13bb5 | |||
| 79b03345ba | |||
| a965dff4ca | |||
| 448db1e0e3 | |||
| dd82cb3956 | |||
| 6b8e26eb69 | |||
| 654de7c2a1 | |||
| 338bb6c340 | |||
| 6604928f8f | |||
| aed1924297 | |||
| fe106f31cd | |||
| 8c5c315380 | |||
| b444e44d33 |
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -0,0 +1,3 @@
|
||||
[submodule "aerpaw/aerpawlib"]
|
||||
path = aerpaw/aerpawlib
|
||||
url = https://github.com/morzack/aerpawlib-vehicle-control.git
|
||||
|
||||
1
aerpaw/aerpawlib
Submodule
1
aerpaw/aerpawlib
Submodule
Submodule aerpaw/aerpawlib added at 705fc699ef
@@ -267,10 +267,6 @@ class CSwSNRRX(gr.top_block):
|
||||
'/root/Quality', num_uavs, slot_duration, guard_interval)
|
||||
self.blocks_file_sink_0 = TdmTaggedFileSink(
|
||||
'/root/Power', num_uavs, slot_duration, guard_interval)
|
||||
self.blocks_file_sink_noisefloor = TdmTaggedFileSink(
|
||||
'/root/NoiseFloor', num_uavs, slot_duration, guard_interval)
|
||||
self._freqoffset_file = open('/root/FreqOffset', 'w')
|
||||
self._freqoffset_file.write('tx_uav_id,value\n')
|
||||
self.blocks_divide_xx_0 = blocks.divide_ff(1)
|
||||
self.blocks_complex_to_real_0_0 = blocks.complex_to_real(1)
|
||||
self.blocks_complex_to_real_0 = blocks.complex_to_real(1)
|
||||
@@ -314,7 +310,6 @@ class CSwSNRRX(gr.top_block):
|
||||
self.connect((self.blocks_nlog10_ff_0_0, 0), (self.blocks_add_const_vxx_0, 0))
|
||||
self.connect((self.blocks_nlog10_ff_0_0, 0), (self.blocks_sub_xx_0, 0))
|
||||
self.connect((self.blocks_nlog10_ff_0_0_0, 0), (self.blocks_sub_xx_0, 1))
|
||||
self.connect((self.blocks_nlog10_ff_0_0_0, 0), (self.blocks_file_sink_noisefloor, 0))
|
||||
self.connect((self.blocks_stream_to_vector_0_0, 0), (self.epy_block_0, 0))
|
||||
self.connect((self.blocks_sub_xx_0, 0), (self.blocks_file_sink_0_0_0, 0))
|
||||
self.connect((self.blocks_vector_to_stream_0_0, 0), (self.blocks_keep_m_in_n_0, 0))
|
||||
@@ -326,26 +321,6 @@ class CSwSNRRX(gr.top_block):
|
||||
self.connect((self.freq_xlating_fft_filter_ccc_0_0, 0), (self.blocks_stream_to_vector_0_0, 0))
|
||||
self.connect((self.uhd_usrp_source_0, 0), (self.blocks_multiply_xx_0, 0))
|
||||
|
||||
##################################################
|
||||
# Frequency offset polling thread
|
||||
##################################################
|
||||
def _freq_offset_probe():
|
||||
frame_dur = slot_duration * num_uavs
|
||||
while True:
|
||||
val = self.digital_fll_band_edge_cc_0_0.get_frequency()
|
||||
freq_hz = val * samp_rate / (2 * math.pi)
|
||||
now = time.time()
|
||||
slot_time = now % frame_dur
|
||||
current_slot = int(slot_time / slot_duration)
|
||||
time_into_slot = slot_time - current_slot * slot_duration
|
||||
tx_id = -1 if time_into_slot < guard_interval else current_slot
|
||||
self._freqoffset_file.write(f'{tx_id},{freq_hz}\n')
|
||||
self._freqoffset_file.flush()
|
||||
time.sleep(0.01)
|
||||
_freq_offset_thread = threading.Thread(target=_freq_offset_probe)
|
||||
_freq_offset_thread.daemon = True
|
||||
_freq_offset_thread.start()
|
||||
|
||||
|
||||
def get_args(self):
|
||||
return self.args
|
||||
|
||||
@@ -24,25 +24,16 @@ function [f, R] = plotRadioLogs(resultsPath)
|
||||
R{ii}(bad, :) = [];
|
||||
end
|
||||
|
||||
% Compute path loss from Power (post-processing)
|
||||
% Power = 20*log10(peak_mag) - rxGain; path loss = txGain - rxGain - Power
|
||||
txGain_dB = 76; % from startchannelsounderTXGRC.sh GAIN_TX
|
||||
rxGain_dB = 30; % from startchannelsounderRXGRC.sh GAIN_RX
|
||||
for ii = 1:numel(R)
|
||||
R{ii}.PathLoss = txGain_dB - rxGain_dB - R{ii}.Power;
|
||||
R{ii}.FreqOffset = R{ii}.FreqOffset / 1e6; % Hz to MHz
|
||||
end
|
||||
|
||||
% Build legend labels and color map for up to 4 UAVs
|
||||
nUAV = numel(R);
|
||||
colors = lines(nUAV * nUAV);
|
||||
styles = ["-o", "-s", "-^", "-d", "-v", "-p", "-h", "-<", "->", "-+", "-x", "-*"];
|
||||
|
||||
metricNames = ["SNR", "Power", "Quality", "PathLoss", "NoiseFloor", "FreqOffset"];
|
||||
yLabels = ["SNR (dB)", "Power (dB)", "Quality", "Path Loss (dB)", "Noise Floor (dB)", "Freq Offset (MHz)"];
|
||||
metricNames = ["SNR", "Power", "Quality"];
|
||||
yLabels = ["SNR (dB)", "Power (dB)", "Quality"];
|
||||
|
||||
f = figure;
|
||||
tl = tiledlayout(numel(metricNames), 1, 'TileSpacing', 'compact', 'Padding', 'compact');
|
||||
tl = tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'compact');
|
||||
|
||||
for mi = 1:numel(metricNames)
|
||||
ax = nexttile(tl);
|
||||
|
||||
@@ -4,19 +4,19 @@ function R = readRadioLogs(logPath)
|
||||
end
|
||||
|
||||
arguments (Output)
|
||||
R (:, 8) table;
|
||||
R (:, 6) table;
|
||||
end
|
||||
|
||||
% Extract receiving UAV ID from directory name (e.g. "uav0_..." → 0)
|
||||
[~, dirName] = fileparts(logPath);
|
||||
rxID = int32(sscanf(dirName, 'uav%d'));
|
||||
|
||||
metrics = ["quality", "snr", "power", "noisefloor", "freqoffset"];
|
||||
metrics = ["quality", "snr", "power"];
|
||||
logs = dir(logPath);
|
||||
logs = logs(endsWith({logs(:).name}, metrics + "_log.txt"));
|
||||
|
||||
R = table(datetime.empty(0,1), zeros(0,1,'int32'), zeros(0,1,'int32'), zeros(0,1), zeros(0,1), zeros(0,1), zeros(0,1), zeros(0,1), ...
|
||||
'VariableNames', ["Timestamp", "TxUAVID", "RxUAVID", "SNR", "Power", "Quality", "NoiseFloor", "FreqOffset"]);
|
||||
R = table(datetime.empty(0,1), zeros(0,1,'int32'), zeros(0,1,'int32'), zeros(0,1), zeros(0,1), zeros(0,1), ...
|
||||
'VariableNames', ["Timestamp", "TxUAVID", "RxUAVID", "SNR", "Power", "Quality"]);
|
||||
|
||||
for ii = 1:numel(logs)
|
||||
filepath = fullfile(logs(ii).folder, logs(ii).name);
|
||||
@@ -43,15 +43,13 @@ function R = readRadioLogs(logPath)
|
||||
val = data{3};
|
||||
|
||||
n = numel(ts);
|
||||
t = table(ts, txId, repmat(rxID, n, 1), NaN(n,1), NaN(n,1), NaN(n,1), NaN(n,1), NaN(n,1), ...
|
||||
'VariableNames', ["Timestamp", "TxUAVID", "RxUAVID", "SNR", "Power", "Quality", "NoiseFloor", "FreqOffset"]);
|
||||
t = table(ts, txId, repmat(rxID, n, 1), NaN(n,1), NaN(n,1), NaN(n,1), ...
|
||||
'VariableNames', ["Timestamp", "TxUAVID", "RxUAVID", "SNR", "Power", "Quality"]);
|
||||
|
||||
switch metric
|
||||
case "snr", t.SNR = val;
|
||||
case "power", t.Power = val;
|
||||
case "quality", t.Quality = val;
|
||||
case "noisefloor", t.NoiseFloor = val;
|
||||
case "freqoffset", t.FreqOffset = val;
|
||||
case "snr", t.SNR = val;
|
||||
case "power", t.Power = val;
|
||||
case "quality", t.Quality = val;
|
||||
end
|
||||
|
||||
R = [R; t]; %#ok<AGROW>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% Plot AERPAW logs (trajectory, radio)
|
||||
resultsPath = fullfile(matlab.project.rootProject().RootFolder, "sandbox", "t2"); % Define path to results copied from AERPAW platform
|
||||
resultsPath = fullfile(matlab.project.rootProject().RootFolder, "sandbox", "t1"); % Define path to results copied from AERPAW platform
|
||||
|
||||
% Plot GPS logged data and scenario information (domain, objective, obstacles)
|
||||
seaToGroundLevel = 110; % measured approximately from USGS national map viewer
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
#RX
|
||||
|
||||
cd $PROFILE_DIR"/ProfileScripts/Radio/Helpers"
|
||||
|
||||
screen -S rxGRC -dm \
|
||||
bash -c "stdbuf -oL -eL ./startchannelsounderRXGRC.sh \
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_radio_channelsounderrxgrc_log.txt"
|
||||
|
||||
screen -S power -dm \
|
||||
bash -c "stdbuf -oL -eL tail -F /root/Power\
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_power_log.txt"
|
||||
|
||||
screen -S quality -dm \
|
||||
bash -c "stdbuf -oL -eL tail -F /root/Quality\
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_quality_log.txt"
|
||||
|
||||
screen -S snr -dm \
|
||||
bash -c "stdbuf -oL -eL tail -F /root/SNR\
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_snr_log.txt"
|
||||
|
||||
screen -S noisefloor -dm \
|
||||
bash -c "stdbuf -oL -eL tail -F /root/NoiseFloor\
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_noisefloor_log.txt"
|
||||
|
||||
screen -S freqoffset -dm \
|
||||
bash -c "stdbuf -oL -eL tail -F /root/FreqOffset\
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_freqoffset_log.txt"
|
||||
|
||||
|
||||
#TX
|
||||
|
||||
screen -S txGRC -dm \
|
||||
bash -c "stdbuf -oL -eL ./startchannelsounderTXGRC.sh \
|
||||
2>&1 | ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_radio_channelsoundertxgrc_log.txt"
|
||||
cd -
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
### Sample GPS logger portion
|
||||
# use vehicle type generic to skip the arming requirement
|
||||
export VEHICLE_TYPE="${VEHICLE_TYPE:-generic}"
|
||||
|
||||
# GPS Logger sample application (this does not move the vehicle)
|
||||
|
||||
#cd $PROFILE_DIR"/ProfileScripts/Vehicle/Helpers"
|
||||
#
|
||||
#screen -S vehicle -dm \
|
||||
# bash -c "stdbuf -oL -eL ./gpsLoggerHelper.sh \
|
||||
# 2> >(ts $TS_FORMAT >> $RESULTS_DIR/${LOG_PREFIX}_vehicle_log_err.txt) \
|
||||
# | ts $TS_FORMAT \
|
||||
# | tee $RESULTS_DIR/$LOG_PREFIX\_vehicle_log.txt"
|
||||
#
|
||||
#cd -
|
||||
|
||||
### Actual control portion (custom)
|
||||
export VEHICLE_TYPE="${VEHICLE_TYPE:-drone}" # out of rover, drone, generic
|
||||
|
||||
cd /root/miSim/aerpaw
|
||||
|
||||
# Use screen/ts/tee aerpawism from sample script
|
||||
screen -S vehicle -dm \
|
||||
bash -c "stdbuf -oL -eL ./run_uav.sh testbed /root/miSim/aerpaw/config/client1.yaml \
|
||||
| ts $TS_FORMAT \
|
||||
| tee $RESULTS_DIR/$LOG_PREFIX\_vehicle_log.txt"
|
||||
|
||||
cd -
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/bin/bash
|
||||
/root/stopexperiment.sh
|
||||
|
||||
source /root/.ap-set-experiment-env.sh
|
||||
source /root/.bashrc
|
||||
|
||||
# set path to client config YAML
|
||||
export AERPAW_CLIENT_CONFIG=/root/miSim/aerpaw/config/client1.yaml
|
||||
|
||||
export AERPAW_REPO=${AERPAW_REPO:-/root/AERPAW-Dev}
|
||||
export AERPAW_PYTHON=${AERPAW_PYTHON:-python3}
|
||||
export PYTHONPATH=/usr/local/lib/python3/dist-packages/
|
||||
export EXP_NUMBER=${EXP_NUMBER:-1}
|
||||
|
||||
if [ "$AP_EXPENV_THIS_CONTAINER_NODE_VEHICLE" == "vehicle_uav" ]; then
|
||||
export VEHICLE_TYPE=drone
|
||||
elif [ "$AP_EXPENV_THIS_CONTAINER_NODE_VEHICLE" == "vehicle_ugv" ]; then
|
||||
export VEHICLE_TYPE=rover
|
||||
else
|
||||
export VEHICLE_TYPE=none
|
||||
fi
|
||||
|
||||
if [ "$AP_EXPENV_SESSION_ENV" == "Virtual" ]; then
|
||||
export LAUNCH_MODE=EMULATION
|
||||
elif [ "$AP_EXPENV_SESSION_ENV" == "Testbed" ]; then
|
||||
export LAUNCH_MODE=TESTBED
|
||||
else
|
||||
export LAUNCH_MODE=none
|
||||
fi
|
||||
|
||||
# prepare results directory
|
||||
export UAV_ID=$(python3 -c "import yaml; print(yaml.safe_load(open('$AERPAW_CLIENT_CONFIG'))['uav_id'])")
|
||||
export RESULTS_DIR_TIMESTAMP=$(date +%Y-%m-%d_%H_%M_%S)
|
||||
export RESULTS_DIR="/root/Results/uav${UAV_ID}_${RESULTS_DIR_TIMESTAMP}"
|
||||
mkdir -p "$RESULTS_DIR"
|
||||
|
||||
export TS_FORMAT="${TS_FORMAT:-'[%Y-%m-%d %H:%M:%.S]'}"
|
||||
export LOG_PREFIX="$(date +%Y-%m-%d_%H_%M_%S)"
|
||||
|
||||
export TX_FREQ=3.32e9
|
||||
export RX_FREQ=3.32e9
|
||||
|
||||
|
||||
export PROFILE_DIR=$AERPAW_REPO"/AHN/E-VM/Profile_software"
|
||||
cd $PROFILE_DIR"/ProfileScripts"
|
||||
|
||||
|
||||
|
||||
./Radio/startRadio.sh
|
||||
#./Traffic/startTraffic.sh
|
||||
./Vehicle/startVehicle.sh
|
||||
|
||||
schedule_stop.sh 30
|
||||
Reference in New Issue
Block a user