### Thrust Mapping for Pavo Pico #### Thrust Test Stand setup Screw size M3 20mm, and 16mm. <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/ryyon5D9A.jpg" width="300"> <img src="https://hackmd.io/_uploads/ByDZjDG9A.jpg" width="300"> </div> #### Pipeline 0. Mount everything on a vertical plane. After mounting, take raw measurements with only the drone/motor. That is our zero Thrust value. Add a little bit of mass like 5g on top of the drone and measure again. Repeat this process for weights upto max thrust that the drone can generate. (Max Thrust = Drone Weight*TWR) 1. Power up the raspberry Pi with 5V adapter, connect laptop to robotlab wifi, and SSH into the raspberry Pi connected to the force sensor. ``` SSH address: 10.0.0.50 Username: ubuntu Password: **r0b0t** example: ssh ubuntu@10.0.0.50 ``` **N.B**: If you are not sure about the IP address, check `/etc/netplan` by connecting the pi to a display and the check the file `netcfg-usb-ethernet.yaml` for the ehternet IP address and the file `netcfg-wifi.yaml` for wifi IP address. After changing the IP address, you need to run `sudo netplan apply` 2. Connect the Flight controller to the laptop using USB C. Launch Betaflight configurator. Go to the `motors` tab and set the master slider to different values to take thrust measurements at different throttles. ![image](https://hackmd.io/_uploads/HylZcwf5C.png) 3. Connect the power supply output to the drone's power connector. Set the power supply to the desired voltage. For a single cell LiPo, the maximum voltage = 4.2 V, Nominal voltage = 3.7 V, Minimum voltage = 3.2 V. Therefore, for a 2S battery, 8.4V represents 100% battery, 7.8V represents 73% battery, 7.4V represents 55% battery, and 6.6V represents 18% battery. 4. On the pi side, cd to `~/thrust_test_stand/logging` and run `cargo build`. This will build the rust code for the thrust_stand. Everytime you make a change in the `~/thrust_test_stand/logging/src/main.rs`, you must re-build. 5. To run a measurement, while you set the master motor slider to a specific throttle on Betaflight, on the pi side, you need to run the `pi-tts` executable from `./~/thrust_test_stand/logging/target/debug/pi-tts`. Usage: ``` Usage: ./logging/target/debug/pi-tts <filename.csv> ``` This will save a csv in the current directory with 100 raw measurements and print the mean of those measurements on the terminal. Feel free the change the [main.rs](https://gitlab.developers.cam.ac.uk/cst/prorok-lab/drones/thrust_test_stand/-/blob/main/logging/src/main.rs?ref_type=heads) code if you wish to change the sample size or anything else. (N.B: you might need to run `sudo chmod 777 dev/gpiomem` and `sudo chmod 777 /dev/gpiochip0` before running pi-tts) 7. Note down the mean value printed on the terminal for the corresponding throttle. #### Results <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/S1Wqo4Mc0.png" width="400"> </div> Raw Measurements to Thrust in Newtons mapping: $y = 394.5 x - 10.34$ - thrust_to_throttle Quadratic for vbat = 8.4V: $-14.07 x^{2} + 253.9 x + 1136$ - thrust_to_throttle Quadratic for vbat = 7.8V: $-26.92 x^{2} + 296.3 x + 1162$ - thrust_to_throttle Quadratic for vbat = 7.4V: $-32.55 x^{2} + 321.5 x + 1166$ - thrust_to_throttle Quadratic for vbat = 6.6V: $-83.23 x^{2} + 437.2 x + 1176$ #### Data https://drive.google.com/drive/folders/1hVy3odrlWDYoCE12Rik2i4Z5xniBwE1U?usp=drive_link ### Thrust Mapping for Raven 2207 with Black Props #### Pipeline 1. Step 0 and Step 1 same as Pavo Pico. 2. Connect the configured Flight controller to your laptop using a USB-C cable and check the /dev port. The flight controller needs to be configured to turn off battery compensation, stabilization, etc. Ask Ajay for more details. 3. On your laptop, open a terminal and cd to `~/projects/raven_thrust_ws` and source ROS2. Run `start_mavros.sh`. Use the correct /dev port for the flight controller and check if the content looks like this: ``` ros2 run mavros mavros_node --ros-args --params-file ~/projects/ros2_sanity_ws/src/Freyja/freyja_configfiles/> -p fcu_url:=/dev/ttyACM0:921600 -p tgt_system:=7 ``` Launch `./start_mavros.sh` in this terminal. Check if the correct FC has been recognized. ![mavros_FCU_detected_properly](https://hackmd.io/_uploads/B1NbacIWkl.png) 4. On your laptop, open a terminal and cd to `~/projects/raven_thrust_ws` and source ROS2. Source `setup_ws.sh`. The content of the file looks like the following: ``` #!/bin/bash source /opt/ros/humble/setup.bash echo "running setup.bash!" function arm { ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{command: 400, param1: 1}" } function disarm { ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{command: 400, param1: 0}" } function guided { ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{command: 176, param1: 1, param2: 20}" } function stabilized { ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{command: 176, param1: 80}" } function throttle { ros2 topic pub -1 /mavros/setpoint_raw/attitude mavros_msgs/msg/AttitudeTarget "{thrust: $1}" } ``` This bash script sets up functions for arming, disarming, switching to guided mode, and publishing a specific thrust command. Example: `guided` (throttle values should be printing on the terminal where mavros is running) > `throttle 0.XX` > `arm` > `throttle 0.0` > `disarm` Repeat this for throttles = [0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.13, 0.15, 0.17, 0.2, 0.25, 0.3, 0.35, 0.4] 5. Connect the power supply output to the drone's power connector. Set the power supply to the desired voltage. For a single cell LiPo, the maximum voltage = 4.2 V, Nominal voltage = 3.7 V, Minimum voltage = 3.2 V. Test points = (4.2,3.9,3.6,3.3). Therefore, for a 4S battery, 16.8V represents 100% battery, 15.6V represents 70% battery, 14.4V represents 40% battery, and 13.2V represents 10% battery. 6. To run a measurement, while you set the throttle to desired value on step 4. And on the pi side, you need to run the `pi-tts` executable from `./~/thrust_test_stand/logging/target/debug/pi-tts`. This will save a csv in the current directory with 100 raw measurements and print the mean of those measurements on the terminal. Feel free the change the [main.rs](https://gitlab.developers.cam.ac.uk/cst/prorok-lab/drones/thrust_test_stand/-/blob/main/logging/src/main.rs?ref_type=heads) code if you wish to change the sample size or anything else. 6. Note down the mean value printed on the terminal for the corresponding throttle. ![Screenshot from 2024-08-27 16-59-02](https://hackmd.io/_uploads/ryHWOdsiC.png) ![Screenshot from 2024-08-27 19-39-27_small](https://hackmd.io/_uploads/rJHPKvhiC.png) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/rJmDO_sj0.jpg" width="400"> <img src="https://hackmd.io/_uploads/r1Hw__sjC.jpg" width="400"> </div> #### Results <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/ryoF-vLn0.png" width="400"> <img src="https://hackmd.io/_uploads/ByoY-PU2C.png" width="400"> <img src="https://hackmd.io/_uploads/S1iSzD8hR.png" width="400"> </div> Raw Measurements to Thrust in Newtons mapping: $y = -400.7 x + 5.16$ ``` def thrust_to_throttle(thrust: float, coeffs: list): value = thrust a, b, c = coeffs det = b**2 - 4*a*(c - value) return (-b + np.sqrt(det)) / (2 * a) --------------------------------------- throttle_to_thrust coeff for vbat = 16.8V: [ 0.55540583 10.80879523 -0.15239388] throttle_to_thrust coeff for vbat = 15.6V: [-0.14760495 10.43810104 -0.13434255] throttle_to_thrust coeff for vbat = 14.4V: [-1.91057637 10.78123793 -0.05896835] throttle_to_thrust coeff for vbat = 13.2V: [-3.74411458 11.55497434 -0.10923331] ``` #### Data https://drive.google.com/drive/folders/1nBHkRRdTQQB7GaVfv3lyz64TGsDI-H9c?usp=sharing