PX4 Software-in-the-loop (SITL) on WSL2#
The Windows subsystem for Linux version 2 uses a virtual machine, which has a separate IP address from your Windows host machine. This means that PX4 cannot find AutonomySim
on localhost
, which is the default behavior for PX4.
You will notice that on Windows ipconfig
returns a new ethernet adapter for WSL like this (notice the vEthernet has (WSL)
in the name:
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1192:f9a5:df88:53ba%44
IPv4 Address. . . . . . . . . . . : 172.31.64.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
This address 172.31.64.1
is the address that WSL 2 can use to reach your Windows host machine.
Starting with this PX4 Change Request (which correlates to version v1.12.0-beta1 or newer) PX4 in SITL mode can now connect to AutonomySim on a different (remote) IP address. To enable this make sure you have a version of PX4 containing this fix and set the following environment variable in linux:
Note
Be sure to update the above address 172.31.64.1
to match what you see from your ipconfig
command.
Open incoming TCP port 4560 and incoming UDP port 14540 using your firewall configuration.
Now on the linux side run ip address show
and copy the eth0 inet
address, it should be something like 172.31.66.156
. This is the address Windows needs to know in order to find PX4.
Edit your AutonomySim settings file and add LocalHostIp
to tell AutonomySim to use the WSL ethernet adapter address instead of the default localhost
. This will cause AutonomySim to open the TCP port on that adapter which is the address that the PX4 app will be looking for. Also tell AutonomySim to connect the ControlIp
UDP channel by setting ControlIp
to the magic string remote
. This resolves to the WSL 2 remote ip address found in the TCP socket.
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"ClockType": "SteppableClock",
"Vehicles": {
"PX4": {
"VehicleType": "PX4Multirotor",
"UseSerial": false,
"LockStep": true,
"UseTcp": true,
"TcpPort": 4560,
"ControlIp": "remote",
"ControlPortLocal": 14540,
"ControlPortRemote": 14580,
"LocalHostIp": "172.31.64.1",
"Sensors":{
"Barometer":{
"SensorType": 1,
"Enabled": true,
"PressureFactorSigma": 0.0001825
}
},
"Parameters": {
"NAV_RCL_ACT": 0,
"NAV_DLL_ACT": 0,
"COM_OBL_ACT": 1,
"LPE_LAT": 47.641468,
"LPE_LON": -122.140165
}
}
}
}
See PX4 LockStep for more information. The "Barometer" setting keeps PX4 happy because the default AutonomySim barometer has a bit too much noise generation. This setting clamps that down a bit.
If your local repo does not include this PX4 commit, please edit the Linux file in ROMFS/px4fmu_common/init.d-posix/rcS
and make sure it is looking for the PX4_SIM_HOST_ADDR
environment variable and is passing that through to the PX4 simulator like this:
# If PX4_SIM_HOST_ADDR environment variable is empty use localhost.
if [ -z "${PX4_SIM_HOST_ADDR}" ]; then
echo "PX4 SIM HOST: localhost"
simulator start -c $simulator_tcp_port
else
echo "PX4 SIM HOST: $PX4_SIM_HOST_ADDR"
simulator start -t $PX4_SIM_HOST_ADDR $simulator_tcp_port
fi
Note
This code might already be there depending on the version of PX4 you are using.
Please be patient when waiting for the message:
It can take a little longer to establish the remote connection than it does with localhost
.
Now you can proceed with the steps shown in Setting up PX4 Software-in-Loop.