USC-ACTLab / crazyswarm

A Large Quadcopter Swarm
MIT License
320 stars 315 forks source link

hover_swarm failing with multiple CFs (crtp assert failing) #240

Closed PartiallyObservable closed 4 years ago

PartiallyObservable commented 4 years ago

Hi, we are having some issues with reliably getting hover_swarm to launch with more than 1-2 crazyflies. This is unexpected as we have previously been able to fly several (several months/a year ago).

What are we trying to do:

Problem we are experiencing:

Information about our installation:

hover_swarm.launch output on a failed start:

liam@holmes:~/drones/crazyswarm/ros_ws/src/crazyswarm/scripts$ roslaunch crazyswarm hover_swarm.launch 
... logging to /home/liam/.ros/log/e2e2e8ca-d69b-11ea-b975-7cdd90b11476/roslaunch-holmes-31682.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://holmes:36449/

SUMMARY
========

PARAMETERS
 * /crazyflieTypes/CF21SingleMarker/batteryVoltageWarning: 3.8
 * /crazyflieTypes/CF21SingleMarker/batteryVoltateCritical: 3.7
 * /crazyflieTypes/CF21SingleMarker/bigQuad: False
 * /crazyflieTypes/CF21SingleMarker/dynamicsConfiguration: 0
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/i_range_m_z: 1500
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/i_range_xy: 2.0
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/i_range_z: 0.4
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kR_xy: 70000
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kR_z: 60000
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kd_omega_rp: 200
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kd_xy: 0.2
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kd_z: 0.4
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/ki_m_z: 500
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/ki_xy: 0.05
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/ki_z: 0.05
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kp_xy: 0.4
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kp_z: 1.25
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kw_xy: 20000
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/kw_z: 12000
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/mass: 0.032
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/ctrlMel/massThrust: 132000
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/kalman/mNGyro_rollpitch: 0.1
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/kalman/mNGyro_yaw: 0.1
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/kalman/pNAcc_xy: 1.0
 * /crazyflieTypes/CF21SingleMarker/firmwareParams/kalman/pNAcc_z: 2.0
 * /crazyflieTypes/CF21SingleMarker/markerConfiguration: 3
 * /crazyflieTypes/default/batteryVoltageWarning: 3.8
 * /crazyflieTypes/default/batteryVoltateCritical: 3.7
 * /crazyflieTypes/default/bigQuad: False
 * /crazyflieTypes/default/dynamicsConfiguration: 0
 * /crazyflieTypes/default/firmwareParams/ctrlMel/i_range_m_z: 1500
 * /crazyflieTypes/default/firmwareParams/ctrlMel/i_range_xy: 2.0
 * /crazyflieTypes/default/firmwareParams/ctrlMel/i_range_z: 0.4
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kR_xy: 70000
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kR_z: 60000
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kd_omega_rp: 200
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kd_xy: 0.2
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kd_z: 0.4
 * /crazyflieTypes/default/firmwareParams/ctrlMel/ki_m_z: 500
 * /crazyflieTypes/default/firmwareParams/ctrlMel/ki_xy: 0.05
 * /crazyflieTypes/default/firmwareParams/ctrlMel/ki_z: 0.05
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kp_xy: 0.4
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kp_z: 1.25
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kw_xy: 20000
 * /crazyflieTypes/default/firmwareParams/ctrlMel/kw_z: 12000
 * /crazyflieTypes/default/firmwareParams/ctrlMel/mass: 0.032
 * /crazyflieTypes/default/firmwareParams/ctrlMel/massThrust: 132000
 * /crazyflieTypes/default/markerConfiguration: 0
 * /crazyflieTypes/defaultSingleMarker/batteryVoltageWarning: 3.8
 * /crazyflieTypes/defaultSingleMarker/batteryVoltateCritical: 3.7
 * /crazyflieTypes/defaultSingleMarker/bigQuad: False
 * /crazyflieTypes/defaultSingleMarker/dynamicsConfiguration: 0
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/i_range_m_z: 1500
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/i_range_xy: 2.0
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/i_range_z: 0.4
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kR_xy: 70000
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kR_z: 60000
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kd_omega_rp: 200
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kd_xy: 0.2
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kd_z: 0.4
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/ki_m_z: 500
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/ki_xy: 0.05
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/ki_z: 0.05
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kp_xy: 0.4
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kp_z: 1.25
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kw_xy: 20000
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/kw_z: 12000
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/mass: 0.032
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/ctrlMel/massThrust: 132000
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/kalman/mNGyro_rollpitch: 0.2
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/kalman/mNGyro_yaw: 0.1
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/kalman/pNAcc_xy: 4.0
 * /crazyflieTypes/defaultSingleMarker/firmwareParams/kalman/pNAcc_z: 8.0
 * /crazyflieTypes/defaultSingleMarker/markerConfiguration: 3
 * /crazyflieTypes/large/batteryVoltageWarning: 11.4
 * /crazyflieTypes/large/batteryVoltateCritical: 11.1
 * /crazyflieTypes/large/bigQuad: True
 * /crazyflieTypes/large/dynamicsConfiguration: 0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/i_range_m_z: 1500
 * /crazyflieTypes/large/firmwareParams/ctrlMel/i_range_xy: 2.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/i_range_z: 4.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kR_xy: 30000
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kR_z: 40000
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kd_omega_rp: 100
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kd_xy: 3.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kd_z: 3.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/ki_m_z: 500
 * /crazyflieTypes/large/firmwareParams/ctrlMel/ki_xy: 1.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/ki_z: 2.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kp_xy: 8.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kp_z: 8.0
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kw_xy: 9000
 * /crazyflieTypes/large/firmwareParams/ctrlMel/kw_z: 10000
 * /crazyflieTypes/large/firmwareParams/ctrlMel/mass: 0.38
 * /crazyflieTypes/large/firmwareParams/ctrlMel/massThrust: 5400
 * /crazyflieTypes/large/markerConfiguration: 2
 * /crazyflieTypes/medium/batteryVoltageWarning: 7.6
 * /crazyflieTypes/medium/batteryVoltateCritical: 7.4
 * /crazyflieTypes/medium/bigQuad: True
 * /crazyflieTypes/medium/dynamicsConfiguration: 0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/i_range_m_z: 1500
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/i_range_xy: 2.0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/i_range_z: 2.0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kR_xy: 50000
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kR_z: 60000
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kd_omega_rp: 200
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kd_xy: 1.0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kd_z: 1.0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/ki_m_z: 500
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/ki_xy: 0.1
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/ki_z: 0.5
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kp_xy: 2.0
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kp_z: 3
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kw_xy: 16000
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/kw_z: 12000
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/mass: 0.11
 * /crazyflieTypes/medium/firmwareParams/ctrlMel/massThrust: 23000
 * /crazyflieTypes/medium/markerConfiguration: 1
 * /crazyflies: [{'initialPositio...
 * /crazyswarm_server/enable_logging: False
 * /crazyswarm_server/enable_parameters: True
 * /crazyswarm_server/firmwareParams/commander/enHighLevel: 1
 * /crazyswarm_server/firmwareParams/kalman/resetEstimation: 1
 * /crazyswarm_server/firmwareParams/locSrv/extPosStdDev: 1e-3
 * /crazyswarm_server/firmwareParams/locSrv/extQuatStdDev: 0.05
 * /crazyswarm_server/firmwareParams/ring/effect: 16
 * /crazyswarm_server/firmwareParams/ring/headlightEnable: 0
 * /crazyswarm_server/firmwareParams/ring/solidBlue: 255
 * /crazyswarm_server/firmwareParams/ring/solidGreen: 0
 * /crazyswarm_server/firmwareParams/ring/solidRed: 0
 * /crazyswarm_server/firmwareParams/stabilizer/controller: 2
 * /crazyswarm_server/firmwareParams/stabilizer/estimator: 2
 * /crazyswarm_server/force_no_cache: False
 * /crazyswarm_server/genericLogTopicFrequencies: [10]
 * /crazyswarm_server/genericLogTopic_log1_Variables: ['stateEstimate.x...
 * /crazyswarm_server/genericLogTopics: ['log1']
 * /crazyswarm_server/motion_capture_type: vicon
 * /crazyswarm_server/object_tracking_type: motionCapture
 * /crazyswarm_server/print_latency: False
 * /crazyswarm_server/save_point_clouds: ~/pointCloud.ot
 * /crazyswarm_server/send_position_only: False
 * /crazyswarm_server/vicon_host_name: 192.168.2.1
 * /crazyswarm_server/world_frame: /world
 * /crazyswarm_server/write_csvs: False
 * /crazyswarm_teleop/csv_file: /home/liam/drones...
 * /crazyswarm_teleop/timescale: 0.8
 * /dynamicsConfigurations/0/maxFitnessScore: 0.001
 * /dynamicsConfigurations/0/maxPitch: 1.4
 * /dynamicsConfigurations/0/maxPitchRate: 20.0
 * /dynamicsConfigurations/0/maxRoll: 1.4
 * /dynamicsConfigurations/0/maxRollRate: 20.0
 * /dynamicsConfigurations/0/maxXVelocity: 2.0
 * /dynamicsConfigurations/0/maxYVelocity: 2.0
 * /dynamicsConfigurations/0/maxYawRate: 10.0
 * /dynamicsConfigurations/0/maxZVelocity: 3.0
 * /markerConfigurations/0/numPoints: 4
 * /markerConfigurations/0/offset: [0.0, -0.01, -0.04]
 * /markerConfigurations/0/points/0: [0.0177184, 0.013...
 * /markerConfigurations/0/points/1: [-0.0262914, 0.05...
 * /markerConfigurations/0/points/2: [-0.0328889, -0.0...
 * /markerConfigurations/0/points/3: [0.0431307, -0.03...
 * /markerConfigurations/1/numPoints: 4
 * /markerConfigurations/1/offset: [0.0, 0.0, -0.03]
 * /markerConfigurations/1/points/0: [-0.00896228, -0....
 * /markerConfigurations/1/points/1: [-0.0156318, 0.09...
 * /markerConfigurations/1/points/2: [0.0461693, -0.08...
 * /markerConfigurations/1/points/3: [-0.0789959, -0.0...
 * /markerConfigurations/2/numPoints: 4
 * /markerConfigurations/2/offset: [0.0, 0.0, -0.06]
 * /markerConfigurations/2/points/0: [0.0558163, -0.00...
 * /markerConfigurations/2/points/1: [-0.0113941, 0.00...
 * /markerConfigurations/2/points/2: [-0.0306277, 0.05...
 * /markerConfigurations/2/points/3: [0.0535816, -0.04...
 * /markerConfigurations/3/numPoints: 1
 * /markerConfigurations/3/offset: [0.0, -0.01, -0.04]
 * /markerConfigurations/3/points/0: [0.0177184, 0.013...
 * /numDynamicsConfigurations: 1
 * /numMarkerConfigurations: 4
 * /rosdistro: melodic
 * /rosversion: 1.14.3

NODES
  /
    crazyswarm_server (crazyswarm/crazyswarm_server)
    crazyswarm_teleop (crazyswarm/crazyswarm_teleop)
    rviz (rviz/rviz)

auto-starting new master
process[master]: started with pid [31728]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to e2e2e8ca-d69b-11ea-b975-7cdd90b11476
process[rosout-1]: started with pid [31774]
started core service [/rosout]
process[crazyswarm_server-2]: started with pid [31792]
process[crazyswarm_teleop-3]: started with pid [31793]
process[rviz-4]: started with pid [31794]
[ INFO] [1596577561.282877772]: Wait for services...
[ INFO] [1596577561.284150409]: waitForService: Service [/emergency] has not been advertised, waiting...
[ INFO] [1596577561.326552492]: waitForService: Service [/emergency] is now available.
[ INFO] [1596577561.329570718]: Manager ready.
ch: 1
[ INFO] [1596577561.389560685]: Adding CF: cf17 (radio://0/105/2M/E7E7E7E711, cf17)...
[ INFO] [1596577561.416763960]: CF ctor: 0.026009 s
[ INFO] [1596577561.420315391]: [cf17] SYS: ----------------------------
[ INFO] [1596577561.422628799]: [cf17] SYS: Crazyflie 2.0 is up and running!
[ INFO] [1596577561.425069535]: [cf17] SYS: Build 8:febc78015a9b (2019.09 +8) CLEAN
[ INFO] [1596577561.428688046]: [cf17] SYS: I am 0x333636353235510E0028002D and I have 1024KB of flash!
[ INFO] [1596577561.430124915]: [cf17] CFGBLK: v1, verification [OK]
[ INFO] [1596577561.431531193]: [cf17] DECK_CORE: 1 deck(s) found
[ INFO] [1596577561.434195744]: [cf17] DECK_CORE: Calling INIT on driver bcLedRing for deck 0
[ INFO] [1596577561.435610319]: [cf17] MPU9250 I2C connection [OK].
[ INFO] [1596577561.437011752]: [cf17] AK8963 I2C connection [OK].
[ INFO] [1596577561.438408208]: [cf17] LPS25H I2C connection [OK].
[ INFO] [1596577561.440896644]: [cf17] ESTIMATOR: Using Complementary (1) estimator
[ INFO] [1596577561.443189289]: [cf17] CONTROLLER: Using PID (1) controller
[ INFO] [1596577561.445422767]: [cf17] MTR-DRV: Using brushed motor driver
[ INFO] [1596577561.446822345]: [cf17] EEPROM: I2C connection [OK].
[ INFO] [1596577561.448082201]: [cf17] AK8963: Self test [OK].
[ INFO] [1596577561.450339282]: [cf17] STAB: Wait for sensor calibration...
[ INFO] [1596577561.451699796]: [cf17] SYS: Free heap: 13624 bytes
[ INFO] [1596577561.452871326]: [cf17] STAB: Ready to fly.
[ INFO] [1596577561.453700201]: [cf17] Requesting parameters...
[ INFO] [1596577561.501568682]: Found variables in cache.
[ INFO] [1596577561.785736397]: [cf17] reqParamTOC: 0.368886 s (165 params)
[ INFO] [1596577561.785815929]: Requesting memories...
[ INFO] [1596577561.813397434]: Memories: 9
[ INFO] [1596577561.865966927]: [cf17] Ready. Elapsed: 0.449113 s
[ INFO] [1596577561.866026981]: CF run: 0.449294 s
update commander/enHighLevel to 1
update kalman/resetEstimation to 1
update locSrv/extPosStdDev to 0.001
update locSrv/extQuatStdDev to 0.05
update ring/effect to 16
update ring/headlightEnable to 0
update ring/solidBlue to 255
update ring/solidGreen to 0
update ring/solidRed to 0
update stabilizer/controller to 2
update stabilizer/estimator to 2
update ctrlMel/i_range_m_z to 1500
update ctrlMel/i_range_xy to 2
update ctrlMel/i_range_z to 0.4
update ctrlMel/kR_xy to 70000
update ctrlMel/kR_z to 60000
update ctrlMel/kd_omega_rp to 200
update ctrlMel/kd_xy to 0.2
update ctrlMel/kd_z to 0.4
update ctrlMel/ki_m_z to 500
update ctrlMel/ki_xy to 0.05
update ctrlMel/ki_z to 0.05
update ctrlMel/kp_xy to 0.4
update ctrlMel/kp_z to 1.25
update ctrlMel/kw_xy to 20000
update ctrlMel/kw_z to 12000
update ctrlMel/mass to 0.032
update ctrlMel/massThrust to 132000
[ INFO] [1596577561.882963701]: [cf17] Update parameters
[ INFO] [1596577561.922959591]: [cf17] SYS: Assert failed src/modules/src/crtp.c:186
[ INFO] [1596577562.095741068]: [cf17] SYS: ----------------------------
[ INFO] [1596577562.115670736]: [cf17] SYS: Crazyflie 2.0 is up and running!
[ INFO] [1596577562.163012855]: [cf17] SYS: Build 8:febc78015a9b (2019.09 +8) CLEAN
[ INFO] [1596577562.166981569]: [cf17] SYS: I am 0x333636353235510E0028002D and I have 1024KB of flash!
[ WARN] [1596577562.208197961]: [cf17] Link Quality low (0.100000)
[ INFO] [1596577562.217355825]: [cf17] DECK_CORE: 1 deck(s) found
[ INFO] [1596577562.220267741]: [cf17] DECK_CORE: Calling INIT on driver bcLedRing for deck 0
[ INFO] [1596577562.223748847]: [cf17] SYS: Assert failed src/modules/src/crtp.c:186
[ INFO] [1596577563.055901641]: [cf17] MPU9250 I2C connection [OK].
[ INFO] [1596577563.414108297]: [cf17] AK8963 I2C connection [OK].
[ INFO] [1596577563.440505771]: [cf17] LPS25H I2C connection [OK].
[ INFO] [1596577563.443228260]: [cf17] ESTIMATOR: Using Complementary (1) estimator
[ INFO] [1596577563.445602042]: [cf17] CONTROLLER: Using PID (1) controller
[ INFO] [1596577563.448072601]: [cf17] MTR-DRV: Using brushed motor driver
[ INFO] [1596577563.937740584]: [cf17] EEPROM: I2C connection [OK].
[ INFO] [1596577564.173272935]: [cf17] AK8963: Self test [OK].
[ WARN] [1596577564.792814766]: [cf17] Link Quality low (0.700000)
[ INFO] [1596577564.973907218]: [cf17] SYS: The system resumed after watchdog timeout [WARNING]
[ INFO] [1596577564.976724732]: [cf17] SYS: Assert failed at src/modules/src/crtp.c:186
^C[rviz-4] killing on exit
[crazyswarm_teleop-3] killing on exit
[crazyswarm_server-2] killing on exit
terminate called after throwing an instance of 'std::runtime_error'
  what():  timeout
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done

I attempted to look at "src/modules/src/crtp.c:186" where the assert fails according to the [INFO] output. It appears to be something to do about packet dropping/queue management, but I'm not sure where the best place to tackle the problem is.

Thank you for any help

PartiallyObservable commented 4 years ago

We just found this issue https://github.com/USC-ACTLab/crazyswarm/issues/182 and attempted that solution. It appears to have "fixed" it? I will close this issue if this continues to be a good fix (only had time to test it a few times).

whoenig commented 4 years ago

This is still a "good" fix that I am using in practice as well (I recently tested with 16 CFs). There is no issue with correctness, as long as you use the crazyswarm, and likely no issue with the official Python library. Getting a proper fix in the official firmware will take some time (but we are working with Bitcraze on that).

Other than that, I usually use the latest official firmware STM32/NRF51 these days, especially if you hit issues regarding a firmware reboot which might be caused by firmware bugs that are fixed in the latest version.

Flashing with chooser.py or a JTAG debugger is the preferred method, since the official GUI has (surprisingly) no verification step, and I have had issues that flashing was shown as success, but some pages were written improperly in the flash. Chooser.py uses the crazyflie_cpp library under the hood, which always verifies the flashed firmware. If you flash using a JTAG debugger, verification is executed also.

PartiallyObservable commented 4 years ago

I see, I think this will be our working solution then. Thank you for your confirmation and input about firmware flashing. We will use chooser.py in the future to make sure we don't have sneaky firmware issues come up.