mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-06-10 00:30:05 +08:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c72cfe437e | |||
| 3ab7895af7 | |||
| 3c5574c051 | |||
| eb9a76cfaf | |||
| f545f2227d | |||
| 4e5c0fac7a | |||
| fa0618463d | |||
| f025bb42eb | |||
| 5dba9990b4 | |||
| aaace556cd | |||
| 36c3bfcde8 | |||
| 70e31870af | |||
| 45baeccb01 | |||
| 4917b17116 | |||
| c0633d89ff | |||
| f798d7ce16 | |||
| 35cbbc1967 | |||
| 8ff7255ba7 | |||
| 395236dc7f | |||
| 1ada559eff | |||
| c838206024 | |||
| 582a50030c | |||
| 2dd5c48a82 | |||
| 75b3e9f0d0 | |||
| b17da3caa0 |
@@ -0,0 +1,21 @@
|
||||
name: Build Gazebo Classic SITL
|
||||
description: Build PX4 firmware and Gazebo Classic plugins with ccache stats
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Build - PX4 Firmware (SITL)
|
||||
shell: bash
|
||||
run: make px4_sitl_default
|
||||
|
||||
- name: Cache - Stats after PX4 Firmware
|
||||
shell: bash
|
||||
run: ccache -s
|
||||
|
||||
- name: Build - Gazebo Classic Plugins
|
||||
shell: bash
|
||||
run: make px4_sitl_default sitl_gazebo-classic
|
||||
|
||||
- name: Cache - Stats after Gazebo Plugins
|
||||
shell: bash
|
||||
run: ccache -s
|
||||
@@ -0,0 +1,22 @@
|
||||
name: Save ccache
|
||||
description: Print ccache stats and save to cache
|
||||
|
||||
inputs:
|
||||
cache-primary-key:
|
||||
description: Primary cache key from setup-ccache output
|
||||
required: true
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Cache - Stats
|
||||
if: always()
|
||||
shell: bash
|
||||
run: ccache -s
|
||||
|
||||
- name: Cache - Save ccache
|
||||
if: always()
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ${{ inputs.cache-primary-key }}
|
||||
@@ -0,0 +1,56 @@
|
||||
name: Setup ccache
|
||||
description: Restore ccache from cache and configure ccache.conf
|
||||
|
||||
inputs:
|
||||
cache-key-prefix:
|
||||
description: Cache key prefix (e.g. ccache-sitl)
|
||||
required: true
|
||||
max-size:
|
||||
description: Max ccache size (e.g. 300M)
|
||||
required: false
|
||||
default: '300M'
|
||||
base-dir:
|
||||
description: ccache base_dir value
|
||||
required: false
|
||||
default: '${GITHUB_WORKSPACE}'
|
||||
install-ccache:
|
||||
description: Install ccache via apt before configuring
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
outputs:
|
||||
cache-primary-key:
|
||||
description: Primary cache key (pass to save-ccache)
|
||||
value: ${{ steps.restore.outputs.cache-primary-key }}
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Cache - Install ccache
|
||||
if: inputs.install-ccache == 'true'
|
||||
shell: bash
|
||||
run: apt-get update && apt-get install -y ccache
|
||||
|
||||
- name: Cache - Restore ccache
|
||||
id: restore
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ${{ inputs.cache-key-prefix }}-${{ github.ref_name }}-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ inputs.cache-key-prefix }}-${{ github.ref_name }}-
|
||||
${{ inputs.cache-key-prefix }}-${{ github.base_ref || 'main' }}-
|
||||
${{ inputs.cache-key-prefix }}-
|
||||
|
||||
- name: Cache - Configure ccache
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ~/.ccache
|
||||
echo "base_dir = ${{ inputs.base-dir }}" > ~/.ccache/ccache.conf
|
||||
echo "compression = true" >> ~/.ccache/ccache.conf
|
||||
echo "compression_level = 6" >> ~/.ccache/ccache.conf
|
||||
echo "max_size = ${{ inputs.max-size }}" >> ~/.ccache/ccache.conf
|
||||
echo "hash_dir = false" >> ~/.ccache/ccache.conf
|
||||
echo "compiler_check = content" >> ~/.ccache/ccache.conf
|
||||
ccache -s
|
||||
ccache -z
|
||||
@@ -89,7 +89,9 @@ jobs:
|
||||
. /opt/ros/galactic/setup.bash
|
||||
mkdir -p /opt/px4_ws/src
|
||||
cd /opt/px4_ws/src
|
||||
BRANCH="${GITHUB_HEAD_REF:-$GITHUB_REF_NAME}"
|
||||
# On a PR, target the branch we're merging into (main or release/X.Y).
|
||||
# On a direct push, fall back to the branch we're running on.
|
||||
BRANCH="${GITHUB_BASE_REF:-$GITHUB_REF_NAME}"
|
||||
REPO_URL="https://github.com/Auterion/px4-ros2-interface-lib.git"
|
||||
if git ls-remote --heads "$REPO_URL" "$BRANCH" | grep -q "$BRANCH"; then
|
||||
echo "Cloning px4-ros2-interface-lib with matching branch: $BRANCH"
|
||||
|
||||
+24
-2
@@ -173,13 +173,35 @@ set(config_module_list)
|
||||
set(config_kernel_list)
|
||||
|
||||
# Find Python
|
||||
find_package(PythonInterp 3)
|
||||
#
|
||||
# Force FindPython3 to prefer the interpreter on PATH (and any activated
|
||||
# virtualenv/conda/pyenv environment) so downstream tooling runs under
|
||||
# the same Python the developer invoked the build with. On Linux these
|
||||
# are already the CMake defaults; the settings exist to normalize
|
||||
# behavior on macOS and Windows:
|
||||
#
|
||||
# - FIND_FRAMEWORK=LAST prevents FindPython3 from preferring a macOS
|
||||
# Python.framework install (e.g. Homebrew's
|
||||
# /opt/homebrew/Frameworks/Python.framework/...) over a pyenv shim
|
||||
# or venv on PATH, which would otherwise pick an interpreter that
|
||||
# lacks PX4's Python deps (kconfiglib, empy, jinja2, etc.).
|
||||
# - FIND_REGISTRY=NEVER skips the Windows registry lookup for the
|
||||
# same reason.
|
||||
# - FIND_STRATEGY and FIND_VIRTUALENV are set explicitly to make the
|
||||
# intent obvious and insulate us from future default changes.
|
||||
set(Python3_FIND_STRATEGY LOCATION)
|
||||
set(Python3_FIND_VIRTUALENV FIRST)
|
||||
set(Python3_FIND_FRAMEWORK LAST)
|
||||
set(Python3_FIND_REGISTRY NEVER)
|
||||
find_package(Python3 COMPONENTS Interpreter)
|
||||
# We have a custom error message to tell users how to install python3.
|
||||
if(NOT PYTHONINTERP_FOUND)
|
||||
if(NOT Python3_Interpreter_FOUND)
|
||||
message(FATAL_ERROR "Python 3 not found. Please install Python 3:\n"
|
||||
" Ubuntu: sudo apt install python3 python3-dev python3-pip\n"
|
||||
" macOS: brew install python")
|
||||
endif()
|
||||
# Alias to the legacy variable so downstream CMakeLists keep working.
|
||||
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
|
||||
|
||||
option(PYTHON_COVERAGE "Python code coverage" OFF)
|
||||
if(PYTHON_COVERAGE)
|
||||
|
||||
+57
-20
@@ -2,45 +2,82 @@
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
Examples of behavior that contributes to a positive environment for our community include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall community
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Publishing others' private information, such as a physical or email address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at lorenz@px4.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at coc@dronecode.org. All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
|
||||
+13
-2
@@ -1,9 +1,11 @@
|
||||
Maintainers
|
||||
===========
|
||||
|
||||
See [the documentation on Maintainers](https://docs.px4.io/main/en/contribute/maintainers.html) to learn about the role of the maintainers and the process to become one.
|
||||
PX4 is maintained by a group of contributors trusted to steward the project. All maintainers listed below are members of the @PX4/dev-team, have write access, and participate in maintainer decisions. We recognize two types: **Code Owners**, responsible for specific components, and **Reviewers**, who help across the project without a fixed component.
|
||||
|
||||
**Active Maintainers**
|
||||
See [the documentation on Maintainers](https://docs.px4.io/main/en/contribute/maintainers) to learn about the role of the maintainers and the process to become one.
|
||||
|
||||
**Code Owners**
|
||||
|
||||
| Name | Sector | GitHub | Chat | email
|
||||
|-------------------------|--------|--------|------|----------------
|
||||
@@ -23,6 +25,15 @@ See [the documentation on Maintainers](https://docs.px4.io/main/en/contribute/ma
|
||||
| Jacob Dahl | Simulation | [@dakejahl](https://github.com/dakejahl) | dakejahl | <dahl.jakejacob@gmail.com>
|
||||
|
||||
|
||||
**Reviewers**
|
||||
|
||||
Reviewers help maintain PX4 across the project without ownership of a specific component.
|
||||
|
||||
| Name | GitHub | Chat | email
|
||||
|------|--------|------|----------------------
|
||||
| _No reviewers yet._ | | |
|
||||
|
||||
|
||||
**Documentation Maintainers**
|
||||
|
||||
| Name | GitHub | Chat | email
|
||||
|
||||
@@ -9,11 +9,16 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/PX4/PX4-Autopilot/releases"><img src="https://img.shields.io/github/release/PX4/PX4-Autopilot.svg" alt="Releases"></a>
|
||||
<a href="https://www.bestpractices.dev/projects/6520"><img src="https://www.bestpractices.dev/projects/6520/badge" alt="OpenSSF Best Practices"></a>
|
||||
<a href="https://github.com/PX4/PX4-Autopilot/releases"><img src="https://img.shields.io/github/release/PX4/PX4-Autopilot.svg" alt="Release"></a>
|
||||
<a href="https://zenodo.org/badge/latestdoi/22634/PX4/PX4-Autopilot"><img src="https://zenodo.org/badge/22634/PX4/PX4-Autopilot.svg" alt="DOI"></a>
|
||||
<a href="https://github.com/PX4/PX4-Autopilot/actions/workflows/build_all_targets.yml"><img src="https://github.com/PX4/PX4-Autopilot/actions/workflows/build_all_targets.yml/badge.svg?branch=main" alt="Build Targets"></a>
|
||||
<a href="https://discord.gg/dronecode"><img src="https://discordapp.com/api/guilds/1022170275984457759/widget.png?style=shield" alt="Discord"></a>
|
||||
<a href="https://discord.gg/dronecode"><img src="https://img.shields.io/discord/1022170275984457759?label=discord&logo=discord&logoColor=white&color=5865F2" alt="Discord"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.bestpractices.dev/projects/6520"><img src="https://www.bestpractices.dev/projects/6520/badge" alt="OpenSSF Best Practices"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/px4"><img src="https://insights.linuxfoundation.org/api/badge/health-score?project=px4" alt="LFX Health Score"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/px4"><img src="https://insights.linuxfoundation.org/api/badge/contributors?project=px4" alt="LFX Contributors"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/px4"><img src="https://insights.linuxfoundation.org/api/badge/active-contributors?project=px4" alt="LFX Active Contributors"></a>
|
||||
</p>
|
||||
|
||||
---
|
||||
@@ -99,6 +104,22 @@ make px4_sitl
|
||||
|
||||
We welcome contributions of all kinds — bug reports, documentation, new features, and code reviews. Please read the [Contribution Guide](https://docs.px4.io/main/en/contribute/) to get started.
|
||||
|
||||
## Citation
|
||||
|
||||
If you use PX4 in academic work, please cite it. BibTeX:
|
||||
|
||||
```bibtex
|
||||
@software{px4_autopilot,
|
||||
author = {Meier, Lorenz and {The PX4 Contributors}},
|
||||
title = {{PX4 Autopilot}},
|
||||
publisher = {Zenodo},
|
||||
doi = {10.5281/zenodo.595432},
|
||||
url = {https://px4.io}
|
||||
}
|
||||
```
|
||||
|
||||
The DOI above is a Zenodo concept DOI that always resolves to the latest release. For a version-pinned citation, see the [Zenodo record](https://doi.org/10.5281/zenodo.595432) or our [`CITATION.cff`](CITATION.cff).
|
||||
|
||||
## Governance
|
||||
|
||||
The PX4 Autopilot project is hosted by the [Dronecode Foundation](https://www.dronecode.org/), a [Linux Foundation](https://www.linuxfoundation.org/) Collaborative Project. Dronecode holds all PX4 trademarks and serves as the project's legal guardian, ensuring vendor-neutral stewardship — no single company owns the name or controls the roadmap. The source code is licensed under the [BSD 3-Clause](LICENSE) license, so you are free to use, modify, and distribute it in your own projects.
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
param set UAVCAN_ENABLE 0
|
||||
|
||||
param set-default CA_AIRFRAME 1
|
||||
param set-default CA_ROTOR_COUNT 1
|
||||
param set-default CA_ROTOR0_PX 0.3
|
||||
|
||||
@@ -38,7 +39,6 @@ param set-default SYS_HITL 2
|
||||
# - without real battery
|
||||
param set-default CBRK_SUPPLY_CHK 894281
|
||||
|
||||
param set SIH_T_MAX 6
|
||||
param set SIH_MASS 0.3
|
||||
param set SIH_IXX 0.00402
|
||||
param set SIH_IYY 0.0144
|
||||
@@ -48,3 +48,21 @@ param set SIH_KDV 0.2
|
||||
|
||||
param set SIH_VEHICLE_TYPE 1 # sih as fixed wing
|
||||
param set RWTO_TKOFF 1 # enable takeoff from runway (as opposed to launched)
|
||||
|
||||
# pusher propeller model with advance ratio, model from UIUC APC 8x6"
|
||||
param set SIH_F_T_MAX 6
|
||||
param set SIH_F_Q_MAX 0.03
|
||||
# if SIH_F_CT0 > 0, SIH_F_T_MAX and SIH_F_Q_MAX will be overridden
|
||||
param set SIH_F_CT0 0.131
|
||||
param set SIH_F_CT1 0.004
|
||||
param set SIH_F_CT2 -0.146
|
||||
param set SIH_F_CP0 0.0777
|
||||
param set SIH_F_CP1 0.0498
|
||||
param set SIH_F_CP2 -0.11
|
||||
param set SIH_F_DIA_INCH 8
|
||||
param set SIH_F_RPM_MAX 9000
|
||||
|
||||
param set-default FW_AIRSPD_MIN 7
|
||||
param set-default FW_AIRSPD_TRIM 10
|
||||
param set-default FW_AIRSPD_MAX 12
|
||||
param set-default FW_PSP_OFF 0.5
|
||||
|
||||
@@ -28,6 +28,7 @@ param set-default VT_FW_DIFTHR_EN 1
|
||||
param set-default VT_FW_DIFTHR_S_Y 0.3
|
||||
param set-default MPC_MAN_Y_MAX 60
|
||||
param set-default MC_PITCH_P 5
|
||||
param set-default FW_PSP_OFF 5
|
||||
|
||||
param set-default CA_AIRFRAME 4
|
||||
param set-default CA_ROTOR_COUNT 2
|
||||
@@ -56,7 +57,6 @@ param set-default HIL_ACT_REV 32
|
||||
param set-default MAV_TYPE 19
|
||||
|
||||
|
||||
|
||||
# set SYS_HITL to 2 to start the SIH and avoid sensors startup
|
||||
param set-default SYS_HITL 2
|
||||
|
||||
@@ -66,8 +66,9 @@ param set-default CBRK_SUPPLY_CHK 894281
|
||||
|
||||
param set-default SENS_DPRES_OFF 0.001
|
||||
|
||||
param set SIH_T_MAX 2.0
|
||||
param set SIH_Q_MAX 0.0165
|
||||
# tailsitter is equipped with two forward propellers
|
||||
param set SIH_F_T_MAX 2
|
||||
param set SIH_F_Q_MAX 0.0165
|
||||
param set SIH_MASS 0.2
|
||||
# IXX and IZZ are inverted from the thesis as the body frame is pitched by 90 deg
|
||||
param set SIH_IXX 0.00354
|
||||
@@ -77,6 +78,19 @@ param set SIH_IXZ 0
|
||||
param set SIH_KDV 0.2
|
||||
param set SIH_L_ROLL 0.145
|
||||
|
||||
# propeller diameter, rpm, and coeffs coming from the thesis
|
||||
# Modeling and control of a flying wing tailsitter unmanned aerial vehicle."
|
||||
# Chiappinelli, Romain, supervised by Nahon, Meyer, McGill University, Masters thesis, 2018.
|
||||
# if SIH_F_CT0 > 0, SIH_F_T_MAX and SIH_F_Q_MAX will be overridden
|
||||
param set SIH_F_CT0 0.1342
|
||||
param set SIH_F_CT1 -0.1196
|
||||
param set SIH_F_CT2 -0.1281
|
||||
param set SIH_F_CP0 0.0522
|
||||
param set SIH_F_CP1 -0.0146
|
||||
param set SIH_F_CP2 -0.0602
|
||||
param set SIH_F_DIA_INCH 5
|
||||
param set SIH_F_RPM_MAX 14000
|
||||
|
||||
# sih as tailsitter
|
||||
param set SIH_VEHICLE_TYPE 2
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ param set-default CA_SV_CS2_TYPE 4 # rudder
|
||||
param set-default FW_AIRSPD_MIN 7
|
||||
param set-default FW_AIRSPD_TRIM 10
|
||||
param set-default FW_AIRSPD_MAX 12
|
||||
param set-default VT_FWD_THRUST_EN 1
|
||||
|
||||
param set-default HIL_ACT_FUNC1 101
|
||||
param set-default HIL_ACT_FUNC2 102
|
||||
@@ -77,6 +78,7 @@ param set-default CBRK_SUPPLY_CHK 894281
|
||||
|
||||
param set-default SENS_DPRES_OFF 0.001
|
||||
|
||||
# quadrotor propellers
|
||||
param set SIH_T_MAX 2.0
|
||||
param set SIH_Q_MAX 0.0165
|
||||
param set SIH_MASS 0.2
|
||||
@@ -88,5 +90,18 @@ param set SIH_IXZ 0
|
||||
param set SIH_KDV 0.2
|
||||
param set SIH_L_ROLL 0.2
|
||||
|
||||
# pusher propeller model with advance ratio, model from UIUC APC 8x6"
|
||||
param set SIH_F_T_MAX 6
|
||||
param set SIH_F_Q_MAX 0.03
|
||||
# if SIH_F_CT0 > 0, SIH_F_T_MAX and SIH_F_Q_MAX will be overridden
|
||||
param set SIH_F_CT0 0.131
|
||||
param set SIH_F_CT1 0.004
|
||||
param set SIH_F_CT2 -0.146
|
||||
param set SIH_F_CP0 0.0777
|
||||
param set SIH_F_CP1 0.0498
|
||||
param set SIH_F_CP2 -0.11
|
||||
param set SIH_F_DIA_INCH 8
|
||||
param set SIH_F_RPM_MAX 9000
|
||||
|
||||
# sih as standard vtol
|
||||
param set SIH_VEHICLE_TYPE 3
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# @name SIH Hexacopter X
|
||||
#
|
||||
# @type Simulation
|
||||
# @class Copter
|
||||
#
|
||||
# @maintainer Romain Chiappinelli <romain.chiap@gmail.com>
|
||||
#
|
||||
# @board px4_fmu-v2 exclude
|
||||
#
|
||||
|
||||
. ${R}etc/init.d/rc.mc_defaults
|
||||
|
||||
param set UAVCAN_ENABLE 0
|
||||
|
||||
# set SYS_HITL to 2 to start the SIH and avoid sensors startup
|
||||
param set SYS_HITL 2
|
||||
|
||||
# disable some checks to allow to fly:
|
||||
# - without real battery
|
||||
param set-default CBRK_SUPPLY_CHK 894281
|
||||
|
||||
param set SIH_VEHICLE_TYPE 4
|
||||
|
||||
# Symmetric hexacopter X clockwise motor numbering
|
||||
param set-default CA_ROTOR_COUNT 6
|
||||
param set-default CA_ROTOR0_PX 0.866
|
||||
param set-default CA_ROTOR0_PY 0.5
|
||||
param set-default CA_ROTOR1_PX 0
|
||||
param set-default CA_ROTOR1_PY 1
|
||||
param set-default CA_ROTOR1_KM -0.05
|
||||
param set-default CA_ROTOR2_PX -0.866
|
||||
param set-default CA_ROTOR2_PY 0.5
|
||||
param set-default CA_ROTOR3_PX -0.866
|
||||
param set-default CA_ROTOR3_PY -0.5
|
||||
param set-default CA_ROTOR3_KM -0.05
|
||||
param set-default CA_ROTOR4_PX 0
|
||||
param set-default CA_ROTOR4_PY -1
|
||||
param set-default CA_ROTOR5_PX 0.866
|
||||
param set-default CA_ROTOR5_PY -0.5
|
||||
param set-default CA_ROTOR5_KM -0.05
|
||||
|
||||
param set-default HIL_ACT_FUNC1 101
|
||||
param set-default HIL_ACT_FUNC2 102
|
||||
param set-default HIL_ACT_FUNC3 103
|
||||
param set-default HIL_ACT_FUNC4 104
|
||||
param set-default HIL_ACT_FUNC5 105
|
||||
param set-default HIL_ACT_FUNC6 106
|
||||
@@ -49,6 +49,7 @@ if(CONFIG_MODULES_SIMULATION_PWM_OUT_SIM)
|
||||
1101_rc_plane_sih.hil
|
||||
1102_tailsitter_duo_sih.hil
|
||||
1103_standard_vtol_sih.hil
|
||||
1105_rc_hexa_x_sih.hil
|
||||
)
|
||||
if(CONFIG_MODULES_ROVER_ACKERMANN)
|
||||
px4_add_romfs_files(
|
||||
|
||||
Executable
+147
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Run clang-tidy incrementally on files changed in a PR.
|
||||
|
||||
Usage: run-clang-tidy-pr.py <base-ref>
|
||||
base-ref: e.g. origin/main
|
||||
|
||||
Computes the set of translation units (TUs) affected by the PR diff,
|
||||
then invokes Tools/run-clang-tidy.py on that subset only.
|
||||
Exits 0 silently when no C++ files were changed.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
EXTENSIONS_CPP = {'.cpp', '.c'}
|
||||
EXTENSIONS_HDR = {'.hpp', '.h'}
|
||||
# Manual exclusions from Makefile:508
|
||||
EXCLUDE_EXTRA = '|'.join([
|
||||
'src/systemcmds/tests',
|
||||
'src/examples',
|
||||
'src/modules/gyro_fft/CMSIS_5',
|
||||
'src/lib/drivers/smbus',
|
||||
'src/drivers/gpio',
|
||||
r'src/modules/commander/failsafe/emscripten',
|
||||
r'failsafe_test\.dir',
|
||||
])
|
||||
|
||||
|
||||
def repo_root():
|
||||
try:
|
||||
return subprocess.check_output(
|
||||
['git', 'rev-parse', '--show-toplevel'], text=True).strip()
|
||||
except subprocess.CalledProcessError:
|
||||
print('error: not inside a git repository', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def changed_files(base_ref, root):
|
||||
try:
|
||||
out = subprocess.check_output(
|
||||
['git', 'diff', '--name-only', f'{base_ref}...HEAD',
|
||||
'--', '*.cpp', '*.hpp', '*.h', '*.c'],
|
||||
text=True, cwd=root).strip()
|
||||
return out.splitlines() if out else []
|
||||
except subprocess.CalledProcessError:
|
||||
print(f'error: could not diff against "{base_ref}" — '
|
||||
'is the ref valid and fetched?', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def submodule_paths(root):
|
||||
# Returns [] if .gitmodules is absent or has no paths — both valid
|
||||
try:
|
||||
out = subprocess.check_output(
|
||||
['git', 'config', '--file', '.gitmodules',
|
||||
'--get-regexp', 'path'],
|
||||
text=True, cwd=root).strip()
|
||||
return [line.split()[1] for line in out.splitlines()]
|
||||
except subprocess.CalledProcessError:
|
||||
return []
|
||||
|
||||
|
||||
def build_exclude(root):
|
||||
submodules = '|'.join(submodule_paths(root))
|
||||
return f'{submodules}|{EXCLUDE_EXTRA}' if submodules else EXCLUDE_EXTRA
|
||||
|
||||
|
||||
def load_db(build_dir):
|
||||
db_path = os.path.join(build_dir, 'compile_commands.json')
|
||||
if not os.path.isfile(db_path):
|
||||
print(f'error: {db_path} not found', file=sys.stderr)
|
||||
print('Run "make px4_sitl_default-clang" first to generate '
|
||||
'the compilation database', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
try:
|
||||
with open(db_path) as f:
|
||||
return json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f'error: compile_commands.json is malformed: {e}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def find_tus(changed, db, root):
|
||||
db_files = {e['file'] for e in db}
|
||||
result = set()
|
||||
for f in changed:
|
||||
abs_path = os.path.join(root, f)
|
||||
ext = os.path.splitext(f)[1]
|
||||
if ext in EXTENSIONS_CPP:
|
||||
if abs_path in db_files:
|
||||
result.add(abs_path)
|
||||
elif ext in EXTENSIONS_HDR:
|
||||
hdr = os.path.basename(f)
|
||||
for e in db:
|
||||
try:
|
||||
if hdr in open(e['file']).read():
|
||||
result.add(e['file'])
|
||||
except OSError:
|
||||
pass # file deleted in PR — skip
|
||||
return sorted(result)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__,
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
parser.add_argument('base_ref',
|
||||
help='Git ref to diff against, e.g. origin/main')
|
||||
args = parser.parse_args()
|
||||
|
||||
root = repo_root()
|
||||
build_dir = os.path.join(root, 'build', 'px4_sitl_default-clang')
|
||||
|
||||
run_tidy = os.path.join(root, 'Tools', 'run-clang-tidy.py')
|
||||
if not os.path.isfile(run_tidy):
|
||||
print(f'error: {run_tidy} not found', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
changed = changed_files(args.base_ref, root)
|
||||
if not changed:
|
||||
print('No C++ files changed — skipping clang-tidy')
|
||||
sys.exit(0)
|
||||
|
||||
db = load_db(build_dir)
|
||||
tus = find_tus(changed, db, root)
|
||||
|
||||
if not tus:
|
||||
print('No matching TUs in compile_commands.json — skipping clang-tidy')
|
||||
sys.exit(0)
|
||||
|
||||
print(f'Running clang-tidy on {len(tus)} translation unit(s)')
|
||||
|
||||
result = subprocess.run(
|
||||
[sys.executable, run_tidy,
|
||||
'-header-filter=.*\\.hpp',
|
||||
'-j0',
|
||||
f'-exclude={build_exclude(root)}',
|
||||
'-p', build_dir] + tus
|
||||
)
|
||||
sys.exit(result.returncode)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -13,6 +13,7 @@ CONFIG_MODULES_NAVIGATOR=n
|
||||
CONFIG_MODULES_UXRCE_DDS_CLIENT=n
|
||||
CONFIG_SYSTEMCMDS_ACTUATOR_TEST=n
|
||||
CONFIG_SYSTEMCMDS_BSONDUMP=n
|
||||
CONFIG_SYSTEMCMDS_I2CDETECT=y
|
||||
CONFIG_SYSTEMCMDS_PERF=n
|
||||
CONFIG_SYSTEMCMDS_TOPIC_LISTENER=n
|
||||
CONFIG_SYSTEMCMDS_VER=n
|
||||
|
||||
@@ -287,8 +287,8 @@
|
||||
|
||||
/* AUX */
|
||||
|
||||
#define GPIO_LPUART4_RX (GPIO_LPUART4_RX_3 | LPUART_IOMUX) /* GPIO_B1_01 */
|
||||
#define GPIO_LPUART4_TX (GPIO_LPUART4_TX_3 | LPUART_IOMUX) /* GPIO_B1_00 */
|
||||
#define GPIO_LPUART4_RX (GPIO_LPUART4_RX_1 | LPUART_IOMUX) /* GPIO_B1_01 */
|
||||
#define GPIO_LPUART4_TX (GPIO_LPUART4_TX_1 | LPUART_IOMUX) /* GPIO_B1_00 */
|
||||
|
||||
/* GPS 1 */
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 203 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 270 KiB |
+1
-1
@@ -323,6 +323,7 @@
|
||||
- [RFD900 (SiK) Telemetry Radio](telemetry/rfd900_telemetry.md)
|
||||
- [ThunderFly TFSIK01 Telemetry Radio](telemetry/tfsik_telemetry.md)
|
||||
- [HolyBro (SIK) Telemetry Radio](telemetry/holybro_sik_radio.md)
|
||||
- [HolyBro SiK Long Range Telemetry Radio](telemetry/holybro_sik_longrange.md)
|
||||
- [Telemetry Wifi](telemetry/telemetry_wifi.md)
|
||||
- [ESP8266 WiFi Module](telemetry/esp8266_wifi_module.md)
|
||||
- [ESP32 WiFi Module](telemetry/esp32_wifi_module.md)
|
||||
@@ -468,7 +469,6 @@
|
||||
- [Gazebo Models Repository](sim_gazebo_gz/gazebo_models.md)
|
||||
- [Multi-Vehicle Sim](sim_gazebo_gz/multi_vehicle_simulation.md)
|
||||
- [SIH Simulation](sim_sih/index.md)
|
||||
- [Hawkeye Visualizer](sim_hawkeye/index.md)
|
||||
- [Gazebo Classic Simulation](sim_gazebo_classic/index.md)
|
||||
- [Vehicles](sim_gazebo_classic/vehicles.md)
|
||||
- [Worlds](sim_gazebo_classic/worlds.md)
|
||||
|
||||
@@ -127,7 +127,7 @@ Configure the emitter type of the vehicle.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------- | -------- | -------- | --------- | ------- | ---- |
|
||||
| ✓ | 0 | 15 | | 14 | |
|
||||
| ✓ | 0 | 19 | | 14 | |
|
||||
|
||||
### ADSB_GPS_OFF_LAT (`INT32`) {#ADSB_GPS_OFF_LAT}
|
||||
|
||||
@@ -18498,7 +18498,7 @@ parameters.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0 | 3 | | 0 | |
|
||||
| | 0 | 4 | | 0 | |
|
||||
|
||||
### COM_ARMABLE (`INT32`) {#COM_ARMABLE}
|
||||
|
||||
@@ -23916,7 +23916,7 @@ Mode 6 is intended for use with a ground control station (not necessarily an RTK
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------- | -------- | -------- | --------- | ------- | ---- |
|
||||
| ✓ | 0 | 1 | | 0 | |
|
||||
| ✓ | 0 | 6 | | 0 | |
|
||||
|
||||
### GPS_UBX_PPK (`INT32`) {#GPS_UBX_PPK}
|
||||
|
||||
@@ -28571,7 +28571,7 @@ MAVLink airframe type.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0 | 22 | | 0 | |
|
||||
| | 0 | 23 | | 0 | |
|
||||
|
||||
### MAV_USEHILGPS (`INT32`) {#MAV_USEHILGPS}
|
||||
|
||||
@@ -28828,7 +28828,7 @@ Heading behavior in autonomous modes.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0 | 4 | | 0 | |
|
||||
| | 0 | 5 | | 0 | |
|
||||
|
||||
### NAV_ACC_RAD (`FLOAT`) {#NAV_ACC_RAD}
|
||||
|
||||
@@ -37782,7 +37782,7 @@ TeraRanger Rangefinder (i2c).
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------- | -------- | -------- | --------- | ------- | ---- |
|
||||
| ✓ | 0 | 3 | | 0 | |
|
||||
| ✓ | 0 | 5 | | 0 | |
|
||||
|
||||
### SENS_EN_VL53L0X (`INT32`) {#SENS_EN_VL53L0X}
|
||||
|
||||
@@ -40004,6 +40004,104 @@ Absolute value superior to 10000 will disable distance sensor
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | | | | -1.0 | m |
|
||||
|
||||
### SIH_F_CP0 (`FLOAT`) {#SIH_F_CP0}
|
||||
|
||||
Forward thruster static power coefficient.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | | 0.0 | |
|
||||
|
||||
### SIH_F_CP1 (`FLOAT`) {#SIH_F_CP1}
|
||||
|
||||
Forward thruster power coefficient 1.
|
||||
|
||||
CP(J) = CP0 + CP1*J + CP2*J^2
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | | | | 0.0 | |
|
||||
|
||||
### SIH_F_CP2 (`FLOAT`) {#SIH_F_CP2}
|
||||
|
||||
Forward thruster power coefficient 2.
|
||||
|
||||
CP(J) = CP0 + CP1*J + CP2*J^2
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | | 0.0 | | 0.0 | |
|
||||
|
||||
### SIH_F_CT0 (`FLOAT`) {#SIH_F_CT0}
|
||||
|
||||
Forward thruster static thrust coefficient.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | | 0.0 | |
|
||||
|
||||
### SIH_F_CT1 (`FLOAT`) {#SIH_F_CT1}
|
||||
|
||||
Forward thruster thrust coefficient 1.
|
||||
|
||||
CT(J) = CT0 + CT1*J + CT2*J^2
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | | | | 0.0 | |
|
||||
|
||||
### SIH_F_CT2 (`FLOAT`) {#SIH_F_CT2}
|
||||
|
||||
Forward thruster thrust coefficient 2.
|
||||
|
||||
CT(J) = CT0 + CT1*J + CT2*J^2
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | | 0.0 | | 0.0 | |
|
||||
|
||||
### SIH_F_DIA_INCH (`FLOAT`) {#SIH_F_DIA_INCH}
|
||||
|
||||
Forward thruster propeller diameter in inches.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.1 | | | 0.1 | |
|
||||
|
||||
### SIH_F_Q_MAX (`FLOAT`) {#SIH_F_Q_MAX}
|
||||
|
||||
Forward thruster max torque (Nm).
|
||||
|
||||
This is used for the Fixed-Wing, Tailsitter, or pusher of the Standard VTOL
|
||||
if SIH_F_CP0 <= 0.
|
||||
If SIH_F_CP0 > 0, propeller model with advance ratio J is used
|
||||
and this parameter value is overridden at simulation startup.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | | 0.0165 | Nm |
|
||||
|
||||
### SIH_F_RPM_MAX (`FLOAT`) {#SIH_F_RPM_MAX}
|
||||
|
||||
Forward thruster max RPM.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.1 | | | 6000.0 | |
|
||||
|
||||
### SIH_F_T_MAX (`FLOAT`) {#SIH_F_T_MAX}
|
||||
|
||||
Forward thruster max thrust (N).
|
||||
|
||||
This is used for the Fixed-Wing, Tailsitter, or pusher of the Standard VTOL
|
||||
if SIH_F_CT0 <= 0.
|
||||
If SIH_F_CT0 > 0, propeller model with advance ratio J is used
|
||||
and this parameter value is overridden at simulation startup.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | | 2.0 | N |
|
||||
|
||||
### SIH_IXX (`FLOAT`) {#SIH_IXX}
|
||||
|
||||
Vehicle inertia about X axis.
|
||||
@@ -40178,13 +40276,15 @@ This value can be measured by weighting the quad on a scale.
|
||||
|
||||
### SIH_Q_MAX (`FLOAT`) {#SIH_Q_MAX}
|
||||
|
||||
Max propeller torque.
|
||||
Max multicopter propeller torque.
|
||||
|
||||
This is the maximum torque delivered by one propeller
|
||||
when the motor is running at full speed.
|
||||
|
||||
This value is usually about few percent of the maximum thrust force.
|
||||
|
||||
Refer to SIH_F_Q_MAX for the propeller torque for FW, Tailsitter, and VTOL pusher.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | 0.05 | 0.1 | Nm |
|
||||
@@ -40201,13 +40301,15 @@ Gaussian noise added to simulated ranging beacon measurements. Set to 0 to disab
|
||||
|
||||
### SIH_T_MAX (`FLOAT`) {#SIH_T_MAX}
|
||||
|
||||
Max propeller thrust force.
|
||||
Max multicopter propeller thrust force.
|
||||
|
||||
This is the maximum force delivered by one propeller
|
||||
when the motor is running at full speed.
|
||||
|
||||
This value is usually about 5 times the mass of the quadrotor.
|
||||
|
||||
Refer to SIH_F_T_MAX for the thrust for FW, Tailsitter, and VTOL pusher.
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||
| | 0.0 | | 0.5 | 5.0 | N |
|
||||
@@ -43972,7 +44074,7 @@ Selects what type of mode is enabled, if any
|
||||
|
||||
| Reboot | minValue | maxValue | increment | default | unit |
|
||||
| ------- | -------- | -------- | --------- | ------- | ---- |
|
||||
| ✓ | 0 | 2 | | 0 | |
|
||||
| ✓ | 0 | 3 | | 0 | |
|
||||
|
||||
### VOXL_ESC_PUB_BST (`INT32`) {#VOXL_ESC_PUB_BST}
|
||||
|
||||
|
||||
@@ -457,6 +457,10 @@ div.frame_variant td, div.frame_variant th {
|
||||
<td>SIH Quadcopter X</td>
|
||||
<td>Maintainer: Romain Chiappinelli <romain.chiap@gmail.com><p><code>SYS_AUTOSTART</code> = 1100</p></td>
|
||||
</tr>
|
||||
<tr id="copter_simulation_sih_hexacopter_x">
|
||||
<td>SIH Hexacopter X</td>
|
||||
<td>Maintainer: Romain Chiappinelli <romain.chiap@gmail.com><p><code>SYS_AUTOSTART</code> = 1105</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -7,7 +7,7 @@ const { site } = useData();
|
||||
|
||||
<div v-if="site.title !== 'PX4 Guide (main)'">
|
||||
<div class="custom-block danger">
|
||||
<p class="custom-block-title">This page may be out of date. <a href="https://docs.px4.io/main/en/contribute/dev_call">See the latest version</a>.</p>
|
||||
<p class="custom-block-title">This page may be out of date. <a href="/en/contribute/dev_call.md">See the latest version</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,8 +15,8 @@ The PX4 dev team and community come together to discuss any topic of interest to
|
||||
|
||||
## Who should attend?
|
||||
|
||||
- Core project maintainers
|
||||
- Component maintainers
|
||||
- Code Owners
|
||||
- Reviewers
|
||||
- Test team lead
|
||||
- Dronecode members
|
||||
- Community members (you!)
|
||||
|
||||
@@ -20,7 +20,7 @@ We pledge to adhere to the [PX4 code of conduct](https://github.com/PX4/PX4-Auto
|
||||
This section contains information about how you can meet with the community and contribute to PX4:
|
||||
|
||||
- [Dev Call](../contribute/dev_call.md) - Discuss architecture, pull requests, impacting issues with the dev team
|
||||
- [Maintainers](./maintainers.md) - Maintainers of PX4 Subsystems and Ecosystem
|
||||
- [Maintainers](./maintainers.md) - Maintainer roles, types, and how to become one
|
||||
- [Support](../contribute/support.md) - Get help and raise issues
|
||||
- [Source Code Management](../contribute/code.md) - Work with PX4 code
|
||||
- [Documentation](../contribute/docs.md) - Improve the docs
|
||||
|
||||
@@ -1,57 +1,86 @@
|
||||
# Maintainer Role
|
||||
|
||||
Dronecode maintainers have technical leadership and responsibility for specific areas of PX4, and for other ecosystem components such as MAVLink, MAVSDK, QGroundControl, and others.
|
||||
Dronecode maintainers provide technical leadership for PX4 and for other ecosystem components such as MAVLink, MAVSDK, QGroundControl, and others. Some maintainers take responsibility for specific areas of the project, while others help across the project more broadly.
|
||||
The maintainer role is defined by the community with help and supervision from the [Dronecode Foundation](https://dronecode.org/).
|
||||
|
||||
To find the most up-to-date maintainers list, visit [PX4-Autopilot README](https://github.com/PX4/PX4-Autopilot#maintenance-team).
|
||||
To find the most up-to-date maintainers list, see [`MAINTAINERS.md`](https://github.com/PX4/PX4-Autopilot/blob/main/MAINTAINERS.md) in the PX4-Autopilot repository.
|
||||
|
||||
## Maintainer Types
|
||||
|
||||
PX4 recognizes two types of maintainers. Both are full members of the maintainer team, have write access via the [`Dev Team`](https://github.com/orgs/PX4/teams/dev-team) GitHub team, and participate in maintainer decisions.
|
||||
|
||||
- **Code Owners** are responsible for a specific category of the project (for example, State Estimation, Multirotor, or CI). They have final say on changes to their area, are the primary reviewers for that code, and help shape its roadmap. This is the role described in detail below.
|
||||
- **Reviewers** help maintain PX4 across the project without ownership of a specific category. They review, triage, and contribute wherever their interests and time allow. Reviewers have the same access and voting rights as Code Owners, but no on-call responsibility for any specific area of the codebase.
|
||||
|
||||
The Reviewer role is a good fit for contributors who want to help steward the project without committing to a specific component up front. A Reviewer may later become a Code Owner for a category by mutual agreement with the existing Code Owners of that category and sign-off from the maintainer team.
|
||||
|
||||
## Recruitment Process
|
||||
|
||||
If you would like to join the PX4 maintainers team or if you want to nominate someone else follow the steps below:
|
||||
|
||||
1. Read the [role description](#dronecode-maintainer-role-description), and make sure you understand the responsibilities of the role.
|
||||
2. To nominate yourself, reach out to one of the maintainers (see the complete list in the [PX4-Autopilot README](https://github.com/PX4/PX4-Autopilot#maintenance-team)), and seek their sponsorship.
|
||||
3. Express your interest in becoming a maintainer, and specify which area you would like to maintain.
|
||||
2. To nominate yourself, reach out to one of the maintainers (see the complete list in [`MAINTAINERS.md`](https://github.com/PX4/PX4-Autopilot/blob/main/MAINTAINERS.md)), and seek their sponsorship.
|
||||
3. Express your interest in becoming a maintainer, and specify whether you are applying as a **Code Owner** (for a specific category) or as a **Reviewer** (helping across the project without a fixed category).
|
||||
4. The sponsoring maintainer needs to bring this up for discussion in one of the [weekly developer calls](dev_call.md).
|
||||
The maintainer team will vote on the call to determine whether to accept you as a maintainer.
|
||||
|
||||
A Reviewer may later transition to a Code Owner role for a specific category. This requires agreement from the existing Code Owners of that category and sign-off from the maintainer team, following the same discussion and vote on the weekly developer call.
|
||||
|
||||
### Adding a new maintainer
|
||||
|
||||
Once the maintainer team has agreed to add a new maintainer, the change is landed via a pull request to [`MAINTAINERS.md`](https://github.com/PX4/PX4-Autopilot/blob/main/MAINTAINERS.md). The process is intentionally simple:
|
||||
|
||||
1. A current maintainer opens a PR adding the new maintainer to the appropriate table (**Code Owners** with a category, or **Reviewers**).
|
||||
2. The PR must be approved by at least one other current maintainer.
|
||||
3. If the new maintainer is being added as a Code Owner or sub-owner of a specific component, the existing Code Owner of that component must be among the approvers.
|
||||
|
||||
Once the PR is merged, the new maintainer proceeds through the [Onboarding Process](#onboarding-process) below.
|
||||
|
||||
## Onboarding Process
|
||||
|
||||
Once accepted every maintainers will go through the following process:
|
||||
|
||||
1. **Discord** server admin will grant you the `dev team` role, which gives you:
|
||||
1. Basic admin privileges on discord.
|
||||
2. Access to the `#maintainers` channel.
|
||||
2. Access to the private `#maintainers` channel for internal maintainer discussion.
|
||||
2. You will be given access to the GitHub team: "[`Dev Team`](https://github.com/orgs/PX4/teams/dev-team)" which grants you:
|
||||
1. Permission to merge the PR of any of PX4 workspace repositories after it's approved
|
||||
2. Permission to trigger GitHub actions when a new contributor opens a PR.
|
||||
3. Permission to edit Issue/PR contents.
|
||||
3. **Add your info to official PX4 channels**:
|
||||
1. Include your information on the PX4 [README](https://github.com/PX4/PX4-Autopilot/blob/main/README.md) next to the rest of the team
|
||||
2. Listed on the [Maintainers section](https://px4.io/community/maintainers/) of the PX4 website.
|
||||
3. Add your information to the internal Dronecode database of maintainers to keep you in sync.
|
||||
4. Community introduction to the new maintainer in the form of a forum post, which is promoted through ever growing official channels
|
||||
1. Add your information to the internal Dronecode database of maintainers to keep you in sync.
|
||||
2. Community introduction to the new maintainer in the form of a forum post, which is promoted through ever growing official channels
|
||||
|
||||
## Dronecode Maintainer Role Description
|
||||
|
||||
The responsibilities and qualifications below describe the **Code Owner** role in detail. **Reviewers** share the same spirit of technical stewardship, community guidance, and participation in maintainer meetings, without being tied to a specific category. Reviewers are expected to review and triage across the project where their expertise and interest apply.
|
||||
|
||||
### Summary
|
||||
|
||||
Maintainers lead/manage the development of a **specific category (referred to as category below)** of any Open Source Projects hosted within the Dronecode Foundation, such as the PX4 Autopilot.
|
||||
|
||||
### Responsibilities
|
||||
### Responsibilities (Code Owner)
|
||||
|
||||
1. Take charge of overseeing the development in their category.
|
||||
2. Provide guidance/advice on community members in their category.
|
||||
3. Review relevant pull requests and issues from the community on GitHub.
|
||||
4. Coordinate with the maintainer group.
|
||||
5. Keep regular attendance on [weekly meetings ](dev_call.md).
|
||||
5. Keep regular attendance on [weekly meetings](dev_call.md).
|
||||
6. Help create and maintain a roadmap for the project your represent.
|
||||
7. Uphold the [Code of Conduct](https://github.com/Dronecode/foundation/blob/main/CODE-OF-CONDUCT.md) of our community.
|
||||
|
||||
### Responsibilities (Reviewer)
|
||||
|
||||
1. Review relevant pull requests and issues across the project where your expertise applies.
|
||||
2. Help triage issues and guide community contributors.
|
||||
3. Coordinate with the maintainer group.
|
||||
4. Keep regular attendance on [weekly meetings](dev_call.md).
|
||||
5. Uphold the [Code of Conduct](https://github.com/Dronecode/foundation/blob/main/CODE-OF-CONDUCT.md) of our community.
|
||||
|
||||
### Qualifications
|
||||
|
||||
1. Proven track record of valuable contributions.
|
||||
2. Domain expertise in the category field.
|
||||
2. Domain expertise in the category field (for Code Owners) or broad working knowledge of the project (for Reviewers).
|
||||
3. Good overview of the project you are applying to.
|
||||
4. You need to manage approval from your employer when relevant.
|
||||
|
||||
|
||||
@@ -41,13 +41,6 @@ Key features:
|
||||
|
||||
See [Log Analysis using Flight Review](../log/flight_review.md) for an introduction.
|
||||
|
||||
### Hawkeye (3D Flight Replay)
|
||||
|
||||
[Hawkeye](../sim_hawkeye/index.md) can replay ULog files as 3D flight visualisations.
|
||||
Its ghost mode overlays two flights at different opacities for visual comparison (e.g. before/after PID tuning), and it supports multi-drone side-by-side playback.
|
||||
|
||||
See [Hawkeye ULog Replay](../sim_hawkeye/index.md#ulog-replay) for details.
|
||||
|
||||
### Foxglove
|
||||
|
||||
[Foxglove](https://foxglove.dev/) is a purpose-built robotics observation platform that works natively with ULog.
|
||||
|
||||
+195
-195
@@ -95,207 +95,207 @@ They are not build into the module, and hence are neither published or subscribe
|
||||
|
||||
::: details See messages
|
||||
|
||||
- [EstimatorStates](../msg_docs/EstimatorStates.md)
|
||||
- [GimbalDeviceInformation](../msg_docs/GimbalDeviceInformation.md)
|
||||
- [OpenDroneIdArmStatus](../msg_docs/OpenDroneIdArmStatus.md)
|
||||
- [RaptorInput](../msg_docs/RaptorInput.md)
|
||||
- [EstimatorAidSource1d](../msg_docs/EstimatorAidSource1d.md)
|
||||
- [EstimatorAidSource3d](../msg_docs/EstimatorAidSource3d.md)
|
||||
- [ActuatorArmed](../msg_docs/ActuatorArmed.md)
|
||||
- [InputRc](../msg_docs/InputRc.md)
|
||||
- [GpioIn](../msg_docs/GpioIn.md)
|
||||
- [RcChannels](../msg_docs/RcChannels.md)
|
||||
- [ActuatorOutputs](../msg_docs/ActuatorOutputs.md)
|
||||
- [Airspeed](../msg_docs/Airspeed.md)
|
||||
- [VehicleImuStatus](../msg_docs/VehicleImuStatus.md)
|
||||
- [VehicleLocalPositionSetpoint](../msg_docs/VehicleLocalPositionSetpoint.md)
|
||||
- [SensorGyro](../msg_docs/SensorGyro.md)
|
||||
- [NavigatorStatus](../msg_docs/NavigatorStatus.md)
|
||||
- [PositionSetpoint](../msg_docs/PositionSetpoint.md)
|
||||
- [SensorAirflow](../msg_docs/SensorAirflow.md)
|
||||
- [OrbTestLarge](../msg_docs/OrbTestLarge.md)
|
||||
- [OrbitStatus](../msg_docs/OrbitStatus.md)
|
||||
- [DistanceSensorModeChangeRequest](../msg_docs/DistanceSensorModeChangeRequest.md)
|
||||
- [FuelTankStatus](../msg_docs/FuelTankStatus.md)
|
||||
- [ActuatorServosTrim](../msg_docs/ActuatorServosTrim.md)
|
||||
- [RcParameterMap](../msg_docs/RcParameterMap.md)
|
||||
- [ActuatorTest](../msg_docs/ActuatorTest.md)
|
||||
- [VehicleAcceleration](../msg_docs/VehicleAcceleration.md)
|
||||
- [VehicleLocalPositionV0](../msg_docs/VehicleLocalPositionV0.md)
|
||||
- [SensorsStatusImu](../msg_docs/SensorsStatusImu.md)
|
||||
- [SystemPower](../msg_docs/SystemPower.md)
|
||||
- [InternalCombustionEngineStatus](../msg_docs/InternalCombustionEngineStatus.md)
|
||||
- [CameraCapture](../msg_docs/CameraCapture.md)
|
||||
- [FixedWingLateralStatus](../msg_docs/FixedWingLateralStatus.md)
|
||||
- [EstimatorSensorBias](../msg_docs/EstimatorSensorBias.md)
|
||||
- [SensorSelection](../msg_docs/SensorSelection.md)
|
||||
- [OpenDroneIdOperatorId](../msg_docs/OpenDroneIdOperatorId.md)
|
||||
- [EventV0](../msg_docs/EventV0.md)
|
||||
- [Vtx](../msg_docs/Vtx.md)
|
||||
- [LedControl](../msg_docs/LedControl.md)
|
||||
- [DronecanNodeStatus](../msg_docs/DronecanNodeStatus.md)
|
||||
- [YawEstimatorStatus](../msg_docs/YawEstimatorStatus.md)
|
||||
- [SensorCorrection](../msg_docs/SensorCorrection.md)
|
||||
- [GeofenceResult](../msg_docs/GeofenceResult.md)
|
||||
- [LogMessage](../msg_docs/LogMessage.md)
|
||||
- [ActionRequest](../msg_docs/ActionRequest.md)
|
||||
- [SensorGnssRelative](../msg_docs/SensorGnssRelative.md)
|
||||
- [UlogStream](../msg_docs/UlogStream.md)
|
||||
- [OpenDroneIdSelfId](../msg_docs/OpenDroneIdSelfId.md)
|
||||
- [OpenDroneIdSystem](../msg_docs/OpenDroneIdSystem.md)
|
||||
- [QshellReq](../msg_docs/QshellReq.md)
|
||||
- [DebugArray](../msg_docs/DebugArray.md)
|
||||
- [BatteryStatusV0](../msg_docs/BatteryStatusV0.md)
|
||||
- [DatamanResponse](../msg_docs/DatamanResponse.md)
|
||||
- [SensorAccel](../msg_docs/SensorAccel.md)
|
||||
- [PowerMonitor](../msg_docs/PowerMonitor.md)
|
||||
- [OrbTestMedium](../msg_docs/OrbTestMedium.md)
|
||||
- [SensorGyroFifo](../msg_docs/SensorGyroFifo.md)
|
||||
- [UlogStreamAck](../msg_docs/UlogStreamAck.md)
|
||||
- [VehicleOpticalFlow](../msg_docs/VehicleOpticalFlow.md)
|
||||
- [PowerButtonState](../msg_docs/PowerButtonState.md)
|
||||
- [DeviceInformation](../msg_docs/DeviceInformation.md)
|
||||
- [NavigatorMissionItem](../msg_docs/NavigatorMissionItem.md)
|
||||
- [FollowTarget](../msg_docs/FollowTarget.md)
|
||||
- [ParameterSetValueResponse](../msg_docs/ParameterSetValueResponse.md)
|
||||
- [EstimatorBias3d](../msg_docs/EstimatorBias3d.md)
|
||||
- [VehicleMagnetometer](../msg_docs/VehicleMagnetometer.md)
|
||||
- [GimbalManagerSetManualControl](../msg_docs/GimbalManagerSetManualControl.md)
|
||||
- [VelocityLimits](../msg_docs/VelocityLimits.md)
|
||||
- [SatelliteInfo](../msg_docs/SatelliteInfo.md)
|
||||
- [MountOrientation](../msg_docs/MountOrientation.md)
|
||||
- [WheelEncoders](../msg_docs/WheelEncoders.md)
|
||||
- [PositionControllerLandingStatus](../msg_docs/PositionControllerLandingStatus.md)
|
||||
- [CameraStatus](../msg_docs/CameraStatus.md)
|
||||
- [DebugVect](../msg_docs/DebugVect.md)
|
||||
- [Ekf2Timestamps](../msg_docs/Ekf2Timestamps.md)
|
||||
- [PositionControllerStatus](../msg_docs/PositionControllerStatus.md)
|
||||
- [VehicleOpticalFlowVel](../msg_docs/VehicleOpticalFlowVel.md)
|
||||
- [SensorsStatus](../msg_docs/SensorsStatus.md)
|
||||
- [EscReport](../msg_docs/EscReport.md)
|
||||
- [SensorGnssStatus](../msg_docs/SensorGnssStatus.md)
|
||||
- [AirspeedWind](../msg_docs/AirspeedWind.md)
|
||||
- [ParameterSetValueRequest](../msg_docs/ParameterSetValueRequest.md)
|
||||
- [DebugKeyValue](../msg_docs/DebugKeyValue.md)
|
||||
- [InternalCombustionEngineControl](../msg_docs/InternalCombustionEngineControl.md)
|
||||
- [GeneratorStatus](../msg_docs/GeneratorStatus.md)
|
||||
- [SensorGyroFft](../msg_docs/SensorGyroFft.md)
|
||||
- [EstimatorGpsStatus](../msg_docs/EstimatorGpsStatus.md)
|
||||
- [Ping](../msg_docs/Ping.md)
|
||||
- [MissionResult](../msg_docs/MissionResult.md)
|
||||
- [TiltrotorExtraControls](../msg_docs/TiltrotorExtraControls.md)
|
||||
- [ConfigOverridesV0](../msg_docs/ConfigOverridesV0.md)
|
||||
- [ActuatorControlsStatus](../msg_docs/ActuatorControlsStatus.md)
|
||||
- [RoverRateStatus](../msg_docs/RoverRateStatus.md)
|
||||
- [MagWorkerData](../msg_docs/MagWorkerData.md)
|
||||
- [VehicleImu](../msg_docs/VehicleImu.md)
|
||||
- [VehicleStatusV2](../msg_docs/VehicleStatusV2.md)
|
||||
- [CameraTrigger](../msg_docs/CameraTrigger.md)
|
||||
- [LaunchDetectionStatus](../msg_docs/LaunchDetectionStatus.md)
|
||||
- [CanInterfaceStatus](../msg_docs/CanInterfaceStatus.md)
|
||||
- [AdcReport](../msg_docs/AdcReport.md)
|
||||
- [RegisterExtComponentRequestV0](../msg_docs/RegisterExtComponentRequestV0.md)
|
||||
- [QshellRetval](../msg_docs/QshellRetval.md)
|
||||
- [ParameterUpdate](../msg_docs/ParameterUpdate.md)
|
||||
- [FollowTargetEstimator](../msg_docs/FollowTargetEstimator.md)
|
||||
- [GeofenceStatus](../msg_docs/GeofenceStatus.md)
|
||||
- [FollowTargetStatus](../msg_docs/FollowTargetStatus.md)
|
||||
- [GpsDump](../msg_docs/GpsDump.md)
|
||||
- [VehicleCommandAckV0](../msg_docs/VehicleCommandAckV0.md)
|
||||
- [ParameterResetRequest](../msg_docs/ParameterResetRequest.md)
|
||||
- [LoggerStatus](../msg_docs/LoggerStatus.md)
|
||||
- [VehicleAngularVelocity](../msg_docs/VehicleAngularVelocity.md)
|
||||
- [FailureDetectorStatus](../msg_docs/FailureDetectorStatus.md)
|
||||
- [FixedWingLateralGuidanceStatus](../msg_docs/FixedWingLateralGuidanceStatus.md)
|
||||
- [MavlinkLog](../msg_docs/MavlinkLog.md)
|
||||
- [ParameterSetUsedRequest](../msg_docs/ParameterSetUsedRequest.md)
|
||||
- [Px4ioStatus](../msg_docs/Px4ioStatus.md)
|
||||
- [BatteryInfo](../msg_docs/BatteryInfo.md)
|
||||
- [DatamanRequest](../msg_docs/DatamanRequest.md)
|
||||
- [RateCtrlStatus](../msg_docs/RateCtrlStatus.md)
|
||||
- [Cpuload](../msg_docs/Cpuload.md)
|
||||
- [SensorPreflightMag](../msg_docs/SensorPreflightMag.md)
|
||||
- [VehicleStatusV0](../msg_docs/VehicleStatusV0.md)
|
||||
- [NeuralControl](../msg_docs/NeuralControl.md)
|
||||
- [EstimatorSelectorStatus](../msg_docs/EstimatorSelectorStatus.md)
|
||||
- [DifferentialPressure](../msg_docs/DifferentialPressure.md)
|
||||
- [TaskStackInfo](../msg_docs/TaskStackInfo.md)
|
||||
- [ArmingCheckReplyV0](../msg_docs/ArmingCheckReplyV0.md)
|
||||
- [MavlinkTunnel](../msg_docs/MavlinkTunnel.md)
|
||||
- [VehicleAngularAccelerationSetpoint](../msg_docs/VehicleAngularAccelerationSetpoint.md)
|
||||
- [FlightPhaseEstimation](../msg_docs/FlightPhaseEstimation.md)
|
||||
- [GpioOut](../msg_docs/GpioOut.md)
|
||||
- [Gripper](../msg_docs/Gripper.md)
|
||||
- [FixedWingRunwayControl](../msg_docs/FixedWingRunwayControl.md)
|
||||
- [RtlStatus](../msg_docs/RtlStatus.md)
|
||||
- [GpioConfig](../msg_docs/GpioConfig.md)
|
||||
- [EscEepromRead](../msg_docs/EscEepromRead.md)
|
||||
- [EscStatus](../msg_docs/EscStatus.md)
|
||||
- [PpsCapture](../msg_docs/PpsCapture.md)
|
||||
- [EstimatorFusionControl](../msg_docs/EstimatorFusionControl.md)
|
||||
- [Mission](../msg_docs/Mission.md)
|
||||
- [LandingTargetPose](../msg_docs/LandingTargetPose.md)
|
||||
- [GimbalControls](../msg_docs/GimbalControls.md)
|
||||
- [SensorBaro](../msg_docs/SensorBaro.md)
|
||||
- [GpsInjectData](../msg_docs/GpsInjectData.md)
|
||||
- [RaptorStatus](../msg_docs/RaptorStatus.md)
|
||||
- [Event](../msg_docs/Event.md)
|
||||
- [HomePositionV0](../msg_docs/HomePositionV0.md)
|
||||
- [LandingGearWheel](../msg_docs/LandingGearWheel.md)
|
||||
- [SensorUwb](../msg_docs/SensorUwb.md)
|
||||
- [GpioRequest](../msg_docs/GpioRequest.md)
|
||||
- [EstimatorBias](../msg_docs/EstimatorBias.md)
|
||||
- [VehicleConstraints](../msg_docs/VehicleConstraints.md)
|
||||
- [RoverSpeedStatus](../msg_docs/RoverSpeedStatus.md)
|
||||
- [RtlTimeEstimate](../msg_docs/RtlTimeEstimate.md)
|
||||
- [GimbalManagerStatus](../msg_docs/GimbalManagerStatus.md)
|
||||
- [AirspeedValidatedV0](../msg_docs/AirspeedValidatedV0.md)
|
||||
- [RegisterExtComponentReplyV0](../msg_docs/RegisterExtComponentReplyV0.md)
|
||||
- [IrlockReport](../msg_docs/IrlockReport.md)
|
||||
- [VehicleStatusV1](../msg_docs/VehicleStatusV1.md)
|
||||
- [RangingBeacon](../msg_docs/RangingBeacon.md)
|
||||
- [ButtonEvent](../msg_docs/ButtonEvent.md)
|
||||
- [TakeoffStatus](../msg_docs/TakeoffStatus.md)
|
||||
- [TrajectorySetpoint6dof](../msg_docs/TrajectorySetpoint6dof.md)
|
||||
- [PwmInput](../msg_docs/PwmInput.md)
|
||||
- [SensorMag](../msg_docs/SensorMag.md)
|
||||
- [GimbalManagerSetAttitude](../msg_docs/GimbalManagerSetAttitude.md)
|
||||
- [EstimatorAidSource2d](../msg_docs/EstimatorAidSource2d.md)
|
||||
- [GimbalDeviceSetAttitude](../msg_docs/GimbalDeviceSetAttitude.md)
|
||||
- [HoverThrustEstimate](../msg_docs/HoverThrustEstimate.md)
|
||||
- [ArmingCheckRequestV0](../msg_docs/ArmingCheckRequestV0.md)
|
||||
- [SensorTemp](../msg_docs/SensorTemp.md)
|
||||
- [SensorAccelFifo](../msg_docs/SensorAccelFifo.md)
|
||||
- [VehicleAttitudeSetpointV0](../msg_docs/VehicleAttitudeSetpointV0.md)
|
||||
- [EstimatorInnovations](../msg_docs/EstimatorInnovations.md)
|
||||
- [RoverSpeedStatus](../msg_docs/RoverSpeedStatus.md)
|
||||
- [SystemPower](../msg_docs/SystemPower.md)
|
||||
- [EstimatorStatus](../msg_docs/EstimatorStatus.md)
|
||||
- [HeaterStatus](../msg_docs/HeaterStatus.md)
|
||||
- [IridiumsbdStatus](../msg_docs/IridiumsbdStatus.md)
|
||||
- [DebugValue](../msg_docs/DebugValue.md)
|
||||
- [NormalizedUnsignedSetpoint](../msg_docs/NormalizedUnsignedSetpoint.md)
|
||||
- [AutotuneAttitudeControlStatus](../msg_docs/AutotuneAttitudeControlStatus.md)
|
||||
- [RadioStatus](../msg_docs/RadioStatus.md)
|
||||
- [VehicleAirData](../msg_docs/VehicleAirData.md)
|
||||
- [Rpm](../msg_docs/Rpm.md)
|
||||
- [RoverAttitudeStatus](../msg_docs/RoverAttitudeStatus.md)
|
||||
- [EstimatorEventFlags](../msg_docs/EstimatorEventFlags.md)
|
||||
- [ControlAllocatorStatus](../msg_docs/ControlAllocatorStatus.md)
|
||||
- [SensorHygrometer](../msg_docs/SensorHygrometer.md)
|
||||
- [FigureEightStatus](../msg_docs/FigureEightStatus.md)
|
||||
- [CellularStatus](../msg_docs/CellularStatus.md)
|
||||
- [OrbTest](../msg_docs/OrbTest.md)
|
||||
- [UavcanParameterRequest](../msg_docs/UavcanParameterRequest.md)
|
||||
- [TuneControl](../msg_docs/TuneControl.md)
|
||||
- [LandingTargetInnovations](../msg_docs/LandingTargetInnovations.md)
|
||||
- [PurePursuitStatus](../msg_docs/PurePursuitStatus.md)
|
||||
- [VehicleRoi](../msg_docs/VehicleRoi.md)
|
||||
- [GpioRequest](../msg_docs/GpioRequest.md)
|
||||
- [HealthReport](../msg_docs/HealthReport.md)
|
||||
- [UavcanParameterValue](../msg_docs/UavcanParameterValue.md)
|
||||
- [OrbitStatus](../msg_docs/OrbitStatus.md)
|
||||
- [ParameterSetValueRequest](../msg_docs/ParameterSetValueRequest.md)
|
||||
- [VehicleConstraints](../msg_docs/VehicleConstraints.md)
|
||||
- [VehicleAirData](../msg_docs/VehicleAirData.md)
|
||||
- [MountOrientation](../msg_docs/MountOrientation.md)
|
||||
- [SensorGyroFft](../msg_docs/SensorGyroFft.md)
|
||||
- [IrlockReport](../msg_docs/IrlockReport.md)
|
||||
- [ManualControlSwitches](../msg_docs/ManualControlSwitches.md)
|
||||
- [MagnetometerBiasEstimate](../msg_docs/MagnetometerBiasEstimate.md)
|
||||
- [EscEepromWrite](../msg_docs/EscEepromWrite.md)
|
||||
- [TecsStatus](../msg_docs/TecsStatus.md)
|
||||
- [OpenDroneIdOperatorId](../msg_docs/OpenDroneIdOperatorId.md)
|
||||
- [FixedWingLateralStatus](../msg_docs/FixedWingLateralStatus.md)
|
||||
- [DebugKeyValue](../msg_docs/DebugKeyValue.md)
|
||||
- [VehicleAngularAccelerationSetpoint](../msg_docs/VehicleAngularAccelerationSetpoint.md)
|
||||
- [VehicleGlobalPositionV0](../msg_docs/VehicleGlobalPositionV0.md)
|
||||
- [DeviceInformation](../msg_docs/DeviceInformation.md)
|
||||
- [HoverThrustEstimate](../msg_docs/HoverThrustEstimate.md)
|
||||
- [VehicleLocalPositionV0](../msg_docs/VehicleLocalPositionV0.md)
|
||||
- [EventV0](../msg_docs/EventV0.md)
|
||||
- [RcChannels](../msg_docs/RcChannels.md)
|
||||
- [ArmingCheckReplyV0](../msg_docs/ArmingCheckReplyV0.md)
|
||||
- [DatamanRequest](../msg_docs/DatamanRequest.md)
|
||||
- [SensorAirflow](../msg_docs/SensorAirflow.md)
|
||||
- [InputRc](../msg_docs/InputRc.md)
|
||||
- [EstimatorAidSource1d](../msg_docs/EstimatorAidSource1d.md)
|
||||
- [SensorGnssStatus](../msg_docs/SensorGnssStatus.md)
|
||||
- [OpenDroneIdSelfId](../msg_docs/OpenDroneIdSelfId.md)
|
||||
- [Ekf2Timestamps](../msg_docs/Ekf2Timestamps.md)
|
||||
- [FixedWingLateralGuidanceStatus](../msg_docs/FixedWingLateralGuidanceStatus.md)
|
||||
- [GeneratorStatus](../msg_docs/GeneratorStatus.md)
|
||||
- [VehicleAngularVelocity](../msg_docs/VehicleAngularVelocity.md)
|
||||
- [AdcReport](../msg_docs/AdcReport.md)
|
||||
- [FollowTarget](../msg_docs/FollowTarget.md)
|
||||
- [RoverAttitudeStatus](../msg_docs/RoverAttitudeStatus.md)
|
||||
- [VehicleAcceleration](../msg_docs/VehicleAcceleration.md)
|
||||
- [ActuatorOutputs](../msg_docs/ActuatorOutputs.md)
|
||||
- [EscEepromWrite](../msg_docs/EscEepromWrite.md)
|
||||
- [EstimatorAidSource2d](../msg_docs/EstimatorAidSource2d.md)
|
||||
- [RateCtrlStatus](../msg_docs/RateCtrlStatus.md)
|
||||
- [RaptorStatus](../msg_docs/RaptorStatus.md)
|
||||
- [GimbalManagerStatus](../msg_docs/GimbalManagerStatus.md)
|
||||
- [DifferentialPressure](../msg_docs/DifferentialPressure.md)
|
||||
- [RangingBeacon](../msg_docs/RangingBeacon.md)
|
||||
- [PwmInput](../msg_docs/PwmInput.md)
|
||||
- [LaunchDetectionStatus](../msg_docs/LaunchDetectionStatus.md)
|
||||
- [DronecanNodeStatus](../msg_docs/DronecanNodeStatus.md)
|
||||
- [SensorsStatusImu](../msg_docs/SensorsStatusImu.md)
|
||||
- [DatamanResponse](../msg_docs/DatamanResponse.md)
|
||||
- [VehicleImu](../msg_docs/VehicleImu.md)
|
||||
- [EstimatorSensorBias](../msg_docs/EstimatorSensorBias.md)
|
||||
- [MagWorkerData](../msg_docs/MagWorkerData.md)
|
||||
- [CellularStatus](../msg_docs/CellularStatus.md)
|
||||
- [GpsDump](../msg_docs/GpsDump.md)
|
||||
- [ParameterResetRequest](../msg_docs/ParameterResetRequest.md)
|
||||
- [EstimatorEventFlags](../msg_docs/EstimatorEventFlags.md)
|
||||
- [InternalCombustionEngineControl](../msg_docs/InternalCombustionEngineControl.md)
|
||||
- [InternalCombustionEngineStatus](../msg_docs/InternalCombustionEngineStatus.md)
|
||||
- [GimbalManagerSetManualControl](../msg_docs/GimbalManagerSetManualControl.md)
|
||||
- [FixedWingRunwayControl](../msg_docs/FixedWingRunwayControl.md)
|
||||
- [ActionRequest](../msg_docs/ActionRequest.md)
|
||||
- [EstimatorGpsStatus](../msg_docs/EstimatorGpsStatus.md)
|
||||
- [NormalizedUnsignedSetpoint](../msg_docs/NormalizedUnsignedSetpoint.md)
|
||||
- [RoverRateStatus](../msg_docs/RoverRateStatus.md)
|
||||
- [GimbalDeviceInformation](../msg_docs/GimbalDeviceInformation.md)
|
||||
- [Vtx](../msg_docs/Vtx.md)
|
||||
- [OrbTestMedium](../msg_docs/OrbTestMedium.md)
|
||||
- [EscEepromRead](../msg_docs/EscEepromRead.md)
|
||||
- [Px4ioStatus](../msg_docs/Px4ioStatus.md)
|
||||
- [OrbTestLarge](../msg_docs/OrbTestLarge.md)
|
||||
- [CameraCapture](../msg_docs/CameraCapture.md)
|
||||
- [Airspeed](../msg_docs/Airspeed.md)
|
||||
- [CanInterfaceStatus](../msg_docs/CanInterfaceStatus.md)
|
||||
- [DebugArray](../msg_docs/DebugArray.md)
|
||||
- [SatelliteInfo](../msg_docs/SatelliteInfo.md)
|
||||
- [Cpuload](../msg_docs/Cpuload.md)
|
||||
- [EstimatorInnovations](../msg_docs/EstimatorInnovations.md)
|
||||
- [EstimatorStates](../msg_docs/EstimatorStates.md)
|
||||
- [EstimatorSelectorStatus](../msg_docs/EstimatorSelectorStatus.md)
|
||||
- [FailureDetectorStatus](../msg_docs/FailureDetectorStatus.md)
|
||||
- [LoggerStatus](../msg_docs/LoggerStatus.md)
|
||||
- [RegisterExtComponentRequestV0](../msg_docs/RegisterExtComponentRequestV0.md)
|
||||
- [GimbalControls](../msg_docs/GimbalControls.md)
|
||||
- [LogMessage](../msg_docs/LogMessage.md)
|
||||
- [PowerMonitor](../msg_docs/PowerMonitor.md)
|
||||
- [VehicleAttitudeSetpointV0](../msg_docs/VehicleAttitudeSetpointV0.md)
|
||||
- [BatteryInfo](../msg_docs/BatteryInfo.md)
|
||||
- [DistanceSensorModeChangeRequest](../msg_docs/DistanceSensorModeChangeRequest.md)
|
||||
- [ParameterSetValueResponse](../msg_docs/ParameterSetValueResponse.md)
|
||||
- [GpioConfig](../msg_docs/GpioConfig.md)
|
||||
- [LandingGearWheel](../msg_docs/LandingGearWheel.md)
|
||||
- [CameraTrigger](../msg_docs/CameraTrigger.md)
|
||||
- [MissionResult](../msg_docs/MissionResult.md)
|
||||
- [SensorUwb](../msg_docs/SensorUwb.md)
|
||||
- [TecsStatus](../msg_docs/TecsStatus.md)
|
||||
- [TrajectorySetpoint6dof](../msg_docs/TrajectorySetpoint6dof.md)
|
||||
- [LedControl](../msg_docs/LedControl.md)
|
||||
- [ActuatorArmed](../msg_docs/ActuatorArmed.md)
|
||||
- [ButtonEvent](../msg_docs/ButtonEvent.md)
|
||||
- [RegisterExtComponentReplyV0](../msg_docs/RegisterExtComponentReplyV0.md)
|
||||
- [ControlAllocatorStatus](../msg_docs/ControlAllocatorStatus.md)
|
||||
- [NavigatorMissionItem](../msg_docs/NavigatorMissionItem.md)
|
||||
- [QshellReq](../msg_docs/QshellReq.md)
|
||||
- [EstimatorFusionControl](../msg_docs/EstimatorFusionControl.md)
|
||||
- [SensorGyro](../msg_docs/SensorGyro.md)
|
||||
- [PurePursuitStatus](../msg_docs/PurePursuitStatus.md)
|
||||
- [EstimatorAidSource3d](../msg_docs/EstimatorAidSource3d.md)
|
||||
- [Mission](../msg_docs/Mission.md)
|
||||
- [RtlStatus](../msg_docs/RtlStatus.md)
|
||||
- [BatteryStatusV0](../msg_docs/BatteryStatusV0.md)
|
||||
- [FigureEightStatus](../msg_docs/FigureEightStatus.md)
|
||||
- [PositionControllerLandingStatus](../msg_docs/PositionControllerLandingStatus.md)
|
||||
- [ActuatorTest](../msg_docs/ActuatorTest.md)
|
||||
- [TuneControl](../msg_docs/TuneControl.md)
|
||||
- [EscStatus](../msg_docs/EscStatus.md)
|
||||
- [VehicleOpticalFlowVel](../msg_docs/VehicleOpticalFlowVel.md)
|
||||
- [NeuralControl](../msg_docs/NeuralControl.md)
|
||||
- [VehicleOpticalFlow](../msg_docs/VehicleOpticalFlow.md)
|
||||
- [VehicleStatusV1](../msg_docs/VehicleStatusV1.md)
|
||||
- [SensorCorrection](../msg_docs/SensorCorrection.md)
|
||||
- [AutotuneAttitudeControlStatus](../msg_docs/AutotuneAttitudeControlStatus.md)
|
||||
- [FollowTargetEstimator](../msg_docs/FollowTargetEstimator.md)
|
||||
- [SensorBaro](../msg_docs/SensorBaro.md)
|
||||
- [OpenDroneIdSystem](../msg_docs/OpenDroneIdSystem.md)
|
||||
- [GpioIn](../msg_docs/GpioIn.md)
|
||||
- [FlightPhaseEstimation](../msg_docs/FlightPhaseEstimation.md)
|
||||
- [DebugValue](../msg_docs/DebugValue.md)
|
||||
- [EstimatorBias3d](../msg_docs/EstimatorBias3d.md)
|
||||
- [Gripper](../msg_docs/Gripper.md)
|
||||
- [TakeoffStatus](../msg_docs/TakeoffStatus.md)
|
||||
- [Event](../msg_docs/Event.md)
|
||||
- [VehicleRoi](../msg_docs/VehicleRoi.md)
|
||||
- [HomePositionV0](../msg_docs/HomePositionV0.md)
|
||||
- [ActuatorControlsStatus](../msg_docs/ActuatorControlsStatus.md)
|
||||
- [LandingTargetPose](../msg_docs/LandingTargetPose.md)
|
||||
- [PowerButtonState](../msg_docs/PowerButtonState.md)
|
||||
- [OrbTest](../msg_docs/OrbTest.md)
|
||||
- [SensorMag](../msg_docs/SensorMag.md)
|
||||
- [SensorAccel](../msg_docs/SensorAccel.md)
|
||||
- [AirspeedValidatedV0](../msg_docs/AirspeedValidatedV0.md)
|
||||
- [NavigatorStatus](../msg_docs/NavigatorStatus.md)
|
||||
- [ParameterUpdate](../msg_docs/ParameterUpdate.md)
|
||||
- [VehicleImuStatus](../msg_docs/VehicleImuStatus.md)
|
||||
- [TaskStackInfo](../msg_docs/TaskStackInfo.md)
|
||||
- [RadioStatus](../msg_docs/RadioStatus.md)
|
||||
- [ArmingCheckRequestV0](../msg_docs/ArmingCheckRequestV0.md)
|
||||
- [FollowTargetStatus](../msg_docs/FollowTargetStatus.md)
|
||||
- [VehicleLocalPositionSetpoint](../msg_docs/VehicleLocalPositionSetpoint.md)
|
||||
- [GpioOut](../msg_docs/GpioOut.md)
|
||||
- [QshellRetval](../msg_docs/QshellRetval.md)
|
||||
- [SensorHygrometer](../msg_docs/SensorHygrometer.md)
|
||||
- [MavlinkLog](../msg_docs/MavlinkLog.md)
|
||||
- [PositionSetpoint](../msg_docs/PositionSetpoint.md)
|
||||
- [SensorGnssRelative](../msg_docs/SensorGnssRelative.md)
|
||||
- [SensorSelection](../msg_docs/SensorSelection.md)
|
||||
- [VelocityLimits](../msg_docs/VelocityLimits.md)
|
||||
- [VehicleCommandAckV0](../msg_docs/VehicleCommandAckV0.md)
|
||||
- [TiltrotorExtraControls](../msg_docs/TiltrotorExtraControls.md)
|
||||
- [SensorAccelFifo](../msg_docs/SensorAccelFifo.md)
|
||||
- [WheelEncoders](../msg_docs/WheelEncoders.md)
|
||||
- [PpsCapture](../msg_docs/PpsCapture.md)
|
||||
- [RcParameterMap](../msg_docs/RcParameterMap.md)
|
||||
- [RtlTimeEstimate](../msg_docs/RtlTimeEstimate.md)
|
||||
- [GimbalManagerInformation](../msg_docs/GimbalManagerInformation.md)
|
||||
- [IridiumsbdStatus](../msg_docs/IridiumsbdStatus.md)
|
||||
- [MavlinkTunnel](../msg_docs/MavlinkTunnel.md)
|
||||
- [ActuatorServosTrim](../msg_docs/ActuatorServosTrim.md)
|
||||
- [VehicleStatusV2](../msg_docs/VehicleStatusV2.md)
|
||||
- [EscReport](../msg_docs/EscReport.md)
|
||||
- [EstimatorBias](../msg_docs/EstimatorBias.md)
|
||||
- [GeofenceStatus](../msg_docs/GeofenceStatus.md)
|
||||
- [GeofenceResult](../msg_docs/GeofenceResult.md)
|
||||
- [UavcanParameterRequest](../msg_docs/UavcanParameterRequest.md)
|
||||
- [ParameterSetUsedRequest](../msg_docs/ParameterSetUsedRequest.md)
|
||||
- [VehicleStatusV0](../msg_docs/VehicleStatusV0.md)
|
||||
- [DebugVect](../msg_docs/DebugVect.md)
|
||||
- [SensorTemp](../msg_docs/SensorTemp.md)
|
||||
- [UlogStream](../msg_docs/UlogStream.md)
|
||||
- [MagnetometerBiasEstimate](../msg_docs/MagnetometerBiasEstimate.md)
|
||||
- [Ping](../msg_docs/Ping.md)
|
||||
- [YawEstimatorStatus](../msg_docs/YawEstimatorStatus.md)
|
||||
- [VehicleMagnetometer](../msg_docs/VehicleMagnetometer.md)
|
||||
- [GimbalDeviceSetAttitude](../msg_docs/GimbalDeviceSetAttitude.md)
|
||||
- [UlogStreamAck](../msg_docs/UlogStreamAck.md)
|
||||
- [AirspeedWind](../msg_docs/AirspeedWind.md)
|
||||
- [PositionControllerStatus](../msg_docs/PositionControllerStatus.md)
|
||||
- [CameraStatus](../msg_docs/CameraStatus.md)
|
||||
- [SensorsStatus](../msg_docs/SensorsStatus.md)
|
||||
- [SensorPreflightMag](../msg_docs/SensorPreflightMag.md)
|
||||
- [SensorGyroFifo](../msg_docs/SensorGyroFifo.md)
|
||||
- [ConfigOverridesV0](../msg_docs/ConfigOverridesV0.md)
|
||||
- [LandingTargetInnovations](../msg_docs/LandingTargetInnovations.md)
|
||||
- [UavcanParameterValue](../msg_docs/UavcanParameterValue.md)
|
||||
- [FuelTankStatus](../msg_docs/FuelTankStatus.md)
|
||||
- [OpenDroneIdArmStatus](../msg_docs/OpenDroneIdArmStatus.md)
|
||||
- [GainCompression](../msg_docs/GainCompression.md)
|
||||
- [HeaterStatus](../msg_docs/HeaterStatus.md)
|
||||
- [Rpm](../msg_docs/Rpm.md)
|
||||
- [RaptorInput](../msg_docs/RaptorInput.md)
|
||||
:::
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
# Hawkeye Flight Visualiser
|
||||
|
||||
[Hawkeye](https://github.com/PX4/Hawkeye) is a real-time 3D flight visualiser for PX4.
|
||||
It connects to any MAVLink source (SITL or hardware) and renders vehicle state from [`HIL_STATE_QUATERNION`](https://mavlink.io/en/messages/common.html#HIL_STATE_QUATERNION) messages.
|
||||
|
||||
::: tip
|
||||
Hawkeye is the recommended visualiser for [SIH Simulation](../sim_sih/index.md) (which doesn't have a default visualiser).
|
||||
:::
|
||||
|
||||
Note that Hawkeye is not a simulator — it doesn't model physics or generate sensor data — it only renders what PX4 is doing.
|
||||
|
||||
Hawkeye has no runtime dependencies.
|
||||
It is built in in C with [Raylib](https://www.raylib.com/).
|
||||
|
||||
## Features
|
||||
|
||||
- Real-time 3D rendering of vehicle state via MAVLink
|
||||
- Multi-vehicle swarm visualisation (up to 16 vehicles simultaneously)
|
||||
- ULog replay with ghost mode for visual flight comparison (e.g. before/after PID tuning)
|
||||
- Vehicle models: quadrotor, hexarotor, fixed-wing, tailsitter, VTOL, rover, ROV
|
||||
- Three camera modes: Chase, FPV, Free (WASD fly)
|
||||
- Orthographic views (sidebar and fullscreen)
|
||||
- HUD with compass, attitude indicator, and telemetry badges
|
||||
- Theme engine with built-in themes (Grid, Rez, Snow)
|
||||
|
||||
## Installation
|
||||
|
||||
### macOS (Homebrew)
|
||||
|
||||
```sh
|
||||
brew tap PX4/px4
|
||||
brew install PX4/px4/hawkeye
|
||||
```
|
||||
|
||||
### Linux (Debian/Ubuntu)
|
||||
|
||||
Download the `.deb` package from the [latest release](https://github.com/PX4/Hawkeye/releases/latest):
|
||||
|
||||
```sh
|
||||
sudo dpkg -i hawkeye_*_amd64.deb
|
||||
```
|
||||
|
||||
### From Source (All Platforms)
|
||||
|
||||
```sh
|
||||
git clone --recursive https://github.com/PX4/Hawkeye.git
|
||||
cd Hawkeye
|
||||
make release
|
||||
```
|
||||
|
||||
The binary is placed at `build/hawkeye`.
|
||||
|
||||
On Linux, the following packages are required:
|
||||
|
||||
```sh
|
||||
sudo apt install build-essential cmake libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libgl-dev
|
||||
```
|
||||
|
||||
On Windows, use Visual Studio with the C/C++ workload and CMake.
|
||||
|
||||
## Usage with SIH SITL
|
||||
|
||||
### Single Vehicle
|
||||
|
||||
In one terminal, start SIH:
|
||||
|
||||
```sh
|
||||
make px4_sitl_sih sihsim_quadx
|
||||
```
|
||||
|
||||
In another terminal, start Hawkeye:
|
||||
|
||||
```sh
|
||||
hawkeye
|
||||
```
|
||||
|
||||
Hawkeye connects on UDP port **19410** by default — the same port SIH sends `HIL_STATE_QUATERNION` on.
|
||||
|
||||
### Multi-Vehicle
|
||||
|
||||
Each SIH instance sends visualisation data on port `19410 + N` (where N is the instance number).
|
||||
Launch multiple SIH instances, then start Hawkeye with the vehicle count:
|
||||
|
||||
```sh
|
||||
hawkeye -n 3
|
||||
```
|
||||
|
||||
### Vehicle Type Selection
|
||||
|
||||
By default, Hawkeye renders a quadrotor.
|
||||
Use flags to select a different model:
|
||||
|
||||
| Flag | Vehicle |
|
||||
| ----- | --------------------- |
|
||||
| `-mc` | Multicopter (default) |
|
||||
| `-fw` | Fixed-wing |
|
||||
| `-ts` | Tailsitter |
|
||||
|
||||
Example for fixed-wing:
|
||||
|
||||
```sh
|
||||
hawkeye -fw
|
||||
```
|
||||
|
||||
## ULog Replay
|
||||
|
||||
Hawkeye can replay flight logs for post-flight review:
|
||||
|
||||
```sh
|
||||
hawkeye --replay flight.ulg
|
||||
```
|
||||
|
||||
### Ghost Mode
|
||||
|
||||
Overlay a second flight at reduced opacity for visual comparison:
|
||||
|
||||
```sh
|
||||
hawkeye --replay flight_after.ulg --ghost flight_before.ulg
|
||||
```
|
||||
|
||||
This is useful for comparing flights before and after tuning changes.
|
||||
|
||||
## CLI Reference
|
||||
|
||||
| Option | Description |
|
||||
| --------------------------- | ------------------------------------- |
|
||||
| `-udp <port>` | Set UDP listen port (default: 19410) |
|
||||
| `-n <count>` | Number of vehicles to visualise |
|
||||
| `-origin <lat> <lon> <alt>` | Set map origin |
|
||||
| `-mc` | Multicopter model |
|
||||
| `-fw` | Fixed-wing model |
|
||||
| `-ts` | Tailsitter model |
|
||||
| `--replay <file.ulg>` | Replay a ULog file |
|
||||
| `--ghost <file.ulg>` | Overlay a ghost flight for comparison |
|
||||
|
||||
## Camera Controls
|
||||
|
||||
| Mode | Description |
|
||||
| ----- | ------------------------------------ |
|
||||
| Chase | Follows behind the vehicle (default) |
|
||||
| FPV | First-person view from the vehicle |
|
||||
| Free | Fly freely with WASD + mouse |
|
||||
|
||||
## See Also
|
||||
|
||||
- [Hawkeye GitHub Repository](https://github.com/PX4/Hawkeye)
|
||||
- [SIH Simulation](../sim_sih/index.md) — the headless simulator Hawkeye is designed to visualise
|
||||
+18
-16
@@ -74,25 +74,27 @@ The `px4_sitl` target will work, but will also build Gazebo libraries.
|
||||
### Visualization (Optional) {#sitl-visualization}
|
||||
|
||||
SIH is intentionally headless by default.
|
||||
If you need a visual aid to see what the vehicle is doing you can use QGroundControl to track path over ground, and/or [Hawkeye](../sim_hawkeye/index.md) as a 3D viewer.
|
||||
If you need a visual aid to see what the vehicle is doing you can use QGroundControl to track path over ground, and/or jMAVSim as a 3D viewer.
|
||||
|
||||
#### QGroundControl
|
||||
|
||||
QGC auto-connects on UDP port 14550. Open QGC while SIH is running and the vehicle appears on the map view with attitude, position, and telemetry.
|
||||
|
||||
#### Hawkeye (3D Visualiser)
|
||||
#### jMAVSim (3D Display-Only)
|
||||
|
||||
[Hawkeye](../sim_hawkeye/index.md) renders a real-time 3D view of the vehicle using MAVLink position data. No physics are simulated in Hawkeye — it is a visualiser only.
|
||||
|
||||
In a separate terminal, run:
|
||||
jMAVSim can render a 3D view of the vehicle using MAVLink position data. No physics are simulated in jMAVSim — it is display-only.
|
||||
|
||||
```sh
|
||||
hawkeye
|
||||
./Tools/simulation/jmavsim/jmavsim_run.sh -p 19410 -u -q -o
|
||||
```
|
||||
|
||||
Hawkeye connects on UDP port 19410 by default (the same port SIH sends `HIL_STATE_QUATERNION` on).
|
||||
Flags:
|
||||
|
||||
Use `-fw` for fixed-wing or `-ts` for tailsitter models. See the [Hawkeye docs](../sim_hawkeye/index.md) for multi-vehicle visualisation and ULog replay.
|
||||
- `-a` for airplane model
|
||||
- `-t` for tailsitter model
|
||||
- `-o` enable display-only mode.
|
||||
|
||||
See [jMAVSim Display-Only Mode](../sim_jmavsim/index.md#display-only-mode) for details.
|
||||
|
||||
### Environment Configuration
|
||||
|
||||
@@ -146,14 +148,14 @@ See [uXRCE-DDS (PX4-ROS 2/DDS Bridge)](../middleware/uxrce_dds.md) for full setu
|
||||
|
||||
PX4 SITL opens the following UDP ports (all instance-aware, offset by instance number N).
|
||||
|
||||
| PX4 sends to (remote) | PX4 listens on (local) | Use for | Instance offset |
|
||||
| --------------------- | ---------------------- | ----------------------------- | ----------------------------------------- |
|
||||
| **14550** | 18570 (+N) | QGroundControl, GCS tools | Yes |
|
||||
| **14540** (+N) | 14580 (+N) | MAVSDK, MAVROS, offboard APIs | Yes (capped at 14549 for 10+ instances) |
|
||||
| **14030** (+N) | 14280 (+N) | Onboard camera/payload | Yes |
|
||||
| **13280** (+N) | 13030 (+N) | Gimbal control | Yes |
|
||||
| **19410** (+N) | 19450 (+N) | Hawkeye visualizer (SIH only) | Yes |
|
||||
| **8888** | - | uXRCE-DDS / ROS 2 | No (use DDS namespace for multi-instance) |
|
||||
| PX4 sends to (remote) | PX4 listens on (local) | Use for | Instance offset |
|
||||
| --------------------- | ---------------------- | ------------------------------- | ----------------------------------------- |
|
||||
| **14550** | 18570 (+N) | QGroundControl, GCS tools | Yes |
|
||||
| **14540** (+N) | 14580 (+N) | MAVSDK, MAVROS, offboard APIs | Yes (capped at 14549 for 10+ instances) |
|
||||
| **14030** (+N) | 14280 (+N) | Onboard camera/payload | Yes |
|
||||
| **13280** (+N) | 13030 (+N) | Gimbal control | Yes |
|
||||
| **19410** (+N) | 19450 (+N) | jMAVSim display-only (SIH only) | Yes |
|
||||
| **8888** | - | uXRCE-DDS / ROS 2 | No (use DDS namespace for multi-instance) |
|
||||
|
||||
QGC auto-connects on port **14550** by default. MAVSDK connects on **14540**. No manual port configuration needed for single-instance use.
|
||||
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
# Holybro SiK Telemetry Radio - Long Range
|
||||
|
||||
This Holybro SiK Long Range Telemetry Radio is a small, light, and inexpensive open-source radio platform with an extended range (~20km) compared to the standard model.
|
||||
|
||||
This radio is plug-and-play, ready for all Pixhawk Standard and other similar flight controllers, providing the easiest way to set up a telemetry connection between your controller and a ground station.
|
||||
It uses open-source firmware that has been specially designed to work well with MAVLink packets and to be integrated with PX4, ArduPilot, Mission Planner and QGroundControl.
|
||||
|
||||
The radios are available in 915 MHz or 433 MHz versions.
|
||||
Please purchase the model that is appropriate for your country/region.
|
||||
|
||||

|
||||
|
||||
## Where to Buy
|
||||
|
||||
- [Holybro SiK Telemetry Radio - Long Range](https://holybro.com/collections/telemetry-radios/products/sik-telemetry-radio-1w)
|
||||
|
||||
## Features
|
||||
|
||||
- 1W maximum RF output and up to 20km range (compared to 100mW/300m for the short range version).
|
||||
- Open-source SIK firmware
|
||||
- Plug-n-play for Pixhawk Standard Flight Controllers
|
||||
- The Easiest way to connect your controller and Ground Station
|
||||
- Interchangeable air and ground radio
|
||||
- 6-position JST-GH connector
|
||||
|
||||
## Specification
|
||||
|
||||
- 1 W maximum output power (adjustable) -117 dBm receive sensitivity
|
||||
- RP-SMA connector
|
||||
- 2-way full-duplex communication through adaptive TDM UART interface
|
||||
- Transparent serial link
|
||||
- MAVLink protocol framing
|
||||
- Frequency Hopping Spread Spectrum (FHSS) Configurable duty cycle
|
||||
- Error correction corrects up to 25% of bit errors Open-source SIK firmware
|
||||
- Configurable through Mission Planner & APM Planner
|
||||
- FT230X USB to BASIC UART IC
|
||||
- USB Type C connector
|
||||
- XT30 power connector for 7~28V DC input
|
||||
|
||||
## LEDs Indicators Status
|
||||
|
||||
The radios have four status LEDs.
|
||||
The USB `RX` and `TX` LEDs indicate the status of reception and transmission of the USB port.
|
||||
The `RADIO` and `ACT` two LED lights indicate the status of the RF circuit.
|
||||
|
||||
- USB-TX LED (orange):
|
||||
- Blinking: USB port has data transmission
|
||||
- Off: USB port has no data transmission
|
||||
- USB-RX LED (orange):
|
||||
- Blinking: USB port has data reception
|
||||
- Off: USB port has no data reception
|
||||
- Radio LED (Green)
|
||||
- Blinking: Searching for another radio
|
||||
- Solid: Link is established with another radio
|
||||
- ACT LED (Red)
|
||||
- Flashing: Transmitting data
|
||||
- Solid: In firmware update mode
|
||||
|
||||

|
||||
|
||||
## Connecting to Flight Controller
|
||||
|
||||
Supply the power (7~28V) to the radio via the XT30 connector.
|
||||
Use the 6-pin JST-GH connector that comes with the radio to connect the radio to your flight controller's `TELEM1` port.
|
||||
|
||||
Note that `TELEM2` can also be used, but you may need to [configure the telemetry port](../peripherals/mavlink_peripherals.md) on some flight controllers.
|
||||
|
||||
## Connecting to a PC or Ground Station
|
||||
|
||||
First, power the module with a 7~28V DC source.
|
||||
Then, connect the radio to your Windows PC or Ground Station using a Type-C USB cable.
|
||||
|
||||
The necessary drivers should be installed automatically, and the radio will appear as a new “USB Serial Port” in the Windows Device Manager under Ports (COM & LPT).
|
||||
The Mission Planner's COM Port selection drop-down should also include the newly added COM port.
|
||||
|
||||
## Packages Include
|
||||
|
||||
### Single Radio
|
||||
|
||||
- 1W Radio modules with antennas (1)
|
||||
- High-gain omnidirectional antenna (1)
|
||||
- Male Type-C to male Type-C USB cable (1)
|
||||
- Male XT30 to female XT30 adapter cable (1)
|
||||
- Male XT30 to female XT60 adapter cable (1)
|
||||
- JST-GH-6P to JST-GH-6P cable (1) (for Pixhawk Standard FC)
|
||||
- Rubber damping grommet (3)
|
||||
|
||||

|
||||
|
||||
### Pair Radios
|
||||
|
||||
- 1W Radio modules with antennas (2)
|
||||
- High-gain omnidirectional antenna (2)
|
||||
- Male Type-C to male Type-C USB cable (1)
|
||||
- Male XT30 to female XT30 adapter cable (1)
|
||||
- Male XT30 to female XT60 adapter cable (1)
|
||||
- JST-GH-6P to JST-GH-6P cable (1) (for Pixhawk Standard FC)
|
||||
- Rubber damping grommet (3)
|
||||
|
||||

|
||||
@@ -6,6 +6,7 @@ PX4 supports a number of types of telemetry radios:
|
||||
|
||||
- [SiK Radio](../telemetry/sik_radio.md) based firmware (more generally, any radio with a UART interface should work).
|
||||
- [HolyBro SiK Telemetry Radio](../telemetry/holybro_sik_radio.md)
|
||||
- [HolyBro SiK Long Range](../telemetry/holybro_sik_longrange.md)
|
||||
- [RFD900 Telemetry Radio](../telemetry/rfd900_telemetry.md)
|
||||
- [ThunderFly TFSIK01 Telemetry Radio](../telemetry/tfsik_telemetry.md)
|
||||
- <del>_HKPilot Telemetry Radio_</del> (Discontinued)
|
||||
|
||||
@@ -14,6 +14,7 @@ Hardware for the SiK radio can be obtained from various manufacturers/stores in
|
||||
## Vendors
|
||||
|
||||
- [Holybro Telemetry Radio](../telemetry/holybro_sik_radio.md)
|
||||
- [HolyBro SiK Long Range](../telemetry/holybro_sik_longrange.md)
|
||||
- [RFD900 Telemetry Radio](../telemetry/rfd900_telemetry.md)
|
||||
- [ThunderFly TFSIK01 Telemetry Radio](../telemetry/tfsik_telemetry.md)
|
||||
- <del>_HKPilot Telemetry Radio_</del> (Discontinued)
|
||||
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -193,7 +193,7 @@ config WQ_HP_DEFAULT_PRIORITY
|
||||
|
||||
config WQ_UAVCAN_STACKSIZE
|
||||
int "Stack size for uavcan"
|
||||
default 3624
|
||||
default 3754
|
||||
range 1000 10000
|
||||
help
|
||||
Sets the stack size for the uavcan work queue.
|
||||
|
||||
Submodule platforms/nuttx/NuttX/nuttx updated: 29450774d7...dcd640cdc8
@@ -31,4 +31,33 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
// Placeholder
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <board_config.h>
|
||||
|
||||
#if defined(CONFIG_I2C)
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
struct i2c_master_s;
|
||||
|
||||
struct i2c_msg_s {
|
||||
uint32_t frequency;
|
||||
uint16_t addr;
|
||||
uint16_t flags;
|
||||
uint8_t *buffer;
|
||||
int length;
|
||||
};
|
||||
|
||||
#define I2C_M_READ 0x0001
|
||||
|
||||
#define I2C_TRANSFER(dev, msgs, count) px4_qurt_i2c_transfer(dev, msgs, count)
|
||||
|
||||
struct i2c_master_s *px4_i2cbus_initialize(int bus);
|
||||
int px4_i2cbus_uninitialize(struct i2c_master_s *dev);
|
||||
int px4_qurt_i2c_transfer(struct i2c_master_s *dev, struct i2c_msg_s *msgs, unsigned count);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* CONFIG_I2C */
|
||||
|
||||
@@ -40,6 +40,7 @@ set(QURT_LAYER_SRCS
|
||||
main.cpp
|
||||
qurt_log.cpp
|
||||
SerialImpl.cpp
|
||||
px4_i2c.cpp
|
||||
)
|
||||
|
||||
add_library(px4_layer
|
||||
@@ -48,3 +49,4 @@ add_library(px4_layer
|
||||
|
||||
target_link_libraries(px4_layer PRIVATE work_queue)
|
||||
target_link_libraries(px4_layer PRIVATE drivers_board)
|
||||
target_link_libraries(px4_layer PRIVATE drivers__device)
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2022 ModalAI, Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name PX4 nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/**
|
||||
* @file px4_i2c.cpp
|
||||
*
|
||||
* NuttX-compatible I2C API shim for QuRT/SLPI.
|
||||
* Implements px4_i2cbus_initialize/uninitialize and I2C_TRANSFER
|
||||
* on top of the QuRT device::I2C callback infrastructure by deriving
|
||||
* from device::I2C to access its protected transfer methods.
|
||||
*/
|
||||
|
||||
#include <px4_platform_common/px4_config.h>
|
||||
#include <px4_platform_common/log.h>
|
||||
#include <px4_arch/micro_hal.h>
|
||||
|
||||
#if defined(CONFIG_I2C)
|
||||
|
||||
#include <lib/drivers/device/qurt/I2C.hpp>
|
||||
|
||||
/**
|
||||
* Minimal derived class that exposes the protected I2C::transfer()
|
||||
* and I2C::set_device_address() for use by the compatibility shim.
|
||||
*/
|
||||
class I2CShim : public device::I2C
|
||||
{
|
||||
public:
|
||||
I2CShim(int bus) :
|
||||
I2C(0, "i2c_shim", bus, 0x01, 100000)
|
||||
{}
|
||||
|
||||
int do_transfer(uint8_t addr, const uint8_t *send, unsigned send_len,
|
||||
uint8_t *recv, unsigned recv_len)
|
||||
{
|
||||
set_device_address(addr, false);
|
||||
return transfer(send, send_len, recv, recv_len);
|
||||
}
|
||||
};
|
||||
|
||||
struct i2c_master_s {
|
||||
I2CShim *shim;
|
||||
};
|
||||
|
||||
struct i2c_master_s *px4_i2cbus_initialize(int bus)
|
||||
{
|
||||
auto *shim = new I2CShim(bus);
|
||||
|
||||
if (shim == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (shim->init() != PX4_OK) {
|
||||
delete shim;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto *dev = new i2c_master_s;
|
||||
|
||||
if (dev == nullptr) {
|
||||
delete shim;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
dev->shim = shim;
|
||||
return dev;
|
||||
}
|
||||
|
||||
int px4_i2cbus_uninitialize(struct i2c_master_s *dev)
|
||||
{
|
||||
if (dev != nullptr) {
|
||||
delete dev->shim;
|
||||
delete dev;
|
||||
}
|
||||
|
||||
return PX4_OK;
|
||||
}
|
||||
|
||||
int px4_qurt_i2c_transfer(struct i2c_master_s *dev, struct i2c_msg_s *msgs, unsigned count)
|
||||
{
|
||||
if (dev == nullptr || dev->shim == nullptr || msgs == nullptr || count == 0) {
|
||||
return PX4_ERROR;
|
||||
}
|
||||
|
||||
unsigned i = 0;
|
||||
|
||||
while (i < count) {
|
||||
struct i2c_msg_s *msg = &msgs[i];
|
||||
|
||||
// Check for write+read pair to the same address (common i2cdetect pattern)
|
||||
if ((i + 1 < count) &&
|
||||
!(msg->flags & I2C_M_READ) &&
|
||||
(msgs[i + 1].flags & I2C_M_READ) &&
|
||||
(msg->addr == msgs[i + 1].addr)) {
|
||||
|
||||
int ret = dev->shim->do_transfer(msg->addr,
|
||||
msg->buffer, msg->length,
|
||||
msgs[i + 1].buffer, msgs[i + 1].length);
|
||||
|
||||
if (ret != PX4_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
i += 2;
|
||||
|
||||
} else if (msg->flags & I2C_M_READ) {
|
||||
// Single read
|
||||
int ret = dev->shim->do_transfer(msg->addr,
|
||||
nullptr, 0,
|
||||
msg->buffer, msg->length);
|
||||
|
||||
if (ret != PX4_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
i++;
|
||||
|
||||
} else {
|
||||
// Single write
|
||||
int ret = dev->shim->do_transfer(msg->addr,
|
||||
msg->buffer, msg->length,
|
||||
nullptr, 0);
|
||||
|
||||
if (ret != PX4_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return PX4_OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_I2C */
|
||||
@@ -49,7 +49,7 @@ parameters:
|
||||
default: 0
|
||||
reboot_required: true
|
||||
min: 0
|
||||
max: 2
|
||||
max: 3
|
||||
VOXL_ESC_SDIR1:
|
||||
description:
|
||||
short: UART ESC ID 1 Spin Direction Flag
|
||||
|
||||
@@ -16,4 +16,4 @@ parameters:
|
||||
default: 0
|
||||
reboot_required: true
|
||||
min: 0
|
||||
max: 3
|
||||
max: 5
|
||||
|
||||
@@ -126,7 +126,7 @@ parameters:
|
||||
6: Ground Control Station (UART2 outputs NMEA)
|
||||
default: 0
|
||||
min: 0
|
||||
max: 1
|
||||
max: 6
|
||||
reboot_required: true
|
||||
GPS_UBX_BAUD2:
|
||||
description:
|
||||
|
||||
@@ -93,7 +93,7 @@ parameters:
|
||||
default: 14
|
||||
reboot_required: true
|
||||
min: 0
|
||||
max: 15
|
||||
max: 19
|
||||
ADSB_MAX_SPEED:
|
||||
description:
|
||||
short: ADSB-Out Vehicle Max Speed
|
||||
|
||||
@@ -158,10 +158,12 @@ out:
|
||||
}
|
||||
|
||||
void
|
||||
I2C::set_device_address(int address)
|
||||
I2C::set_device_address(int address, bool log)
|
||||
{
|
||||
if ((_i2c_fd != PX4_ERROR) && (_set_i2c_address != NULL)) {
|
||||
PX4_INFO("Set i2c address 0x%x, fd %d", address, _i2c_fd);
|
||||
if (log) {
|
||||
PX4_INFO("Set i2c address 0x%x, fd %d", address, _i2c_fd);
|
||||
}
|
||||
|
||||
pthread_mutex_lock(_mutex);
|
||||
_set_i2c_address(_i2c_fd, address);
|
||||
|
||||
@@ -103,7 +103,7 @@ protected:
|
||||
*/
|
||||
virtual int probe() { return PX4_OK; }
|
||||
|
||||
virtual void set_device_address(int address);
|
||||
virtual void set_device_address(int address, bool log = true);
|
||||
|
||||
/**
|
||||
* Perform an I2C transaction to the device.
|
||||
|
||||
@@ -141,17 +141,6 @@ void ModeChecks::checkAndReport(const Context &context, Report &reporter)
|
||||
reporter.clearCanRunBits((NavModes)reporter.failsafeFlags().mode_req_mission);
|
||||
}
|
||||
|
||||
if (reporter.failsafeFlags().offboard_control_signal_lost && reporter.failsafeFlags().mode_req_offboard_signal != 0) {
|
||||
/* EVENT
|
||||
* @description
|
||||
* The offboard component is not sending setpoints or the required estimate (e.g. position) is missing.
|
||||
*/
|
||||
reporter.armingCheckFailure((NavModes)reporter.failsafeFlags().mode_req_offboard_signal, health_component_t::system,
|
||||
events::ID("check_modes_offboard_signal"),
|
||||
events::Log::Error, "No offboard signal");
|
||||
reporter.clearCanRunBits((NavModes)reporter.failsafeFlags().mode_req_offboard_signal);
|
||||
}
|
||||
|
||||
if (reporter.failsafeFlags().home_position_invalid && reporter.failsafeFlags().mode_req_home_position != 0) {
|
||||
/* EVENT
|
||||
*/
|
||||
|
||||
@@ -40,6 +40,9 @@ void OffboardChecks::checkAndReport(const Context &context, Report &reporter)
|
||||
reporter.failsafeFlags().offboard_control_signal_lost = true;
|
||||
|
||||
offboard_control_mode_s offboard_control_mode;
|
||||
const NavModes affected_modes = (NavModes)reporter.failsafeFlags().mode_req_offboard_signal;
|
||||
const bool has_affected_modes = affected_modes != NavModes::None;
|
||||
bool has_specific_reason = false;
|
||||
|
||||
if (_offboard_control_mode_sub.copy(&offboard_control_mode)) {
|
||||
|
||||
@@ -52,16 +55,63 @@ void OffboardChecks::checkAndReport(const Context &context, Report &reporter)
|
||||
|
||||
if (offboard_control_mode.position && reporter.failsafeFlags().local_position_invalid) {
|
||||
offboard_available = false;
|
||||
has_specific_reason = true;
|
||||
|
||||
if (has_affected_modes) {
|
||||
/* EVENT
|
||||
* @description
|
||||
* Offboard position control requires a valid local position estimate.
|
||||
*/
|
||||
reporter.armingCheckFailure(affected_modes, health_component_t::system,
|
||||
events::ID("check_modes_offboard_no_local_position"),
|
||||
events::Log::Error, "Offboard requires local position");
|
||||
reporter.clearCanRunBits(affected_modes);
|
||||
}
|
||||
|
||||
} else if (offboard_control_mode.velocity && reporter.failsafeFlags().local_velocity_invalid) {
|
||||
offboard_available = false;
|
||||
has_specific_reason = true;
|
||||
|
||||
} else if (offboard_control_mode.acceleration && reporter.failsafeFlags().attitude_invalid) {
|
||||
// OFFBOARD acceleration handled by position controller
|
||||
if (has_affected_modes) {
|
||||
/* EVENT
|
||||
* @description
|
||||
* Offboard velocity control requires a valid local velocity estimate.
|
||||
*/
|
||||
reporter.armingCheckFailure(affected_modes, health_component_t::system,
|
||||
events::ID("check_modes_offboard_no_local_velocity"),
|
||||
events::Log::Error, "Offboard requires local velocity");
|
||||
reporter.clearCanRunBits(affected_modes);
|
||||
}
|
||||
|
||||
} else if ((offboard_control_mode.acceleration || offboard_control_mode.attitude)
|
||||
&& reporter.failsafeFlags().attitude_invalid) {
|
||||
offboard_available = false;
|
||||
has_specific_reason = true;
|
||||
|
||||
if (has_affected_modes) {
|
||||
/* EVENT
|
||||
* @description
|
||||
* Offboard acceleration and attitude control require a valid attitude estimate.
|
||||
*/
|
||||
reporter.armingCheckFailure(affected_modes, health_component_t::system,
|
||||
events::ID("check_modes_offboard_no_attitude"),
|
||||
events::Log::Error, "Offboard requires attitude estimate");
|
||||
reporter.clearCanRunBits(affected_modes);
|
||||
}
|
||||
}
|
||||
|
||||
// This is a mode requirement, no need to report
|
||||
reporter.failsafeFlags().offboard_control_signal_lost = !offboard_available;
|
||||
}
|
||||
|
||||
if (reporter.failsafeFlags().offboard_control_signal_lost && !has_specific_reason && has_affected_modes) {
|
||||
/* EVENT
|
||||
* @description
|
||||
* The offboard component is not sending recent setpoints.
|
||||
*/
|
||||
reporter.armingCheckFailure(affected_modes, health_component_t::system,
|
||||
events::ID("check_modes_offboard_signal_lost"),
|
||||
events::Log::Error, "No offboard signal");
|
||||
reporter.clearCanRunBits(affected_modes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,7 +507,7 @@ parameters:
|
||||
4: Terminate
|
||||
default: 0
|
||||
min: 0
|
||||
max: 3
|
||||
max: 4
|
||||
COM_PARACHUTE:
|
||||
description:
|
||||
short: Require MAVLink parachute system to be present and healthy
|
||||
|
||||
@@ -105,7 +105,7 @@ FixedwingAttitudeControl::vehicle_manual_poll(const float yaw_body)
|
||||
pitch_body = constrain(pitch_body,
|
||||
-radians(_param_fw_man_p_max.get()), radians(_param_fw_man_p_max.get()));
|
||||
|
||||
const Quatf q_sp_rp = AxisAnglef(roll_body, pitch_body, 0.f);
|
||||
const Quatf q_sp_rp = Eulerf(roll_body, pitch_body, 0.f);
|
||||
const Quatf q_sp_yaw(cosf(yaw_body / 2.f), 0.f, 0.f, sinf(yaw_body / 2.f));
|
||||
Quatf q = q_sp_yaw * q_sp_rp;
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ parameters:
|
||||
23: VTOL Tailsitter
|
||||
default: 0
|
||||
min: 0
|
||||
max: 22
|
||||
max: 23
|
||||
MAV_USEHILGPS:
|
||||
description:
|
||||
short: Use/Accept HIL GPS message even if not in HIL mode
|
||||
|
||||
@@ -15,7 +15,7 @@ parameters:
|
||||
5: yaw fixed
|
||||
default: 0
|
||||
min: 0
|
||||
max: 4
|
||||
max: 5
|
||||
- group: Multicopter Attitude Control
|
||||
definitions:
|
||||
MPC_YAWRAUTO_MAX:
|
||||
|
||||
@@ -65,6 +65,243 @@
|
||||
#include <conversion/rotation.h> // math::radians,
|
||||
// #include <lib/mathlib/mathlib.h>
|
||||
#include <math.h>
|
||||
#include <px4_platform_common/defines.h> // PX4_ISFINITE
|
||||
#include <px4_platform_common/log.h> // PX4_INFO
|
||||
|
||||
// class Thruster using the terminology from UIUC Propeller Data site https://m-selig.ae.illinois.edu/props/propDB.html
|
||||
class Thruster
|
||||
{
|
||||
private:
|
||||
static constexpr float INCH_TO_M = 0.0254f;
|
||||
float CT0, CT1, CT2, CP0, CP1, CP2;
|
||||
float _d_m;
|
||||
float _rpm_max;
|
||||
float T_MAX;
|
||||
float Q_MAX;
|
||||
public:
|
||||
|
||||
// public implicit constructor
|
||||
Thruster() : Thruster(0.1f, 1000.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f) {}
|
||||
|
||||
/** public explicit constructor for static model
|
||||
* using the maximum thrust and torque.
|
||||
* In this case, the prop diameter and RPM are not needed.
|
||||
*/
|
||||
Thruster(float Tmax, float Qmax)
|
||||
{
|
||||
_d_m = 0.0f;
|
||||
_rpm_max = 0.0f;
|
||||
CT0 = 0.0f;
|
||||
CT1 = 0.0f;
|
||||
CT2 = 0.0f;
|
||||
CP0 = 0.0f;
|
||||
CP1 = 0.0f;
|
||||
CP2 = 0.0f;
|
||||
T_MAX = Tmax;
|
||||
Q_MAX = Qmax;
|
||||
}
|
||||
|
||||
/** public explicit constructor
|
||||
* - prop_dia_inch: propeller diameter in inches
|
||||
* - rpm_max: max RPM
|
||||
* - ct0, ct1, ct2: second order thrust coefficient
|
||||
* - cp0, cp1, cp2: second order power coefficient
|
||||
*/
|
||||
Thruster(float prop_dia_inch, float rpm_max, float ct0, float ct1, float ct2, float cp0, float cp1, float cp2)
|
||||
{
|
||||
_d_m = dia_inch_to_m(prop_dia_inch);
|
||||
_rpm_max = rpm_max;
|
||||
CT0 = ct0;
|
||||
CT1 = ct1;
|
||||
CT2 = ct2;
|
||||
CP0 = cp0;
|
||||
CP1 = cp1;
|
||||
CP2 = cp2;
|
||||
// Initialize T_MAX and Q_MAX before they may be used inside the compute_* helpers
|
||||
T_MAX = 0.0f;
|
||||
Q_MAX = 0.0f;
|
||||
T_MAX = compute_thrust_from_throttle(1.0f);
|
||||
Q_MAX = compute_torque_from_throttle(1.0f);
|
||||
}
|
||||
|
||||
/** advance_ratio(float n_rev_s, float vx_ms)
|
||||
* compute the advance ratio J = vx_ms / n_rev_s / d_m
|
||||
* with
|
||||
* - n_rev_s is the propeller rotational speed in revolution/s
|
||||
* - vx_ms is the valocity seen by the thruster in m/s,
|
||||
* usually projected on the propeller revolution axis
|
||||
*/
|
||||
float advance_ratio(float n_rev_s, float vx_ms)
|
||||
{
|
||||
return vx_ms / n_rev_s / _d_m;
|
||||
}
|
||||
|
||||
/** fCT(float J, float ct0, float ct1, float ct2)
|
||||
* Compute the thrust coefficient ct from the advance ratio J
|
||||
*
|
||||
*/
|
||||
float fCT(float J)
|
||||
{
|
||||
if (!PX4_ISFINITE(J)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// do not allow ct < 0 (i.e. windmill)
|
||||
return fmaxf(CT0 + CT1 * J + CT2 * J * J, 0.0f);
|
||||
}
|
||||
|
||||
/** fCP(float J, float cp0, float cp1, float cp2)
|
||||
* Compute the power coefficient cp from the advance ratio J
|
||||
*
|
||||
*/
|
||||
float fCP(float J)
|
||||
{
|
||||
if (!PX4_ISFINITE(J)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return fmaxf(CP0 + CP1 * J + CP2 * J * J, 0.0f);
|
||||
}
|
||||
|
||||
/** compute_thrust(float n_rev_s, float vx_ms=0.0f, float rho=1.225f)
|
||||
* Compute the thrust force in (N) given
|
||||
* - n_rev_s is the propeller rotational speed in revolution/s
|
||||
* - vx_ms is the velocity seen by the thruster in m/s,
|
||||
* usually projected on the propeller revolution axis
|
||||
* - rho is the density in kg/m^3
|
||||
*/
|
||||
float compute_thrust(float n_rev_s, float vx_ms = 0.0f, float rho = 1.225f)
|
||||
{
|
||||
if (CT0 <= 0.0f || n_rev_s <= 1.0e-4f) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
float J = advance_ratio(n_rev_s, vx_ms);
|
||||
return fCT(J) * rho * n_rev_s * n_rev_s * _d_m * _d_m * _d_m * _d_m;
|
||||
}
|
||||
|
||||
/** compute_thrust_from_throttle(float u, float vx_ms=0.0f, float rho=1.225f)
|
||||
* Compute the thrust force in (N) given
|
||||
* - u is the thruster unit throttle in range [0,1]
|
||||
* - vx_ms is the velocity seen by the thruster in m/s,
|
||||
* usually projected on the propeller revolution axis
|
||||
* - rho is the density in kg/m^3
|
||||
*/
|
||||
float compute_thrust_from_throttle(float u, float vx_ms = 0.0f, float rho = 1.225f)
|
||||
{
|
||||
if (CT0 <= 0.0f) {
|
||||
return T_MAX * u;
|
||||
}
|
||||
|
||||
float n_rev_s = throttle_to_rev_s(u, _rpm_max);
|
||||
return compute_thrust(n_rev_s, vx_ms, rho);
|
||||
}
|
||||
|
||||
/** compute_torque(float n_rev_s, float vx_ms=0.0f, float rho=1.225f)
|
||||
* Compute the propeller torque in (Nm) given
|
||||
* - n_rev_s is the propeller rotational speed in revolution/s
|
||||
* - vx_ms is the velocity seen by the thruster in m/s,
|
||||
* usually projected on the propeller revolution axis
|
||||
* - rho is the density in kg/m^3
|
||||
*/
|
||||
float compute_torque(float n_rev_s, float vx_ms = 0.0f, float rho = 1.225f)
|
||||
{
|
||||
if (CP0 <= 0.0f || n_rev_s <= 1.0e-4f) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
float J = advance_ratio(n_rev_s, vx_ms);
|
||||
float cq = fCP(J) / 2.0f / M_PI_F;
|
||||
return cq * rho * n_rev_s * n_rev_s * _d_m * _d_m * _d_m * _d_m * _d_m;
|
||||
}
|
||||
|
||||
/** compute_torque_from_throttle(float u, float vx_ms=0.0f, float rho=1.225f)
|
||||
* Compute the propeller torque in (Nm) given
|
||||
* - u is the thruster unit throttle in range [0,1]
|
||||
* - vx_ms is the velocity seen by the thruster in m/s,
|
||||
* usually projected on the propeller revolution axis
|
||||
* - rho is the density in kg/m^3
|
||||
*/
|
||||
float compute_torque_from_throttle(float u, float vx_ms = 0.0f, float rho = 1.225f)
|
||||
{
|
||||
if (CP0 <= 0.0f) {
|
||||
return Q_MAX * u;
|
||||
}
|
||||
|
||||
float n_rev_s = throttle_to_rev_s(u, _rpm_max);
|
||||
return compute_torque(n_rev_s, vx_ms, rho);
|
||||
}
|
||||
|
||||
/** dia_inch_to_m(float dia_inch)
|
||||
* compute the propeller diameter in meter,
|
||||
* given dia_inch the propeller diameter in inches.
|
||||
*/
|
||||
static float dia_inch_to_m(float dia_inch)
|
||||
{
|
||||
return dia_inch * INCH_TO_M;
|
||||
}
|
||||
|
||||
/** rpm_to_rev_s(float rpm)
|
||||
* compute the propeller revolutions per seconds,
|
||||
* given the propeller rpm.
|
||||
*/
|
||||
static float rpm_to_rev_s(float rpm)
|
||||
{
|
||||
return rpm / 60.0f;
|
||||
}
|
||||
|
||||
/** rev_s_to_rpm(float n_rev_s)
|
||||
* compute the propeller rpm,
|
||||
* given the propeller revolutions per seconds.
|
||||
*/
|
||||
static float rev_s_to_rpm(float n_rev_s)
|
||||
{
|
||||
return n_rev_s * 60.0f;
|
||||
}
|
||||
|
||||
/** throttle_to_rpm(float throttle, const float rpm_max)
|
||||
* compute the propeller rpm,
|
||||
* given the unit throttle u (in range [0,1])
|
||||
* and the max RPM rpm_max.
|
||||
*/
|
||||
static float throttle_to_rpm(float u, const float rpm_max)
|
||||
{
|
||||
return rpm_max * sqrtf(fminf(fmaxf(u, 0.0f), 1.0f));
|
||||
}
|
||||
|
||||
/** throttle_to_rev_s(float throttle, const float rpm_max)
|
||||
* compute the propeller revolution per seconds,
|
||||
* given the unit throttle u (in range [0,1])
|
||||
* and the max RPM rpm_max.
|
||||
*/
|
||||
static float throttle_to_rev_s(float u, const float rpm_max)
|
||||
{
|
||||
return rpm_to_rev_s(throttle_to_rpm(u, rpm_max));
|
||||
}
|
||||
|
||||
float get_T_max()
|
||||
{
|
||||
return T_MAX;
|
||||
}
|
||||
|
||||
float get_Q_max()
|
||||
{
|
||||
return Q_MAX;
|
||||
}
|
||||
|
||||
void print_status()
|
||||
{
|
||||
if (CT0 <= 0.0f) {
|
||||
PX4_INFO("Thruster simple model: Tmax %.4f N, Qmax %.4f Nm", (double)T_MAX, (double)Q_MAX);
|
||||
|
||||
} else {
|
||||
PX4_INFO("Thruster dyn. model: dia %.4f m, max rpm %.0f, Tmax %.4f N, Qmax %.4f Nm",
|
||||
(double)_d_m, (double)_rpm_max, (double)T_MAX, (double)Q_MAX);
|
||||
PX4_INFO(" Tmax: %.3f N at 10 m/s, %.3f N at 20 m/s",
|
||||
(double)compute_thrust_from_throttle(1.0f, 10.0f), (double)compute_thrust_from_throttle(1.0f, 20.0f));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// class Aerodynamic Segment ------------------------------------------------------------------------
|
||||
class AeroSeg
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (c) 2019-2025 PX4 Development Team. All rights reserved.
|
||||
* Copyright (c) 2019-2026 PX4 Development Team. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -252,6 +252,37 @@ void Sih::parameters_updated()
|
||||
_L_PITCH = _sih_l_pitch.get();
|
||||
_KDV = _sih_kdv.get();
|
||||
_KDW = _sih_kdw.get();
|
||||
_F_T_MAX = _sih_f_thrust_max.get();
|
||||
_F_Q_MAX = _sih_f_torque_max.get();
|
||||
|
||||
// update the thruster models
|
||||
for (size_t i = 0; i < NUM_DYN_THRUSTER; i++) {
|
||||
if (_sih_f_ct0.get() > 0.0f && _sih_f_cp0.get() > 0.0f) {
|
||||
_thruster[i] = Thruster(_sih_forward_diameter_inch.get(), _sih_forward_rpm_max.get(),
|
||||
_sih_f_ct0.get(), _sih_f_ct1.get(), _sih_f_ct2.get(),
|
||||
_sih_f_cp0.get(), _sih_f_cp1.get(), _sih_f_cp2.get());
|
||||
|
||||
} else {
|
||||
_thruster[i] = Thruster(_F_T_MAX, _F_Q_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
if (_sih_f_ct0.get() > 0.0f && _sih_f_cp0.get() > 0.0f) {
|
||||
_F_T_MAX = _thruster[0].get_T_max();
|
||||
_F_Q_MAX = _thruster[0].get_Q_max();
|
||||
|
||||
if (fabsf(_F_T_MAX - _sih_f_thrust_max.get()) > 1.0e-5f) {
|
||||
_sih_f_thrust_max.set(_F_T_MAX);
|
||||
_sih_f_thrust_max.commit();
|
||||
PX4_INFO("SIH_F_CT0 > 0, using propeller dynamic model, overriding SIH_F_T_MAX");
|
||||
}
|
||||
|
||||
if (fabsf(_F_Q_MAX - _sih_f_torque_max.get()) > 1.0e-5f) {
|
||||
_sih_f_torque_max.set(_F_Q_MAX);
|
||||
_sih_f_torque_max.commit();
|
||||
PX4_INFO("SIH_F_CP0 > 0, using propeller dynamic model, overriding SIH_F_Q_MAX");
|
||||
}
|
||||
}
|
||||
|
||||
if (!_lpos_ref.isInitialized()
|
||||
|| (fabsf(static_cast<float>(_lpos_ref.getProjectionReferenceLat()) - _sih_lat0.get()) > FLT_EPSILON)
|
||||
@@ -314,7 +345,11 @@ void Sih::read_motors(const float dt)
|
||||
|
||||
void Sih::generate_force_and_torques(const float dt)
|
||||
{
|
||||
// air-relative velocity in body frame [m/s]
|
||||
_v_B = _q_E.rotateVectorInverse(_R_N2E * _v_apparent_N);
|
||||
|
||||
if (_vehicle == VehicleType::Quadcopter) {
|
||||
|
||||
_T_B = Vector3f(0.0f, 0.0f, -_T_MAX * (+_u[0] + _u[1] + _u[2] + _u[3]));
|
||||
_Mt_B = Vector3f(_L_ROLL * _T_MAX * (-_u[0] + _u[1] + _u[2] - _u[3]),
|
||||
_L_PITCH * _T_MAX * (+_u[0] - _u[1] + _u[2] - _u[3]),
|
||||
@@ -340,28 +375,34 @@ void Sih::generate_force_and_torques(const float dt)
|
||||
_Ma_B = -_KDW * _w_B; // first order angular damper
|
||||
|
||||
} else if (_vehicle == VehicleType::FixedWing) {
|
||||
_T_B = Vector3f(_T_MAX * _u[3], 0.0f, 0.0f); // forward thruster
|
||||
// _Mt_B = Vector3f(_Q_MAX*_u[3], 0.0f,0.0f); // thruster torque
|
||||
_Mt_B = Vector3f();
|
||||
generate_fw_aerodynamics(_u[0], _u[1], _u[2], _u[3]);
|
||||
|
||||
_T[0] = _thruster[0].compute_thrust_from_throttle(_u[3], _v_B(0));
|
||||
_Q[0] = _thruster[0].compute_torque_from_throttle(_u[3], _v_B(0));
|
||||
_T_B = Vector3f(_T[0], 0.0f, 0.0f); // forward thruster
|
||||
_Mt_B = Vector3f(_Q[0], 0.0f, 0.0f); // thruster torque
|
||||
generate_fw_aerodynamics(_u[0], _u[1], _u[2], _T[0]);
|
||||
|
||||
} else if (_vehicle == VehicleType::TailsitterVTOL) {
|
||||
_T_B = Vector3f(0.0f, 0.0f, -_T_MAX * (_u[0] + _u[1]));
|
||||
_Mt_B = Vector3f(_L_ROLL * _T_MAX * (_u[1] - _u[0]), 0.0f, _Q_MAX * (_u[1] - _u[0]));
|
||||
generate_ts_aerodynamics();
|
||||
|
||||
// _Fa_E = -_KDV * _R_N2E * _v_apparent_N; // first order drag to slow down the aircraft
|
||||
// _Ma_B = -_KDW * _w_B; // first order angular damper
|
||||
for (size_t i = 0; i < NUM_DYN_THRUSTER; i++) {
|
||||
_T[i] = _thruster[i].compute_thrust_from_throttle(_u[i], -_v_B(2));
|
||||
_Q[i] = _thruster[i].compute_torque_from_throttle(_u[i], -_v_B(2));
|
||||
}
|
||||
|
||||
_T_B = Vector3f(0.0f, 0.0f, -_T[0] - _T[1]);
|
||||
_Mt_B = Vector3f(_L_ROLL * (_T[1] - _T[0]), 0.0f, _Q[1] - _Q[0]);
|
||||
generate_ts_aerodynamics();
|
||||
|
||||
} else if (_vehicle == VehicleType::StandardVTOL) {
|
||||
|
||||
_T_B = Vector3f(_T_MAX * 2 * _u[7], 0.0f, -_T_MAX * (+_u[0] + _u[1] + _u[2] + _u[3]));
|
||||
_Mt_B = Vector3f(_L_ROLL * _T_MAX * (-_u[0] + _u[1] + _u[2] - _u[3]),
|
||||
_T[0] = _thruster[0].compute_thrust_from_throttle(_u[7], _v_B(0));
|
||||
_Q[0] = _thruster[0].compute_torque_from_throttle(_u[7], _v_B(0));
|
||||
_T_B = Vector3f(_T[0], 0.0f, -_T_MAX * (+_u[0] + _u[1] + _u[2] + _u[3]));
|
||||
_Mt_B = Vector3f(_L_ROLL * _T_MAX * (-_u[0] + _u[1] + _u[2] - _u[3]) + _Q[0],
|
||||
_L_PITCH * _T_MAX * (+_u[0] - _u[1] + _u[2] - _u[3]),
|
||||
_Q_MAX * (+_u[0] + _u[1] - _u[2] - _u[3]));
|
||||
|
||||
// thrust 0 because it is already contained in _T_B. in
|
||||
// equations_of_motion they are all summed into sum_of_forces_E
|
||||
// thrust 0 means no propwash on the tail
|
||||
generate_fw_aerodynamics(_u[4], _u[5], _u[6], 0);
|
||||
|
||||
} else if (_vehicle == VehicleType::RoverAckermann) {
|
||||
@@ -370,21 +411,20 @@ void Sih::generate_force_and_torques(const float dt)
|
||||
}
|
||||
|
||||
void Sih::generate_fw_aerodynamics(const float roll_cmd, const float pitch_cmd, const float yaw_cmd,
|
||||
const float throttle_cmd)
|
||||
const float thrust_for_prowash)
|
||||
{
|
||||
const Vector3f v_B = _q.rotateVectorInverse(_v_apparent_N);
|
||||
const float &alt = _lla.altitude();
|
||||
|
||||
_wing_l.update_aero(v_B, _w_B, alt, roll_cmd * FLAP_MAX);
|
||||
_wing_r.update_aero(v_B, _w_B, alt, -roll_cmd * FLAP_MAX);
|
||||
_wing_l.update_aero(_v_B, _w_B, alt, roll_cmd * FLAP_MAX);
|
||||
_wing_r.update_aero(_v_B, _w_B, alt, -roll_cmd * FLAP_MAX);
|
||||
|
||||
_tailplane.update_aero(v_B, _w_B, alt, -pitch_cmd * FLAP_MAX, _T_MAX * throttle_cmd);
|
||||
_fin.update_aero(v_B, _w_B, alt, yaw_cmd * FLAP_MAX, _T_MAX * throttle_cmd);
|
||||
_fuselage.update_aero(v_B, _w_B, alt);
|
||||
_tailplane.update_aero(_v_B, _w_B, alt, -pitch_cmd * FLAP_MAX, thrust_for_prowash);
|
||||
_fin.update_aero(_v_B, _w_B, alt, yaw_cmd * FLAP_MAX, thrust_for_prowash);
|
||||
_fuselage.update_aero(_v_B, _w_B, alt);
|
||||
|
||||
// sum of aerodynamic forces
|
||||
const Vector3f Fa_B = _wing_l.get_Fa() + _wing_r.get_Fa() + _tailplane.get_Fa() + _fin.get_Fa() + _fuselage.get_Fa() -
|
||||
_KDV * v_B;
|
||||
_KDV * _v_B;
|
||||
_Fa_E = _q_E.rotateVector(Fa_B);
|
||||
|
||||
// aerodynamic moments
|
||||
@@ -393,11 +433,8 @@ void Sih::generate_fw_aerodynamics(const float roll_cmd, const float pitch_cmd,
|
||||
|
||||
void Sih::generate_ts_aerodynamics()
|
||||
{
|
||||
// velocity in body frame [m/s]
|
||||
const Vector3f v_B = _q.rotateVectorInverse(_v_apparent_N);
|
||||
|
||||
// the aerodynamic is resolved in a frame like a standard aircraft (nose-right-belly)
|
||||
Vector3f v_ts = _R_S2B.transpose() * v_B;
|
||||
Vector3f v_ts = _R_S2B.transpose() * _v_B;
|
||||
Vector3f w_ts = _R_S2B.transpose() * _w_B;
|
||||
float altitude = _lpos_ref_alt - _lpos(2);
|
||||
|
||||
@@ -406,17 +443,17 @@ void Sih::generate_ts_aerodynamics()
|
||||
|
||||
for (int i = 0; i < NB_TS_SEG; i++) {
|
||||
if (i <= NB_TS_SEG / 2) {
|
||||
_ts[i].update_aero(v_ts, w_ts, altitude, _u[5]*TS_DEF_MAX, _T_MAX * _u[1]);
|
||||
_ts[i].update_aero(v_ts, w_ts, altitude, _u[5]*TS_DEF_MAX, _T[1]);
|
||||
|
||||
} else {
|
||||
_ts[i].update_aero(v_ts, w_ts, altitude, -_u[4]*TS_DEF_MAX, _T_MAX * _u[0]);
|
||||
_ts[i].update_aero(v_ts, w_ts, altitude, -_u[4]*TS_DEF_MAX, _T[0]);
|
||||
}
|
||||
|
||||
Fa_ts += _ts[i].get_Fa();
|
||||
Ma_ts += _ts[i].get_Ma();
|
||||
}
|
||||
|
||||
const Vector3f Fa_B = _R_S2B * Fa_ts - _KDV * v_B; // sum of aerodynamic forces
|
||||
const Vector3f Fa_B = _R_S2B * Fa_ts - _KDV * _v_B; // sum of aerodynamic forces
|
||||
_Fa_E = _q_E.rotateVector(Fa_B);
|
||||
_Ma_B = _R_S2B * Ma_ts - _KDW * _w_B; // aerodynamic moments
|
||||
}
|
||||
@@ -842,15 +879,21 @@ int Sih::print_status()
|
||||
|
||||
} else if (_vehicle == VehicleType::FixedWing) {
|
||||
PX4_INFO("Fixed-Wing");
|
||||
PX4_INFO("propeller model:");
|
||||
_thruster[0].print_status();
|
||||
|
||||
} else if (_vehicle == VehicleType::TailsitterVTOL) {
|
||||
PX4_INFO("TailSitter");
|
||||
PX4_INFO("propeller model:");
|
||||
_thruster[0].print_status();
|
||||
PX4_INFO("aoa [deg]: %d", (int)(degrees(_ts[4].get_aoa())));
|
||||
PX4_INFO("v segment (m/s)");
|
||||
_ts[4].get_vS().print();
|
||||
|
||||
} else if (_vehicle == VehicleType::StandardVTOL) {
|
||||
PX4_INFO("Standard VTOL");
|
||||
PX4_INFO("pusher propeller model:");
|
||||
_thruster[0].print_status();
|
||||
|
||||
} else if (_vehicle == VehicleType::RoverAckermann) {
|
||||
PX4_INFO("Rover Ackermann");
|
||||
@@ -872,6 +915,8 @@ int Sih::print_status()
|
||||
(_R_N2E.transpose() * _Fa_E).print();
|
||||
PX4_INFO("Aerodynamic moments body frame (Nm)");
|
||||
_Ma_B.print();
|
||||
PX4_INFO("Thruster forces in body frame (N)");
|
||||
_T_B.print();
|
||||
PX4_INFO("Thruster moments in body frame (Nm)");
|
||||
_Mt_B.print();
|
||||
return 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (c) 2019-2025 PX4 Development Team. All rights reserved.
|
||||
* Copyright (c) 2019-2026 PX4 Development Team. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -40,19 +40,19 @@
|
||||
* Coriolis g Corporation - January 2019
|
||||
*/
|
||||
|
||||
// The sensor signals reconstruction and noise levels are from [1]
|
||||
// [1] Bulka E, and Nahon M, "Autonomous fixed-wing aerobatics: from theory to flight."
|
||||
// In 2018 IEEE International Conference on Robotics and Automation (ICRA), pp. 6573-6580. IEEE, 2018.
|
||||
// The aerodynamic model is from [2]
|
||||
// [2] Khan W, supervised by Nahon M, "Dynamics modeling of agile fixed-wing unmanned aerial vehicles."
|
||||
// McGill University (Canada), PhD thesis, 2016.
|
||||
// The quaternion integration are from [3]
|
||||
// [3] Sveier A, Sjøberg AM, Egeland O. "Applied Runge–Kutta–Munthe-Kaas Integration for the Quaternion Kinematics."
|
||||
// Journal of Guidance, Control, and Dynamics. 2019 Dec;42(12):2747-54.
|
||||
// The tailsitter model is from [4]
|
||||
// [4] Chiappinelli R, supervised by Nahon M, "Modeling and control of a flying wing tailsitter unmanned aerial vehicle."
|
||||
// McGill University (Canada), Masters Thesis, 2018.
|
||||
|
||||
/** The sensor signals reconstruction and noise levels are from [1]. The aerodynamic model is from [2].
|
||||
* The quaternion integration are from [3]. The tailsitter model is from [4]. The propeller models are from [5]
|
||||
* [1] Bulka E, and Nahon M, "Autonomous fixed-wing aerobatics: from theory to flight."
|
||||
* In 2018 IEEE International Conference on Robotics and Automation (ICRA), pp. 6573-6580. IEEE, 2018.
|
||||
* [2] Khan W, supervised by Nahon M, "Dynamics modeling of agile fixed-wing unmanned aerial vehicles."
|
||||
* McGill University (Canada), PhD thesis, 2016.
|
||||
* [3] Sveier A, Sjøberg AM, Egeland O. "Applied Runge–Kutta–Munthe-Kaas Integration for the Quaternion Kinematics."
|
||||
* Journal of Guidance, Control, and Dynamics. 2019 Dec;42(12):2747-54.
|
||||
* [4] Chiappinelli R, supervised by Nahon M, "Modeling and control of a flying wing tailsitter unmanned aerial vehicle."
|
||||
* McGill University (Canada), Masters Thesis, 2018.
|
||||
* [5] J.B. Brandt, R.W. Deters, G.K. Ananda, O.D. Dantsker, and M.S. Selig 2026, UIUC Propeller Database,
|
||||
* Vols 1-4, University of Illinois at Urbana-Champaign, Department of Aerospace Engineering, retrieved from https://m-selig.ae.illinois.edu/props/propDB.html.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <px4_platform_common/module.h>
|
||||
@@ -142,6 +142,7 @@ private:
|
||||
|
||||
// hard constants
|
||||
static constexpr uint16_t NUM_ACTUATORS_MAX = 9;
|
||||
static constexpr uint16_t NUM_DYN_THRUSTER = 2; // number of dynamic thruster model with advance ratio
|
||||
|
||||
// Ranging beacon simulation constants
|
||||
static constexpr uint8_t NUM_RANGING_BEACONS = 4;
|
||||
@@ -190,7 +191,7 @@ private:
|
||||
void send_dist_snsr(const hrt_abstime &time_now_us);
|
||||
void send_ranging_beacon(const hrt_abstime &time_now_us);
|
||||
void publish_ground_truth(const hrt_abstime &time_now_us);
|
||||
void generate_fw_aerodynamics(const float roll_cmd, const float pitch_cmd, const float yaw_cmd, const float thrust);
|
||||
void generate_fw_aerodynamics(const float roll_cmd, const float pitch_cmd, const float yaw_cmd, const float thrust_for_prowash);
|
||||
void generate_ts_aerodynamics();
|
||||
void generate_rover_ackermann_dynamics(const float throttle_cmd, const float steering_cmd, const float dt);
|
||||
void sensor_step();
|
||||
@@ -234,6 +235,7 @@ private:
|
||||
matrix::Vector3f _Mt_B{}; // thruster moments [Nm]
|
||||
matrix::Vector3f _Ma_B{}; // aerodynamic moments [Nm]
|
||||
matrix::Vector3f _w_B{}; // body rates in body frame [rad/s]
|
||||
matrix::Vector3f _v_B{}; // body frame velocity [m/s]
|
||||
|
||||
// Quantities in local navigation frame (NED, body-fixed)
|
||||
matrix::Vector3f _v_N{}; // velocity [m/s]
|
||||
@@ -257,6 +259,9 @@ private:
|
||||
matrix::Vector3f _lpos{}; // position in a local tangent-plane frame [m]
|
||||
|
||||
float _u[NUM_ACTUATORS_MAX] {}; // thruster signals
|
||||
float _T[NUM_DYN_THRUSTER] {}; // thruster forces (N)
|
||||
float _Q[NUM_DYN_THRUSTER] {}; // thruster torque (Nm)
|
||||
Thruster _thruster[NUM_DYN_THRUSTER] {}; // thruster objects
|
||||
|
||||
enum class VehicleType {Quadcopter, FixedWing, TailsitterVTOL, StandardVTOL, Hexacopter, RoverAckermann, First = Quadcopter, Last = RoverAckermann}; // numbering dependent on parameter SIH_VEHICLE_TYPE
|
||||
VehicleType _vehicle = VehicleType::Quadcopter;
|
||||
@@ -296,7 +301,7 @@ private:
|
||||
// parameters
|
||||
MapProjection _lpos_ref{};
|
||||
float _lpos_ref_alt;
|
||||
float _MASS, _T_MAX, _Q_MAX, _L_ROLL, _L_PITCH, _KDV, _KDW, _T_TAU;
|
||||
float _MASS, _T_MAX, _Q_MAX, _L_ROLL, _L_PITCH, _KDV, _KDW, _T_TAU, _F_T_MAX, _F_Q_MAX;
|
||||
matrix::Matrix3f _I; // vehicle inertia matrix
|
||||
matrix::Matrix3f _Im1; // inverse of the inertia matrix
|
||||
|
||||
@@ -326,6 +331,18 @@ private:
|
||||
(ParamFloat<px4::params::SIH_DISTSNSR_MAX>) _sih_distance_snsr_max,
|
||||
(ParamFloat<px4::params::SIH_DISTSNSR_OVR>) _sih_distance_snsr_override,
|
||||
(ParamFloat<px4::params::SIH_T_TAU>) _sih_thrust_tau,
|
||||
// forward propeller
|
||||
(ParamFloat<px4::params::SIH_F_T_MAX>) _sih_f_thrust_max,
|
||||
(ParamFloat<px4::params::SIH_F_Q_MAX>) _sih_f_torque_max,
|
||||
(ParamFloat<px4::params::SIH_F_CT0>) _sih_f_ct0,
|
||||
(ParamFloat<px4::params::SIH_F_CT1>) _sih_f_ct1,
|
||||
(ParamFloat<px4::params::SIH_F_CT2>) _sih_f_ct2,
|
||||
(ParamFloat<px4::params::SIH_F_CP0>) _sih_f_cp0,
|
||||
(ParamFloat<px4::params::SIH_F_CP1>) _sih_f_cp1,
|
||||
(ParamFloat<px4::params::SIH_F_CP2>) _sih_f_cp2,
|
||||
(ParamFloat<px4::params::SIH_F_DIA_INCH>) _sih_forward_diameter_inch,
|
||||
(ParamFloat<px4::params::SIH_F_RPM_MAX>) _sih_forward_rpm_max,
|
||||
(ParamInt<px4::params::BAT1_SOURCE>) _bat1_source,
|
||||
(ParamInt<px4::params::SIH_VEHICLE_TYPE>) _sih_vtype,
|
||||
(ParamFloat<px4::params::SIH_WIND_N>) _sih_wind_n,
|
||||
(ParamFloat<px4::params::SIH_WIND_E>) _sih_wind_e,
|
||||
|
||||
@@ -83,12 +83,14 @@ parameters:
|
||||
increment: 0.005
|
||||
SIH_T_MAX:
|
||||
description:
|
||||
short: Max propeller thrust force
|
||||
short: Max multicopter propeller thrust force
|
||||
long: |-
|
||||
This is the maximum force delivered by one propeller
|
||||
when the motor is running at full speed.
|
||||
|
||||
This value is usually about 5 times the mass of the quadrotor.
|
||||
|
||||
Refer to SIH_F_T_MAX for the thrust for FW, Tailsitter, and VTOL pusher.
|
||||
type: float
|
||||
default: 5.0
|
||||
unit: N
|
||||
@@ -97,12 +99,14 @@ parameters:
|
||||
increment: 0.5
|
||||
SIH_Q_MAX:
|
||||
description:
|
||||
short: Max propeller torque
|
||||
short: Max multicopter propeller torque
|
||||
long: |-
|
||||
This is the maximum torque delivered by one propeller
|
||||
when the motor is running at full speed.
|
||||
|
||||
This value is usually about few percent of the maximum thrust force.
|
||||
|
||||
Refer to SIH_F_Q_MAX for the propeller torque for FW, Tailsitter, and VTOL pusher.
|
||||
type: float
|
||||
default: 0.1
|
||||
unit: Nm
|
||||
@@ -281,3 +285,87 @@ parameters:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
decimal: 1
|
||||
SIH_F_T_MAX:
|
||||
description:
|
||||
short: Forward thruster max thrust (N)
|
||||
long: |-
|
||||
This is used for the Fixed-Wing, Tailsitter, or pusher of the Standard VTOL
|
||||
if SIH_F_CT0 <= 0.
|
||||
If SIH_F_CT0 > 0, propeller model with advance ratio J is used
|
||||
and this parameter value is overridden at simulation startup.
|
||||
type: float
|
||||
default: 2.0
|
||||
unit: N
|
||||
min: 0.0
|
||||
decimal: 3
|
||||
SIH_F_Q_MAX:
|
||||
description:
|
||||
short: Forward thruster max torque (Nm)
|
||||
long: |-
|
||||
This is used for the Fixed-Wing, Tailsitter, or pusher of the Standard VTOL
|
||||
if SIH_F_CP0 <= 0.
|
||||
If SIH_F_CP0 > 0, propeller model with advance ratio J is used
|
||||
and this parameter value is overridden at simulation startup.
|
||||
type: float
|
||||
default: 0.0165
|
||||
unit: Nm
|
||||
min: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CT0:
|
||||
description:
|
||||
short: Forward thruster static thrust coefficient
|
||||
type: float
|
||||
default: 0.0
|
||||
min: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CT1:
|
||||
description:
|
||||
short: Forward thruster thrust coefficient 1
|
||||
long: CT(J) = CT0 + CT1*J + CT2*J^2
|
||||
type: float
|
||||
default: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CT2:
|
||||
description:
|
||||
short: Forward thruster thrust coefficient 2
|
||||
long: CT(J) = CT0 + CT1*J + CT2*J^2
|
||||
type: float
|
||||
default: 0.0
|
||||
max: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CP0:
|
||||
description:
|
||||
short: Forward thruster static power coefficient
|
||||
type: float
|
||||
default: 0.0
|
||||
min: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CP1:
|
||||
description:
|
||||
short: Forward thruster power coefficient 1
|
||||
long: CP(J) = CP0 + CP1*J + CP2*J^2
|
||||
type: float
|
||||
default: 0.0
|
||||
decimal: 3
|
||||
SIH_F_CP2:
|
||||
description:
|
||||
short: Forward thruster power coefficient 2
|
||||
long: CP(J) = CP0 + CP1*J + CP2*J^2
|
||||
type: float
|
||||
default: 0.0
|
||||
max: 0.0
|
||||
decimal: 3
|
||||
SIH_F_DIA_INCH:
|
||||
description:
|
||||
short: Forward thruster propeller diameter in inches
|
||||
type: float
|
||||
default: 0.1
|
||||
min: 0.1
|
||||
decimal: 1
|
||||
SIH_F_RPM_MAX:
|
||||
description:
|
||||
short: Forward thruster max RPM
|
||||
type: float
|
||||
default: 6000.0
|
||||
min: 0.1
|
||||
decimal: 1
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace i2cdetect
|
||||
|
||||
int detect(int bus)
|
||||
{
|
||||
printf("Scanning I2C bus: %d\n", bus);
|
||||
PX4_INFO("Scanning I2C bus: %d", bus);
|
||||
|
||||
int ret = PX4_ERROR;
|
||||
|
||||
@@ -62,15 +62,17 @@ int detect(int bus)
|
||||
return PX4_ERROR;
|
||||
}
|
||||
|
||||
printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n");
|
||||
// Line buffer for building up output
|
||||
char line[80];
|
||||
int pos = 0;
|
||||
|
||||
PX4_INFO(" 0 1 2 3 4 5 6 7 8 9 a b c d e f");
|
||||
|
||||
for (int i = 0; i < 128; i += 16) {
|
||||
printf("%02x: ", i);
|
||||
pos = snprintf(line, sizeof(line), "%02x: ", i);
|
||||
|
||||
for (int j = 0; j < 16; j++) {
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
uint8_t addr = i + j;
|
||||
|
||||
unsigned retry_count = 0;
|
||||
@@ -115,14 +117,14 @@ int detect(int bus)
|
||||
} while (retry_count++ < retries);
|
||||
|
||||
if (found) {
|
||||
printf("%02x ", addr);
|
||||
pos += snprintf(line + pos, sizeof(line) - pos, "%02x ", addr);
|
||||
|
||||
} else {
|
||||
printf("-- ");
|
||||
pos += snprintf(line + pos, sizeof(line) - pos, "-- ");
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
PX4_INFO("%s", line);
|
||||
}
|
||||
|
||||
px4_i2cbus_uninitialize(i2c_dev);
|
||||
|
||||
Reference in New Issue
Block a user