diff --git a/.gitignore b/.gitignore index e51f44b..65e0d99 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ examples/Manifest-v1.11.toml test/Manifest-v1.11.toml build/ output/winch_curve.pdf +LocalPreferences.toml diff --git a/CHANGELOG.md b/CHANGELOG.md index be4c5e5..75e2419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,29 +1,22 @@ -### WinchControllers v0.6.5 (unreleased) -#### Fixed -- `WinchPosController` sets the anti-windup tracking time of its speed PI to - `Tt = winch_speed_ti`. It was unset, so `DiscretePIDs` used its 10 s fallback, and after - a long torque saturation the integrator unwound five times slower than it wound up. - Changes the output only during and after a saturation at `winch_torque_limit`. - -### WinchControllers v0.6.4 2026-09-28 -#### Added +## WinchControllers v0.6.4 2026-09-28 +### Added - an Acknowledgements section in the README, crediting the MERIDIONAL project (EU Horizon Europe grant agreement no. 101084216) -#### Changed +### Changed - `Manifest-v1.13.toml.default` re-resolved with Julia 1.13.1; its Pkg also hashes `[sources]`, so a manifest from 1.13.0 warned that the project had changed -### WinchControllers v0.6.3 2026-09-26 -#### Changed +## WinchControllers v0.6.3 2026-09-26 +### Changed - `[compat]` accepts KiteUtils 0.13 as well as 0.11.1 and 0.12 -#### Removed +### Removed - `WCSettings.force_limit_tau_rise`; the force low-pass of the soft limiter is now always symmetric (`force_limit_tau`). `LowPass` still supports `tau_rise`. -### WinchControllers v0.6.2 2026-09-24 -#### Added +## WinchControllers v0.6.2 2026-09-24 +### Added - acceleration feed-forward in `winch_position_torque!`: new keyword `inertia` (drum inertia seen from the motor) and `WinchPosController.acc_ff`, set from the new `WCSettings.winch_acc_ff`, add `acc_ff·inertia·a_ref·gear_ratio/drum_radius`, @@ -39,7 +32,7 @@ - support for Julia 1.13 in `bin/install`, with the default manifest `Manifest-v1.13.toml.default` - a testset for the acceleration feed-forward in `test/test_torque_controllers.jl` -#### Changed +### Changed - `AWE_TRIM_F_MAX` (the AWETrim `f_max`) lowered from 8000 N to 7200 N - `data/wc_settings_soft_lfc.yaml`: `f_low` 350 → 700 N, `f_high` 8000 → 7200 N, `reel_in_beta` 11 → 20, and `v_sat_beta: 10.0` @@ -49,8 +42,8 @@ - compat for `julia`, `LinearAlgebra`, `Pkg` and `Test` extended to 1.13 - `scripts/build_docu.jl` installs `LiveServer` in the global environment if it is missing -### WinchControllers v0.6.1 2026-09-03 -#### Added +## WinchControllers v0.6.1 2026-09-03 +### Added - soft force limiting for REEL_OUT mode: `WCSettings.force_limit` (`"hard"`/`"soft"`) replaces the `UpperForceController` with `calc_vro_soft`, a continuous law with no threshold or hand-over @@ -74,12 +67,12 @@ - `test/test_soft_limit.jl`, covering `calc_vro_soft`, `soft_min`, the `LowPass` filter and the `WinchController` validation errors - documentation of soft force limiting in `docs/src/settings.md` -#### Changed +### Changed - `f_err(logger)` returns `0.0` instead of erroring when every logged force error is `NaN` (e.g. under `soft_lfc`, where neither force controller ever activates) -### WinchControllers v0.6.0 2026-08-16 -#### Added +## WinchControllers v0.6.0 2026-08-16 +### Added - torque controllers, moved here from V3Kite.jl: `WinchPosController` (cascaded length/speed control) and `WinchForceController` (compliant force mode), with `winch_position_torque!`, `winch_force_torque!`, `force_to_torque` and @@ -93,12 +86,12 @@ the saturation/rate-limiting of `winch_position_torque!` and the `f_lpf` initialization/force floor of `winch_force_torque!` - `build/` to `.gitignore` -#### Changed +### Changed - `WCSettings.dt` defaults to `NaN` instead of `0.02`, so a caller that forgets to set it fails loudly instead of silently running at the wrong timestep -### WinchControllers v0.5.6 2026-08-14 -#### Added +## WinchControllers v0.5.6 2026-08-14 +### Added - REEL_OUT winch-controller mode: `WCSettings.mode` (`"piecewise"`/`"reelout"`), dispatched in `calc_vro`; `test = true` still selects `"reelout"` for backwards compatibility - the examples `test_reelout.jl` (bench-test plot of the REEL_OUT law) and `test/test_reelout.jl` @@ -108,42 +101,42 @@ - `bin/install` script - default manifests `Manifest-v1.11.toml.default` and `Manifest-v1.12.toml.default` - CI badge in `README.md` -#### Changed +### Changed - switched from `ControlPlots` to `MakieControlPlots` throughout `examples/`, `test/`, `mwes/` and the `src/` docstrings - `bin/run_julia`: forwards arguments to `julia` and `cd`s to the repo root when invoked from `bin/` - improved `bin/install` - CI workflow fixes -### WinchControllers v0.5.5 2026-03-23 -#### Added +## WinchControllers v0.5.5 2026-03-23 +### Added - `CITATION.cff` file - `.markdownlint` configuration file -### WinchControllers v0.5.4 2026-03-03 -#### Added +## WinchControllers v0.5.4 2026-03-03 +### Added - the package `RobustAndOptimalControl` - the example `stability_ufc.jl` which tests the stability of the upper force controller -#### Changed +### Changed - bump KiteUtils to 0.11.1 - use subprojects instead of TestEnv - fix warnings -### WinchControllers v0.5.3 2025-05-31 -#### Added +## WinchControllers v0.5.3 2025-05-31 +### Added - the functions `get_v_set()`, `get_f_err()` - the script `autotune.jl`, using the **NOMAD** optimizer - added a documentation page for the autotuning feature - added the function `install_examples()` and updated the docu accordingly -### WinchControllers v0.5.2 -#### Added +## WinchControllers v0.5.2 2025-05-29 +### Added - the script `test_components.jl` -#### Changed +### Changed - export `saturate()` -### WinchControllers v0.5.1 2025-05-28 -#### Added +## WinchControllers v0.5.1 2025-05-28 +### Added - all public functions document - add page `Performance Indicators` to documentation - add page `Tests` to documentation @@ -151,7 +144,7 @@ - add `menu.jl` to the folder examples - the functions `f_err()`, `v_err()` and `gamma()` to calculate the performance indicators of the winch controller based on the log file of a test case -#### Changed +### Changed - reduced `df_high` in `wc_settings.yaml` to reduce oscillations - all examples are making use of `wc_settings.yaml` now - the function `get_v_err` returns now `NaN` instead of zero when the speed controller is inactive diff --git a/bin/release b/bin/release index c46275f..15bc273 100755 --- a/bin/release +++ b/bin/release @@ -67,22 +67,22 @@ fi # --- top CHANGELOG.md entry must match Project.toml's version -------------- # Line-number based, not "the header is line 1": robust even if this file -# ever grows a leading title line before the first "### " entry. -mapfile -t header_lines < <(grep -n '^### ' CHANGELOG.md | cut -d: -f1 | head -2) +# ever grows a leading title line before the first "## " entry. +mapfile -t header_lines < <(grep -n '^## ' CHANGELOG.md | cut -d: -f1 | head -2) if [[ ${#header_lines[@]} -eq 0 ]]; then - echo "Error: no '### ' entry found in CHANGELOG.md." >&2 + echo "Error: no '## ' entry found in CHANGELOG.md." >&2 exit 1 fi first=${header_lines[0]} second=${header_lines[1]:-$(($(wc -l < CHANGELOG.md) + 1))} header=$(sed -n "${first}p" CHANGELOG.md) -if [[ ! "$header" =~ ^\#\#\#\ WinchControllers\ v${version//./\\.}(\ |$) ]]; then +if [[ ! "$header" =~ ^\#\#\ WinchControllers\ v${version//./\\.}(\ |$) ]]; then echo "Error: CHANGELOG.md's top entry ('$header') does not match" >&2 echo " Project.toml's version ($version). Write the changelog entry first." >&2 exit 1 fi -# Body of the top entry: everything between the first and second "### " +# Body of the top entry: everything between the first and second "## " # headers (or end of file if there is no second one). notes=$(sed -n "$((first + 1)),$((second - 1))p" CHANGELOG.md) diff --git a/changelog.d/winch-pos-anti-windup.md b/changelog.d/winch-pos-anti-windup.md new file mode 100644 index 0000000..d0361b1 --- /dev/null +++ b/changelog.d/winch-pos-anti-windup.md @@ -0,0 +1,2 @@ +### Fixed +- `WinchPosController` sets the anti-windup tracking time of its speed PI to `Tt = winch_speed_ti`. It was unset, so `DiscretePIDs` used its 10 s fallback, and after a long torque saturation the integrator unwound five times slower than it wound up. Changes the output only during and after a saturation at `winch_torque_limit`.