Hi,
We would like to link some own simulator (an alternative to jsbsim written in Python) with a PX4 SITL.
According to the PX4’s doc, the way to start a standalone PX4 SITL is like this:
$ make px4_sitl none_iris
(with “iris” to be adapted according to the situation)
After being launched the terminal indicates the simulator must connect to a TCP port:
(...)
PWM_MIN: curr: 1000 -> new: 1075
GPS_UBX_DYNMODEL: curr: 7 -> new: 6
* SYS_AUTOCONFIG: curr: 1 -> new: 0
INFO [dataman] Unknown restart, data manager file './dataman' size is 11798680 bytes
INFO [simulator] Waiting for simulator to accept connection on TCP port 4560
In Python then, I connect to the port with pymavlink:
from pymavlink import mavutil
vehicle = mavutil.mavlink_connection('tcpin:localhost:4560')
vehicle.wait_heartbeat()
print("Heartbeat from system (system %u component %u)" % (vehicle.target_system, vehicle.target_component))
The connection works and the terminal indicates:
INFO [simulator] Simulator connected on TCP port 4560.
But then it gets stuck there.
Logically the PX4 should also open a UDP port so that it can be monitored. For example, when using an existing simulator like flightgear with make px4_sitl_nolockstep flightgear_rascal
I can connect to the UDP port without issue and monitor the drone attitude.
In the doc (Simulation | PX4 User Guide) it’s said the simulator must send MAVLink messages as HIL_SENSOR or HIL_GPS and receive HIL_ACTUATOR_CONTROLS from the PX4. Always with pymavlink I send all the defined messages, eg:
# Send HIL_GPS
vehicle.mav.hil_gps_send(
time_usec = 1636636640 , # Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number. [us] (type:uint64_t)
fix_type = 0 , # 0-1: no fix, 2: 2D fix, 3: 3D fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix. (type:uint8_t)
lat = 40 , # Latitude (WGS84) [degE7] (type:int32_t)
lon = 17 , # Longitude (WGS84) [degE7] (type:int32_t)
alt = 0 , # Altitude (MSL). Positive for up. [mm] (type:int32_t)
eph = 0 , # GPS HDOP horizontal dilution of position (unitless). If unknown, set to: UINT16_MAX (type:uint16_t)
epv = 0 , # GPS VDOP vertical dilution of position (unitless). If unknown, set to: UINT16_MAX (type:uint16_t)
vel = 0 , # GPS ground speed. If unknown, set to: 65535 [cm/s] (type:uint16_t)
vn = 0 , # GPS velocity in north direction in earth-fixed NED frame [cm/s] (type:int16_t)
ve = 0 , # GPS velocity in east direction in earth-fixed NED frame [cm/s] (type:int16_t)
vd = 0 , # GPS velocity in down direction in earth-fixed NED frame [cm/s] (type:int16_t)
cog = 65535 , # Course over ground (NOT heading, but direction of movement), 0.0..359.99 degrees. If unknown, set to: 65535 [cdeg] (type:uint16_t)
satellites_visible = 0 , # Number of satellites visible. If unknown, set to 255 (type:uint8_t)
id = 0 , # GPS ID (zero indexed). Used for multiple GPS inputs (type:uint8_t)
yaw = 36000 , # Yaw of vehicle relative to Earth's North, zero means not available, use 36000 for north [cdeg] (type:uint16_t)
)
but the TCP connection doesn’t receive any HIL_ACTUATOR_CONTROLS message.
So:
- After the simulator connects to the TCP port, nothing happens, even if needed MAVLink messages are sent from the simulator through this connection.
- The UDP port is not opened.
Please, how to make it work?..
Thanks for the support