mwbb
September 10, 2024, 12:44am
1
PX4 Sync / Q&A: Sep 11, 2024
Agenda
Announcements
Release Discussion
Q&A
Announcements
Release Discussion
The one and only last blocker?
The last one moved to the next release!
Latest Release Tag
Tests are still welcomed!
Bug report / Q&A
1- Flight tests by @mwbb using 6XRT. Only noticeable issue was the distance sensor not up sometimes. Maybe not fused even?
@dagar The spikes from the distance sensor are not fused anyways.
2 - What is a recommended way to plot logs on MacOS locally?
3- [Bug] Simple Position Control fails to set Position Setpoint after stick movement · Issue #23589 · PX4/PX4-Autopilot · GitHub → Fixed here!
4- @bonolo Is it possible to have the requirement for QGC disabled while running on SITL? Or maybe mentioning this on the documentation how this could be possible?
@dagar @Jaeyoung-Lim the basic idea is to have the simulation environment as close possible to real hardware tests making it necessary to encourage everyone to use QGC either on SITL or the hardware.
PRs needing review
PX4:main
← iq-motion-control:main
opened 06:02PM - 14 Mar 24 UTC
High Level About this Pull Request
=============================
As previously… discussed with @dagar, this pull request seeks to further couple the relationship between the PX4 flight controller and [Vertiq modules](https://www.vertiq.co/). At its core, this PR introduces the IQUART serial protocol into PX4, and in doing so provides the flight controller with the ability to control and configure connected Vertiq modules
IQUART and its Clients
-------------------------
The IQUART serial protocol is built around its ability to communicate with a series of Clients and Entries available on Vertiq modules. All [IQUART messages](https://iqmotion.readthedocs.io/en/latest/intro.html) specify a target module ID, type ID, and type sub-ID. Type IDs refer to unique identification values given to each different IQUART client. Sub-IDs refer to specific entries within the client. For example, the Serial Interface Client (type ID 16) provides one entry with sub-ID 0.
![Screenshot 2024-03-07 125725](https://github.com/PX4/PX4-Autopilot/assets/120586722/6da96606-215f-450e-a10f-104fb8414fbd)
A key portion of this PR is the inclusion of [Vertiq’s C++ library](https://github.com/iq-motion-control/iq-module-communication-cpp) as a git submodule. The library provides a C++ representation of all possible Veritq clients as well as functions for packaging proper IQUART messages.
What We’ve Added to PX4
==================
Basic User Interface
------------------------
The following examples are performed using a Pixhawk 6c using the Generic Quadcopter airframe. These serve to help in understanding the structure of the backend Vertiq support.
Boardconfig Options
****************************
![Screenshot 2024-03-07 143926](https://github.com/PX4/PX4-Autopilot/assets/120586722/b16453d5-8f19-418b-8552-178ca443c01b)
![Screenshot 2024-03-07 143942](https://github.com/PX4/PX4-Autopilot/assets/120586722/c8ec0d1c-0531-4793-a254-18d5317f0b59)
![Screenshot 2024-03-07 143954](https://github.com/PX4/PX4-Autopilot/assets/120586722/ed5900ee-1796-466b-97e8-3191d7d198b6)
- Vertiq IO
Provides access to basic Vertiq module configuration through PX4 parameters. This configuration alone is not enough for flight through the IQUART protocol, but could be helpful in configuration where other protocols, such as DroneCAN, are being used to send throttle commands.
- Include IFCI Configuration Parameters
Provides access to parameters specific to the IQUART Flight Controller Interface. Enabling this configuration allows users to control a vehicle and receive telemetry from Vertiq modules through the serial port configured to vertiq_io.
- Include Pulsing Module Configuration Parameters
Provides access to specialized parameters available only for “pulsing modules.” These are modules equipped with specialized Vertiq firmware and our [Vertiq UP12 propeller](https://www.vertiq.co/up12).
Configuration with QGroundControl
*******************************************************
At the moment, the easiest way for users to interact with and configure our modules is through Vertiq’s [IQ Control Center software](https://github.com/iq-motion-control/iq-control-center). As you can imagine, having to unplug serial connections from PX4 and reconnect them to the Control Center is a laborious process. While users could add an extra serial connection to use serial passthrough, this is not always possible. Therefore, by providing module configuration functionality directly to the flight controller, we make our users’ lives much easier.
![Screenshot 2024-03-07 145720](https://github.com/PX4/PX4-Autopilot/assets/120586722/b1f1c739-0dbc-4090-968b-1848dced63c3)
After selecting a serial port
![Screenshot 2024-03-07 145812](https://github.com/PX4/PX4-Autopilot/assets/120586722/a75c649e-688a-449c-8206-7afafb1b0783)
When the matching baud rate is set, we see the module with the matching Module ID to TARGET_MODULE_ID’s parameters appear. With this configuration, those parameters are MAX_VELOCITY, MAX_VOLTS, CONTROL_MODE, THROTTLE_CVI, VERTIQ_FC_DIR, and VERTIQ_MOTOR_DIR.
The parameters that change based on the value of TARGET_MODULE_ID are those managed by the Vertiq Configuration Handler class.
Target Module ID 0
![Screenshot 2024-03-07 151858](https://github.com/PX4/PX4-Autopilot/assets/120586722/616a982e-da7a-4301-9d8e-e30033e35894)
Target Module ID 1
![Screenshot 2024-03-07 152106](https://github.com/PX4/PX4-Autopilot/assets/120586722/949deb91-e9fe-4f7a-b568-07189fd3abf8)
I did not change any values besides the TARGET_MODULE_ID, and you can see that the other Vertiq parameters were updated with values gotten from the module with ID 1.
Code Structure
------------------------
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/cfacd017-166d-4fc3-99da-ac517d287250)
Class Descriptions
*************************
Vertiq IO
- Responsible for spawning our task, and contains our run()
- Contains our updateOutputs function for motor control
- Contains 3 Vertiq Clients used as part of motor control: a Propeller Motor Control Client, an Arming Handler Client, and an IFCI - Client all set to broadcast to all connected modules
- Creates and updates all other objects used in the module
Vertiq Serial Interface
- Responsible for configuring the selected hardware serial port
- Responsible for reading data from the serial peripheral and passes it to the active Vertiq clients
- Responsible for taking data written by the active Vertiq clients, and writing out data to the serial peripheral
Vertiq Client Manager
- Can be given new Vertiq clients of any type to manage by any external object
- Manages a list of clients up to a predefined maximum amount
- Handles client communication by periodically telling the serial interface to transmit queued messages and to have each client process received data
Vertiq Configuration Handler
- Responsible for maintaining any Vertiq client objects which are created and destroyed as TARGET_MODULE_ID changes
- Responsible for managing a list of EntryWrapper objects
EntryWrappers are used to link together a PX4 parameter and a Vertiq Client’s Entry, and are covered in more detail later
Vertiq Telemetry Manager
- Responsible for maintaining an IQUART Flight Controller Interface client which gets created and destroyed as the Module ID for telemetry changes
- Responsible for generating the correct Module ID for the next module whose telemetry we want
- Responsible for publishing to the esc_status uORB topic the data received from modules
About EntryWrapper Objects
**************************************
As mentioned above, an EntryWrapper is an object meant to connect a PX4 parameter with a Vertiq Client Entry. The goal is to ensure that when an EntryWrapper’s PX4 parameter changes, that the same change is reflected on the connected motor with the module ID TARGET_MODULE_ID.
The process for updating EntryWrappers is described by the following diagrams. The top describes what happens at a higher level when any Vertiq parameter is changed, and the bottom describes the decisions made by the EntryWrapper itself during its update.
High Level
[<img src="https://github.com/PX4/PX4-Autopilot/assets/120586722/d5fb4044-4cfc-4c3d-9603-46bef27939ea" width="300"/>](https://github.com/PX4/PX4-Autopilot/assets/120586722/d5fb4044-4cfc-4c3d-9603-46bef27939ea)
Entry Wrapper
[<img src="https://github.com/PX4/PX4-Autopilot/assets/120586722/140ea73c-4ec3-4249-80bc-6db74f6bf64e" width ="300"/>](https://github.com/PX4/PX4-Autopilot/assets/120586722/140ea73c-4ec3-4249-80bc-6db74f6bf64e)
Parameters
-------------------
Different PX4 parameters become available depending on the build configuration set at the kconfig level. Any configuration listed also includes all parameters available in the configuration above it.
Vertiq IO Enabled
************************
- VERTIQ_IO_CFG
The serial port mapped to our module
- VERTIQ_BAUD
The baud rate to use on the serial port we open and manage
- TARGET_MODULE_ID
This is the module ID of the module that you would like to communicate with at the parameter level. All clients in the Vertiq Configuration Handler will be deleted and recreated with this module ID in their reinitialization
- TRIGGER_READ
A boolean parameter that allows you to refresh responses from the module with module ID TARGET_MODULE_ID
- CONTROL_MODE
This parameter is part of an EntryWrapper. This means that it acts as both a PX4 parameter and a Vertiq Client Entry. Specifically, this parameter interacts with the mode entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- MAX_VELOCITY
This parameter is part of an EntryWrapper that interacts with the velocity_max entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- MAX_VOLTS
This parameter is part of an EntryWrapper that interacts with the volts_max entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- VERTIQ_MOTOR_DIR
This parameter is part of an EntryWrapper that interacts with the sign entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- VERTIQ_FC_DIR
This parameter is part of an EntryWrapper that interacts with the flip_negative entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
IFCI Configuration Enabled
***********************************
- VERTIQ_NUM_CVS
The number of Control Values (discussed more [here](https://iqmotion.readthedocs.io/en/latest/manual/manual_ifci_control.html#iquart-flight-controller-interface)) that will be transmitted during each updateOutputs call
- DISARM_TRIGGER
This specifies the behavior to be used when the mixer disarms. The choices are enumerated as the following
- USER_MIXER_VALUE
Specifies that the output control values should match the value set as the mixer’s disarmed value for each ESC channel
- TRIGGER_MOTOR_DISARM
Sends an explicit disarm command to all connected motors
- COAST_MOTOR
Sends an explicit coast command to all connected motors. When coasted, Vertiq ESCs stop sending control voltages allowing the motor to spin freely
- SEND_PREDEFINED_VELOCITY
Sends an explicit [control velocity](https://iqmotion.readthedocs.io/en/latest/manual/manual_velocity_control_mechanisms.html#control-velocity) command to all connected motors
- ARMING_BEHAVE
This specifies the behavior to be used when the mixer arms. The choices are enumerated as the following
- FORCE_ARMING
Sends an explicit arm command to all connected motors
- USE_MOTOR_ARMING
Uses each of the connected modules’ [unique arming configurations](https://iqmotion.readthedocs.io/en/latest/manual/manual_advanced_arming.html) to decide its own behavior based on the output throttle
- THROTTLE_CVI
This parameter is part of an EntryWrapper that interacts with the throttle_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- TELEM_IDS_1
This is a 32 bit bitmask with values 0-31 that allows users to easily select the module IDs from which they would like to receive telemetry. Combines with TELEM_IDS_2 to create a 64-bit bitmask of all possible Vertiq module IDs
- TELEM_IDS_2
This is a 32 bit bitmask with values 32-62 that allows users to easily select the module IDs from which they would like to receive telemetry. Combines with TELEM_IDS_1 to create a 64-bit bitmask of all possible Vertiq module IDs
Pulsing Configuration Enabled
****************************************
- PULSE_VOLT_MODE
This parameter is part of an EntryWrapper that interacts with the pulsing_voltage_mode entry in the [Pulsing Rectangular Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#prip-message-table)
- PULSE_VOLT_LIMIT
This parameter is part of an EntryWrapper that interacts with the pulsing_voltage_limit entry in the [Pulsing Rectangular Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#prip-message-table)
- X_CVI
This parameter is part of an EntryWrapper that interacts with the x_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- Y_CVI
This parameter is part of an EntryWrapper that interacts with the y_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- ZERO_ANGLE
This parameter is part of an EntryWrapper that interacts with the zero_angle entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
- VELOCITY_CUTOFF
This parameter is part of an EntryWrapper that interacts with the velocity_cutoff entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
- TORQUE_OFF_ANGLE
This parameter is part of an EntryWrapper that interacts with the propeller_torque_offset_angle entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
Telemetry
-----------------
With IFCI enabled, telemetry is requested from the Module IDs specified in the TELEM_IDS_1/2 in a round robin fashion. The data returned are described in the following struct:
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/9d34648a-88a5-461c-801a-b763c81d0ce6)
Using the response, we fill in the esc_status publication’s esc_rpm, esc_voltage, esc_current, esc_power, and esc_temperature. The esc_armed_flags and esc_online_flags are set high for each ESC after the first successfully received telemetry response from each expected motor.
Non-Pulsing Flight Configuration Example with a Pixhawk 6c
==========================================
In this example, our connected modules are set to a 921600 baud with module IDs 0, 26, 42, and 62 (configured using the [IQ Control Center software](https://github.com/iq-motion-control/iq-control-center))
1. Run boardconfig in order to turn on Vertiq IO and IFCI Configuration
2. Build and flash the firmware
3. Select Generic Quadcopter airframe and run sensor calibration
4. Set the VERTIQ_IO_CFG to TELEM 2 for this example. Save and reboot
5. Set the VERTIQ_BAUD parameter to 921600, and reboot
6. Connect the 4 modules to the Pixhawk in this configuration
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/32cd55ea-3438-4e0c-8979-b6a9e3c0f430)
7. Set VERTIQ_NUM_CVS to 4, TELEM_IDS_1 check 0 and 26, TELEM_IDS_2 check 42 and 62, and reboot
In this case, we have 4 modules connected, each of which supports only the Throttle Control Value. In order for each of the modules to receive their own unique throttle command, we must send 4 Control Values (CVs)
8. Set TARGET_MODULE_ID to 0, and set THROTTLE_CVI to 0, CONTROL_MODE to Voltage, and MAX_VOLTS to 12. Do the same to all MODULE_IDS where each CVI is one greater than the next (TARGET_MODULE_ID 26 should have THROTTLE_CVI 1)
9. Use the Identify & Assign Motors tool to configure the ESCs correctly for their position
10. Ensure that each VERTIQ_MOTOR_DIR is correct for the module’s vehicle position. If not, change it to either 2D Clockwise or 2D Counter Clockwise to make it correct
11. For this example, I want to use Send Explicit Disarm as DISARM_TRIGGER so that we can hear the disarming sound
12. Configure your Radio, and you are ready to fly
Attached to this PR as well as below are a video of a hover flight as well as the log from it using the configuration described here.
[vertiq_io_flight_sample.MOV](https://drive.google.com/file/d/1Bq7Sy9mv1MScE1xmjAtSksE275PnTUAN/view?usp=drive_link)
[Link to Log](https://drive.google.com/file/d/13eH0guxELt_3NYcMXRza0fIbWoi-up3p/view?usp=sharing)
mavlink:master
← gillamkid:gillamkid/custom-qgc-linux-icon
opened 06:39PM - 07 Sep 24 UTC
# Description
QGC already allows in-app QGC icons to be replaced with a custom … variant in the custom folder. This PR makes so desktop app icons shown in Linux are also the custom variant.
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Before/After pics
![before-linux-app-icon](https://github.com/user-attachments/assets/10c8b9e1-1f07-4556-b4bc-0ce3223a4807)
![after-linux-app-icon](https://github.com/user-attachments/assets/f3dbe0b9-ac47-4707-aca9-1d5ea5b6deb8)
mavlink:master
← gillamkid:gillamkid/sizing-fixes
opened 01:20PM - 07 Sep 24 UTC
# Description
Fixes a couple sizing bugs and makes button sizing/spacing look b… etter
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## fix 1 - exit confirm popup
![before-exit](https://github.com/user-attachments/assets/8a775ca5-a335-4887-9f79-f96dfcb0f7d2)
![after-exit](https://github.com/user-attachments/assets/8dcfe0fe-bad0-48ba-aa36-68788a996571)
## fix 2 - scaling buttons (also notice new button padding)
![before-scaling](https://github.com/user-attachments/assets/302f1cf7-d9f0-4ad3-811f-63761a84a95a)
![after-scaling](https://github.com/user-attachments/assets/d78ffbde-c24f-4225-bf01-4e28c768951a)
## fix 3 - indoor/outdoor brand image button alignment when no path is selected
![before-brand](https://github.com/user-attachments/assets/eb12ba4c-6e0e-44da-abd9-15bb091c1f3a)
![after-brand](https://github.com/user-attachments/assets/b9fab7a4-1ab8-4151-8e11-b1b1e690b807)
## inspiration for new button padding/sizes - google material design
i gave buttons larger left/right padding and minimum sizes in accordance with the Google material design 2 design doc
![Screenshot from 2024-09-06 16-12-02](https://github.com/user-attachments/assets/02ae240f-28c1-4f28-9436-3af79f874d47)
Merged:
mavlink:master
← gillamkid:gillamkid/custom-brand-image
opened 06:54PM - 06 Sep 24 UTC
Description
-----------
this PR does 2 things
1. fixes a couple bugs relating… to custom brand images
2. changes brand image used in custom-example to something more appropriate
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Brand Image Bug 1
![before-bug-dark](https://github.com/user-attachments/assets/4687c556-2a2e-45a1-bd7b-51d0947983dd)
## Brand Image Bug 2
![before-outdoor-bug](https://github.com/user-attachments/assets/c2cdd1df-d0b4-48fd-825b-484155f00869)
## Custom Brand Image before
![before-no-bug-indoor](https://github.com/user-attachments/assets/e0ca577e-eeb9-4575-b3d7-e379dbe57e39)
## Custom Brand Image After (indoor)
![after-dark](https://github.com/user-attachments/assets/a320c115-f24f-4e49-a278-2f803e673005)
## Custom Brand Image After (outdoor)
![after-outdoor](https://github.com/user-attachments/assets/7dd7058c-0a30-4e5f-b07c-49dca3c09ee7)
Conflicts to resolve:
mavlink:master
← gillamkid:gillamkid/fix-bloated-icon
opened 03:46PM - 04 Sep 24 UTC
# Description
The QGC icon shown in the top left corner of the app did not matc… h the typical QGC icon seen everywhere else (icon of QGC shortcut made after an install, icon branding on QGC website, etc). I replaced the instances of the extra-bloated Q with the more common QGC icon
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Before/After (icon in app)
![before-icon-in-app](https://github.com/user-attachments/assets/5a7909da-6448-495c-b98a-fcb6c2750a8a)
![after-icon-in-app](https://github.com/user-attachments/assets/ffd4defb-40ef-46fb-8fcd-d9385df007a7)
## Before/After (icon in svg editor view to show outline change)
![before-qgc-icon](https://github.com/user-attachments/assets/dd96e551-b9d4-4754-b8f3-26c69199f5ba)
![after-qgc-icon](https://github.com/user-attachments/assets/bc954004-2d58-42f3-9d05-caac775c0ba8)
PX4:main
← slgrobotics:stanley_pursuit
opened 08:33PM - 23 Aug 24 UTC
### Solved Problem
PX4 library offers L1 and Pure Pursuit library modules, whic… h can be used for vehicles. Another common trajectory following logic is Stanley Pursuit, which is currently missing from the library.
It is briefly described here:
https://dingyan89.medium.com/three-methods-of-vehicle-lateral-control-pure-pursuit-stanley-and-mpc-db8cc1d32081
### Solution
This PR adds a basic implementation of Stanley Pursuit
### Changelog Entry
For release notes:
```
New parameters: ST_XTRACK_GAIN, ST_SOFTENING
```
### Test coverage
- Unit tests included in the PR
### Note
In my experience so far, Stanley Pursuit is the best fit for my gas-driven zero-turn lawnmower, compared to L1 and Pure Pursuit, which I also tried. When close line following is a priority, Stanley algorithm provides minimal oscillations and directly targets to minimize cross-track distance.
bonolo
September 10, 2024, 11:48am
2
Is it possible to run PX4+ROS+Gazebo in offboard mode without running QGC? When I tried the tutorial example ros2 run px4_ros_com offboard_control
, nothing happens when the arm command is sent (see terminal output below). If I open QGC then run the ROS node again, the vehicle is armed, takesoff and hovers 5m above ground as expected.
Does uXRCE-DDS communication in PX4 simulation depend on QGC running?
Could we discuss this PR/push it along? We recently updated it to the newest master as requested, but then it got stuck waiting again:
PX4:main
← iq-motion-control:main
opened 06:02PM - 14 Mar 24 UTC
High Level About this Pull Request
=============================
As previously… discussed with @dagar, this pull request seeks to further couple the relationship between the PX4 flight controller and [Vertiq modules](https://www.vertiq.co/). At its core, this PR introduces the IQUART serial protocol into PX4, and in doing so provides the flight controller with the ability to control and configure connected Vertiq modules
IQUART and its Clients
-------------------------
The IQUART serial protocol is built around its ability to communicate with a series of Clients and Entries available on Vertiq modules. All [IQUART messages](https://iqmotion.readthedocs.io/en/latest/intro.html) specify a target module ID, type ID, and type sub-ID. Type IDs refer to unique identification values given to each different IQUART client. Sub-IDs refer to specific entries within the client. For example, the Serial Interface Client (type ID 16) provides one entry with sub-ID 0.
![Screenshot 2024-03-07 125725](https://github.com/PX4/PX4-Autopilot/assets/120586722/6da96606-215f-450e-a10f-104fb8414fbd)
A key portion of this PR is the inclusion of [Vertiq’s C++ library](https://github.com/iq-motion-control/iq-module-communication-cpp) as a git submodule. The library provides a C++ representation of all possible Veritq clients as well as functions for packaging proper IQUART messages.
What We’ve Added to PX4
==================
Basic User Interface
------------------------
The following examples are performed using a Pixhawk 6c using the Generic Quadcopter airframe. These serve to help in understanding the structure of the backend Vertiq support.
Boardconfig Options
****************************
![Screenshot 2024-03-07 143926](https://github.com/PX4/PX4-Autopilot/assets/120586722/b16453d5-8f19-418b-8552-178ca443c01b)
![Screenshot 2024-03-07 143942](https://github.com/PX4/PX4-Autopilot/assets/120586722/c8ec0d1c-0531-4793-a254-18d5317f0b59)
![Screenshot 2024-03-07 143954](https://github.com/PX4/PX4-Autopilot/assets/120586722/ed5900ee-1796-466b-97e8-3191d7d198b6)
- Vertiq IO
Provides access to basic Vertiq module configuration through PX4 parameters. This configuration alone is not enough for flight through the IQUART protocol, but could be helpful in configuration where other protocols, such as DroneCAN, are being used to send throttle commands.
- Include IFCI Configuration Parameters
Provides access to parameters specific to the IQUART Flight Controller Interface. Enabling this configuration allows users to control a vehicle and receive telemetry from Vertiq modules through the serial port configured to vertiq_io.
- Include Pulsing Module Configuration Parameters
Provides access to specialized parameters available only for “pulsing modules.” These are modules equipped with specialized Vertiq firmware and our [Vertiq UP12 propeller](https://www.vertiq.co/up12).
Configuration with QGroundControl
*******************************************************
At the moment, the easiest way for users to interact with and configure our modules is through Vertiq’s [IQ Control Center software](https://github.com/iq-motion-control/iq-control-center). As you can imagine, having to unplug serial connections from PX4 and reconnect them to the Control Center is a laborious process. While users could add an extra serial connection to use serial passthrough, this is not always possible. Therefore, by providing module configuration functionality directly to the flight controller, we make our users’ lives much easier.
![Screenshot 2024-03-07 145720](https://github.com/PX4/PX4-Autopilot/assets/120586722/b1f1c739-0dbc-4090-968b-1848dced63c3)
After selecting a serial port
![Screenshot 2024-03-07 145812](https://github.com/PX4/PX4-Autopilot/assets/120586722/a75c649e-688a-449c-8206-7afafb1b0783)
When the matching baud rate is set, we see the module with the matching Module ID to TARGET_MODULE_ID’s parameters appear. With this configuration, those parameters are MAX_VELOCITY, MAX_VOLTS, CONTROL_MODE, THROTTLE_CVI, VERTIQ_FC_DIR, and VERTIQ_MOTOR_DIR.
The parameters that change based on the value of TARGET_MODULE_ID are those managed by the Vertiq Configuration Handler class.
Target Module ID 0
![Screenshot 2024-03-07 151858](https://github.com/PX4/PX4-Autopilot/assets/120586722/616a982e-da7a-4301-9d8e-e30033e35894)
Target Module ID 1
![Screenshot 2024-03-07 152106](https://github.com/PX4/PX4-Autopilot/assets/120586722/949deb91-e9fe-4f7a-b568-07189fd3abf8)
I did not change any values besides the TARGET_MODULE_ID, and you can see that the other Vertiq parameters were updated with values gotten from the module with ID 1.
Code Structure
------------------------
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/cfacd017-166d-4fc3-99da-ac517d287250)
Class Descriptions
*************************
Vertiq IO
- Responsible for spawning our task, and contains our run()
- Contains our updateOutputs function for motor control
- Contains 3 Vertiq Clients used as part of motor control: a Propeller Motor Control Client, an Arming Handler Client, and an IFCI - Client all set to broadcast to all connected modules
- Creates and updates all other objects used in the module
Vertiq Serial Interface
- Responsible for configuring the selected hardware serial port
- Responsible for reading data from the serial peripheral and passes it to the active Vertiq clients
- Responsible for taking data written by the active Vertiq clients, and writing out data to the serial peripheral
Vertiq Client Manager
- Can be given new Vertiq clients of any type to manage by any external object
- Manages a list of clients up to a predefined maximum amount
- Handles client communication by periodically telling the serial interface to transmit queued messages and to have each client process received data
Vertiq Configuration Handler
- Responsible for maintaining any Vertiq client objects which are created and destroyed as TARGET_MODULE_ID changes
- Responsible for managing a list of EntryWrapper objects
EntryWrappers are used to link together a PX4 parameter and a Vertiq Client’s Entry, and are covered in more detail later
Vertiq Telemetry Manager
- Responsible for maintaining an IQUART Flight Controller Interface client which gets created and destroyed as the Module ID for telemetry changes
- Responsible for generating the correct Module ID for the next module whose telemetry we want
- Responsible for publishing to the esc_status uORB topic the data received from modules
About EntryWrapper Objects
**************************************
As mentioned above, an EntryWrapper is an object meant to connect a PX4 parameter with a Vertiq Client Entry. The goal is to ensure that when an EntryWrapper’s PX4 parameter changes, that the same change is reflected on the connected motor with the module ID TARGET_MODULE_ID.
The process for updating EntryWrappers is described by the following diagrams. The top describes what happens at a higher level when any Vertiq parameter is changed, and the bottom describes the decisions made by the EntryWrapper itself during its update.
High Level
[<img src="https://github.com/PX4/PX4-Autopilot/assets/120586722/d5fb4044-4cfc-4c3d-9603-46bef27939ea" width="300"/>](https://github.com/PX4/PX4-Autopilot/assets/120586722/d5fb4044-4cfc-4c3d-9603-46bef27939ea)
Entry Wrapper
[<img src="https://github.com/PX4/PX4-Autopilot/assets/120586722/140ea73c-4ec3-4249-80bc-6db74f6bf64e" width ="300"/>](https://github.com/PX4/PX4-Autopilot/assets/120586722/140ea73c-4ec3-4249-80bc-6db74f6bf64e)
Parameters
-------------------
Different PX4 parameters become available depending on the build configuration set at the kconfig level. Any configuration listed also includes all parameters available in the configuration above it.
Vertiq IO Enabled
************************
- VERTIQ_IO_CFG
The serial port mapped to our module
- VERTIQ_BAUD
The baud rate to use on the serial port we open and manage
- TARGET_MODULE_ID
This is the module ID of the module that you would like to communicate with at the parameter level. All clients in the Vertiq Configuration Handler will be deleted and recreated with this module ID in their reinitialization
- TRIGGER_READ
A boolean parameter that allows you to refresh responses from the module with module ID TARGET_MODULE_ID
- CONTROL_MODE
This parameter is part of an EntryWrapper. This means that it acts as both a PX4 parameter and a Vertiq Client Entry. Specifically, this parameter interacts with the mode entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- MAX_VELOCITY
This parameter is part of an EntryWrapper that interacts with the velocity_max entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- MAX_VOLTS
This parameter is part of an EntryWrapper that interacts with the volts_max entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- VERTIQ_MOTOR_DIR
This parameter is part of an EntryWrapper that interacts with the sign entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
- VERTIQ_FC_DIR
This parameter is part of an EntryWrapper that interacts with the flip_negative entry in the [ESC Propeller Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#epip-message-table)
IFCI Configuration Enabled
***********************************
- VERTIQ_NUM_CVS
The number of Control Values (discussed more [here](https://iqmotion.readthedocs.io/en/latest/manual/manual_ifci_control.html#iquart-flight-controller-interface)) that will be transmitted during each updateOutputs call
- DISARM_TRIGGER
This specifies the behavior to be used when the mixer disarms. The choices are enumerated as the following
- USER_MIXER_VALUE
Specifies that the output control values should match the value set as the mixer’s disarmed value for each ESC channel
- TRIGGER_MOTOR_DISARM
Sends an explicit disarm command to all connected motors
- COAST_MOTOR
Sends an explicit coast command to all connected motors. When coasted, Vertiq ESCs stop sending control voltages allowing the motor to spin freely
- SEND_PREDEFINED_VELOCITY
Sends an explicit [control velocity](https://iqmotion.readthedocs.io/en/latest/manual/manual_velocity_control_mechanisms.html#control-velocity) command to all connected motors
- ARMING_BEHAVE
This specifies the behavior to be used when the mixer arms. The choices are enumerated as the following
- FORCE_ARMING
Sends an explicit arm command to all connected motors
- USE_MOTOR_ARMING
Uses each of the connected modules’ [unique arming configurations](https://iqmotion.readthedocs.io/en/latest/manual/manual_advanced_arming.html) to decide its own behavior based on the output throttle
- THROTTLE_CVI
This parameter is part of an EntryWrapper that interacts with the throttle_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- TELEM_IDS_1
This is a 32 bit bitmask with values 0-31 that allows users to easily select the module IDs from which they would like to receive telemetry. Combines with TELEM_IDS_2 to create a 64-bit bitmask of all possible Vertiq module IDs
- TELEM_IDS_2
This is a 32 bit bitmask with values 32-62 that allows users to easily select the module IDs from which they would like to receive telemetry. Combines with TELEM_IDS_1 to create a 64-bit bitmask of all possible Vertiq module IDs
Pulsing Configuration Enabled
****************************************
- PULSE_VOLT_MODE
This parameter is part of an EntryWrapper that interacts with the pulsing_voltage_mode entry in the [Pulsing Rectangular Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#prip-message-table)
- PULSE_VOLT_LIMIT
This parameter is part of an EntryWrapper that interacts with the pulsing_voltage_limit entry in the [Pulsing Rectangular Input Parser Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#prip-message-table)
- X_CVI
This parameter is part of an EntryWrapper that interacts with the x_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- Y_CVI
This parameter is part of an EntryWrapper that interacts with the y_cvi entry in the [IQUART Flight Controller Interface Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#ifci-message-table)
- ZERO_ANGLE
This parameter is part of an EntryWrapper that interacts with the zero_angle entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
- VELOCITY_CUTOFF
This parameter is part of an EntryWrapper that interacts with the velocity_cutoff entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
- TORQUE_OFF_ANGLE
This parameter is part of an EntryWrapper that interacts with the propeller_torque_offset_angle entry in the [Voltage Superposition Client](https://iqmotion.readthedocs.io/en/latest/modules/vertiq_2306_2200.html#id350)
Telemetry
-----------------
With IFCI enabled, telemetry is requested from the Module IDs specified in the TELEM_IDS_1/2 in a round robin fashion. The data returned are described in the following struct:
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/9d34648a-88a5-461c-801a-b763c81d0ce6)
Using the response, we fill in the esc_status publication’s esc_rpm, esc_voltage, esc_current, esc_power, and esc_temperature. The esc_armed_flags and esc_online_flags are set high for each ESC after the first successfully received telemetry response from each expected motor.
Non-Pulsing Flight Configuration Example with a Pixhawk 6c
==========================================
In this example, our connected modules are set to a 921600 baud with module IDs 0, 26, 42, and 62 (configured using the [IQ Control Center software](https://github.com/iq-motion-control/iq-control-center))
1. Run boardconfig in order to turn on Vertiq IO and IFCI Configuration
2. Build and flash the firmware
3. Select Generic Quadcopter airframe and run sensor calibration
4. Set the VERTIQ_IO_CFG to TELEM 2 for this example. Save and reboot
5. Set the VERTIQ_BAUD parameter to 921600, and reboot
6. Connect the 4 modules to the Pixhawk in this configuration
![image](https://github.com/PX4/PX4-Autopilot/assets/120586722/32cd55ea-3438-4e0c-8979-b6a9e3c0f430)
7. Set VERTIQ_NUM_CVS to 4, TELEM_IDS_1 check 0 and 26, TELEM_IDS_2 check 42 and 62, and reboot
In this case, we have 4 modules connected, each of which supports only the Throttle Control Value. In order for each of the modules to receive their own unique throttle command, we must send 4 Control Values (CVs)
8. Set TARGET_MODULE_ID to 0, and set THROTTLE_CVI to 0, CONTROL_MODE to Voltage, and MAX_VOLTS to 12. Do the same to all MODULE_IDS where each CVI is one greater than the next (TARGET_MODULE_ID 26 should have THROTTLE_CVI 1)
9. Use the Identify & Assign Motors tool to configure the ESCs correctly for their position
10. Ensure that each VERTIQ_MOTOR_DIR is correct for the module’s vehicle position. If not, change it to either 2D Clockwise or 2D Counter Clockwise to make it correct
11. For this example, I want to use Send Explicit Disarm as DISARM_TRIGGER so that we can hear the disarming sound
12. Configure your Radio, and you are ready to fly
Attached to this PR as well as below are a video of a hover flight as well as the log from it using the configuration described here.
[vertiq_io_flight_sample.MOV](https://drive.google.com/file/d/1Bq7Sy9mv1MScE1xmjAtSksE275PnTUAN/view?usp=drive_link)
[Link to Log](https://drive.google.com/file/d/13eH0guxELt_3NYcMXRza0fIbWoi-up3p/view?usp=sharing)
@Claudio-Chies from you testing was this SF45 fix stable enough to merge?
I have a few PRs for QGC I would like to bring to attention to so I can get them pushed along
Custom Windows Icons
mavlink:master
← gillamkid:gillamkid/windows-custom-icons
opened 02:50PM - 11 Sep 24 UTC
# Description
This PR does 2 things
1. Fixes custom-example (currently broken … if you try to run it out of the box)
2. Make QGC Windows icons customizable
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## fix 1 - Fix custom-build (update using updateqrc.py)
updateqrc.py should be run from the custom-example folder everytime qgcresources.qrc in the root directory gets changed. This was missed the last time qgcresources.qrc was updated so the custom-example failed to build out of the box
## fix 2 - Make QGC Windows icons customizable
The QGC icon inside the app was already replaceable via the custom folder, however the QGC icon that was displayed on the Windows app bar, Windows installer, and windows shortcut icons was not able to be customized from the custom folder. This PR adds that capability.
installer screen shots before/after (both screenshots are installing a custom variant of QGC, ie. the custom-example variant)
![before-install-window](https://github.com/user-attachments/assets/a8060167-3c3f-4970-b3d6-6b9642cb5bae)
![after-install-window](https://github.com/user-attachments/assets/50501c02-82e8-4602-8ee1-4989ae707da3)
shortcut icons before/after (all shortcuts shown are goint to a custom variant of QGC, ie. the custom-example variant)
![before-shortcut-icon](https://github.com/user-attachments/assets/13159d2a-e72a-42f6-b6ce-65a0d26d2e64)
![after-shortcut-icon](https://github.com/user-attachments/assets/662492fe-3f3b-41c8-9018-6914bed1ebaf)
Custom Linux Icons
mavlink:master
← gillamkid:gillamkid/custom-qgc-linux-icon
opened 06:39PM - 07 Sep 24 UTC
# Description
QGC already allows in-app QGC icons to be replaced with a custom … variant in the custom folder. This PR makes so desktop app icons shown in Linux are also the custom variant.
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Before/After pics
![before-linux-app-icon](https://github.com/user-attachments/assets/10c8b9e1-1f07-4556-b4bc-0ce3223a4807)
![after-linux-app-icon](https://github.com/user-attachments/assets/f3dbe0b9-ac47-4707-aca9-1d5ea5b6deb8)
Sizing Fixes (buttons, popups, etc)
mavlink:master
← gillamkid:gillamkid/sizing-fixes
opened 01:20PM - 07 Sep 24 UTC
# Description
Fixes a couple sizing bugs and makes button sizing/spacing look b… etter
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## fix 1 - exit confirm popup
![before-exit](https://github.com/user-attachments/assets/8a775ca5-a335-4887-9f79-f96dfcb0f7d2)
![after-exit](https://github.com/user-attachments/assets/8dcfe0fe-bad0-48ba-aa36-68788a996571)
## fix 2 - scaling buttons (also notice new button padding)
![before-scaling](https://github.com/user-attachments/assets/302f1cf7-d9f0-4ad3-811f-63761a84a95a)
![after-scaling](https://github.com/user-attachments/assets/d78ffbde-c24f-4225-bf01-4e28c768951a)
## fix 3 - indoor/outdoor brand image button alignment when no path is selected
![before-brand](https://github.com/user-attachments/assets/eb12ba4c-6e0e-44da-abd9-15bb091c1f3a)
![after-brand](https://github.com/user-attachments/assets/b9fab7a4-1ab8-4151-8e11-b1b1e690b807)
## inspiration for new button padding/sizes - google material design
i gave buttons larger left/right padding and minimum sizes in accordance with the Google material design 2 design doc
![Screenshot from 2024-09-06 16-12-02](https://github.com/user-attachments/assets/02ae240f-28c1-4f28-9436-3af79f874d47)
Custom Brand Image Fixes
mavlink:master
← gillamkid:gillamkid/custom-brand-image
opened 06:54PM - 06 Sep 24 UTC
Description
-----------
this PR does 2 things
1. fixes a couple bugs relating… to custom brand images
2. changes brand image used in custom-example to something more appropriate
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Brand Image Bug 1
![before-bug-dark](https://github.com/user-attachments/assets/4687c556-2a2e-45a1-bd7b-51d0947983dd)
## Brand Image Bug 2
![before-outdoor-bug](https://github.com/user-attachments/assets/c2cdd1df-d0b4-48fd-825b-484155f00869)
## Custom Brand Image before
![before-no-bug-indoor](https://github.com/user-attachments/assets/e0ca577e-eeb9-4575-b3d7-e379dbe57e39)
## Custom Brand Image After (indoor)
![after-dark](https://github.com/user-attachments/assets/a320c115-f24f-4e49-a278-2f803e673005)
## Custom Brand Image After (outdoor)
![after-outdoor](https://github.com/user-attachments/assets/7dd7058c-0a30-4e5f-b07c-49dca3c09ee7)
Fix QGC icon (bloated Q)
mavlink:master
← gillamkid:gillamkid/fix-bloated-icon
opened 03:46PM - 04 Sep 24 UTC
# Description
The QGC icon shown in the top left corner of the app did not matc… h the typical QGC icon seen everywhere else (icon of QGC shortcut made after an install, icon branding on QGC website, etc). I replaced the instances of the extra-bloated Q with the more common QGC icon
## Sponsor
This contribution was sponsored by [Firestorm](https://www.launchfirestorm.com/)
![654d4f9476ff2a38f37e9ab9_firestorm-homepage-share-img-2](https://github.com/user-attachments/assets/bc1a2c95-b33d-4a2d-af35-4d2d8651d0a2)
## Before/After (icon in app)
![before-icon-in-app](https://github.com/user-attachments/assets/5a7909da-6448-495c-b98a-fcb6c2750a8a)
![after-icon-in-app](https://github.com/user-attachments/assets/ffd4defb-40ef-46fb-8fcd-d9385df007a7)
## Before/After (icon in svg editor view to show outline change)
![before-qgc-icon](https://github.com/user-attachments/assets/dd96e551-b9d4-4754-b8f3-26c69199f5ba)
![after-qgc-icon](https://github.com/user-attachments/assets/bc954004-2d58-42f3-9d05-caac775c0ba8)