-
-
Notifications
You must be signed in to change notification settings - Fork 19.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ARC_SEGMENTS_PER_SEC for finer G2/G3 arcs #16510
Conversation
Thanks for this enhancement. I was contemplating how to decide the best segment length for any given arc and how to deal with small circles losing detail. A segments-per-second limit is a good approach that can be tailored for what the machine can handle. |
Since we usually use the segments-per-second value for settings the option is now called… |
#define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle | ||
#define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections | ||
#define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment | ||
#define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a logic or linguistic error.
#define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment
-> No segment can be smaller than 1 mm!
#define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle
-> When the circumference of the circle is smaller than 24 mm print a circle with not smaller than that - because the segments cant be smaller then 1mm.
One of this defines is unlikely to be a minimum. Else arcs with small diameters are impossible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MIN_ARC_SEGMENTS overrides MM_PER_ARC_SEGMENT to make possibly shorter segments. Personally I don't like MIN_ARC_SEGMENTS because it is trying to enforce smoothness irrespective of radius or feed rate, and it can generate excessive resolution that causes stalls.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So MM_PER_ARC_SEGMENT
isn't a minimum but a maximum segment length.
And is that is right now, there is a conflict with:
//#define ARC_SEGMENTS_PER_SEC 50 // Use feedrate to choose segment length (with MM_PER_ARC_SEGMENT as the minimum)
If it's a maximum as well as a minimum there is no other possible value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With MIN_STEPS_PER_SEGMENT
we already have a lower limit for the length of one segment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MM_PER_ARC_SEGMENT, when not using ARC_SEGMENTS_PER_SEC, is the 'default' segment length and it can be shorter if MIN_ARC_SEGMENTS implies more smoothness than MM_PER_ARC_SEGMENT provides.
When using ARC_SEGMENTS_PER_SEC, the 'usual' behavior is for segment length to be determined by the feed rate but for very low feed rates the segments can become extremely short. If the feed rate is low enough that the segments are shorter than MM_PER_ARC_SEGMENT then it uses MM_PER_ARC_SEGMENT instead, so in that sense it is a minimum on the speed-derived segment length. But the MIN_ARC_SEGMENTS is still in effect, so a very fast small circle might be a hexagon according to ARC_SEGMENTS_PER_SEC, and MIN_ARC_SEGMENTS of 7 or more would force a smoother curve and the segments would be made shorter (and the segment rate would be higher than ARC_SEGMENTS_PER_SEC).
Not all combinations of these settings make sense, for example a large MM_PER_ARC_SEGMENT and a high rate of segments per second would mean the MM_PER_ARC_SEGMENT would almost always take precedence and the segments per second has no effect. A large value for MIN_ARC_SEGMENTS would mean that small circles will ignore feed rate or (otherwise) minimum resolution and proceed with possibly extremely fine resolution that has no benefit.
Yes MIN_STEPS_PER_SEGMENT causes small segments to collapse, so there is no real benefit resolution-wise for MM_PER_ARC_SEGMENT to be much less than that.
I think a combination of settings that makes sense is for ARC_SEGMENTS_PER_SEC to be a value that the CPU can keep up with comfortably, and for MM_PER_ARC_SEGMENT to be a small value similar to the length that corresponds to MIN_STEPS_PER_SEGMENT. And MIN_ARC_SEGMENTS should not be used because ARC_SEGMENTS_PER_SEC will already provide the best smoothness that's reasonable at a given feed rate.
const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); | ||
|
||
#ifdef ARC_SEGMENTS_PER_SEC | ||
float seg_length = scaled_fr_mm_s * _RECIP(ARC_SEGMENTS_PER_SEC); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Usage of private-styled macro _RECIP from another module.
I have compilation fail here:
Compiling .pio\build\LPC1768\src\src\gcode\motion\G2_G3.cpp.o Marlin\src\gcode\motion\G2_G3.cpp: In function 'void plan_arc(const xyze_pos_t&, const ab_float_t&, uint8_t)': Marlin\src\gcode\motion\G2_G3.cpp:109:41: error: '_RECIP' was not declared in this scope float seg_length = scaled_fr_mm_s * _RECIP(ARC_SEGMENTS_PER_SEC); ^~~~~~ *** [.pio\build\LPC1768\src\src\gcode\motion\G2_G3.cpp.o] Error 1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to use RECIPROCAL() macro instead?
* Don't test certain changes * Reset runout.ran_out on resume (MarlinFirmware#16230) * Step timing cleanup and rounding fix (MarlinFirmware#16258) * Add MRR_ESPA/_ESPE (ESP32) boards (MarlinFirmware#16238) * Add Ender-5 Pro config (MarlinFirmware#16221) * Add FLYBOARD (STM32F407ZG) (MarlinFirmware#16257) * Fix STM32 flush of TX (used by UBL) (MarlinFirmware#16197) * Flash leveling (for some STM32) (MarlinFirmware#16174) * Some ESP32 patches (MarlinFirmware#16297) * MKS SGen-L pins EEBF or EFBF scheme (MarlinFirmware#16296) * Add Rumba32 support for PIO (MarlinFirmware#16202) * MKS Robin 2 (STM32F407ZE) base support (MarlinFirmware#16270) * Update Czech language (MarlinFirmware#16305) * Sync SKR E3 configs (MarlinFirmware#16301) * Add NOZZLE_AS_PROBE (no probe offsets) (MarlinFirmware#15929) * Update README with status badge, etc. * Split up HAL items * Update mfpub for current MarlinDocumentation * Fix Max7219 with 256 or more cels * Fix games menu back item, titles * Update comments re: NOZZLE_AS_PROBE * Fix min limit for acc, feed, jerk (MarlinFirmware#16416) * Improve Renkforce configs (MarlinFirmware#16417) * Permit ENDSTOP_INTERRUPTS_FEATURE on more STM32 (MarlinFirmware#16412) * Improve STEVAL_3DP001V1 and future STEVAL_* support (MarlinFirmware#16404) * MKS Robin ILI9328 TFT support (MarlinFirmware#16401) * Disable PIDTEMPBED for SKR Mini E3 (MarlinFirmware#16396) * Return from loop() on non-AVR boards (MarlinFirmware#16390) * Refactor TMC-related macros and sanity checks (MarlinFirmware#16384) * Add FILAMENT_UNLOAD_PURGE_FEEDRATE (MarlinFirmware#16372) * Fix some DOGM warnings (MarlinFirmware#16363) * Fix warnings in stepper.cpp (MarlinFirmware#16364) * Fix PrintrBoard build (ignore TMC libraries) (MarlinFirmware#16346) (In future try to get Teensy processors better supported by `TMCStepper`.) * Clean up trailing whitespace * PWM pin not needed for Neopixel brightness / submenu (MarlinFirmware#16345) * Misc patches preceding DGUS PR * Fix Visual Micro "Arduino IDE for Visual Studio" support (MarlinFirmware#16418) * Update Russian language (MarlinFirmware#16426) * STM32F1: Fix misleading indent / nullptr on FSMC (MarlinFirmware#16431) * Z-offset edit precision based on value limits (MarlinFirmware#16425) * Add Ender-5 leadscrew README (MarlinFirmware#16424) * Add motherboard BIGTREE_SKR_V1.4_TURBO (MarlinFirmware#16374) * Enable MULTI_NOZZLE_DUPLICATION for BIBO (MarlinFirmware#16435) * Touch UI: Fix UBL mesh value editing (MarlinFirmware#16432) * Sidewinder X1 Config Updates (MarlinFirmware#16315) * Add Leapfrog Xeed 2015 support (MarlinFirmware#16400) * Improve JGAurora A1/A5S touch buttons (MarlinFirmware#16394) * Standardize drivers.h values, add class indirection (MarlinFirmware#16448) * Update Russian language (MarlinFirmware#16440) * BTT002: Add runout, PLR, and RGB pins (MarlinFirmware#16442) * Pins debugging AVR serial pins (MarlinFirmware#16437) * Fix MIN_PROBE_EDGE bug in default ABL G29 (MarlinFirmware#16367) * Temporary CI fix for STM32 * Use a default monitor_speed of 250000 * MSG_WATCH => MSG_INFO_SCREEN * Add EVNOVO (Artillery) Genius config (MarlinFirmware#16320) * Fixed Creality CR-20 Pro configuration example (MarlinFirmware#16332) * FYSETC F6 v1.4 board support (MarlinFirmware#16321) * Add example configs. Expand custom menu. (MarlinFirmware#16286) - Anet E10 - Geeetech D200 - Geeetech M201 - JGAurora Magic - MakerFarm Pegasus 12 * Fix Ender-2 display pins, add BTN_ENC (MarlinFirmware#16349) * Update and fix DGUS (MarlinFirmware#16317) * Fix serials available on SKR Pro 1.1 (MarlinFirmware#16439) * Fix daily date bump action * Action to check PRs * Update maintainer funding links * Skip build tests on forks * Update git helper usage * Fix EEPROM error with EXTRUDERS == 0 (MarlinFirmware#16464) * Fix M115 cap with EXTRUDERS == 0 (MarlinFirmware#16459) * Add option to invert joystick axes (MarlinFirmware#16466) * Update Russian language (MarlinFirmware#16461) * Fix permyriad progress bar (MarlinFirmware#16460) * Improve French language (UBL) (MarlinFirmware#16453) * Followup to EEPROM patch (MarlinFirmware#16470) * Remove extra UBL map edit menu item (MarlinFirmware#16451) * Fix unused var warning (MarlinFirmware#16467) * Update U20 config to help UBL toggle (MarlinFirmware#16471) * Move auto_build.py to 'vscode' folder * Fix MKS_SGEN sanity check (MarlinFirmware#16501) * Fix EEPROM array size bug (MarlinFirmware#16475) * Fix SKR Pro BLTouch conflicting timers (MarlinFirmware#16499) * Provide some missing Arduino macros (MarlinFirmware#16497) * Fix Change Filament menu item with runout (MarlinFirmware#16485) * Fix LCD for Tevo Tornado (MarlinFirmware#16474) * Update workflow skip condition * Add menu item Tune > Advance K (MarlinFirmware#16488) * Extend SERIAL_CHAR to take multiple arguments * Code style and comment tweaks * Correct ESP32 CPU speed in README (MarlinFirmware#16472) * Add ARC_SEGMENTS_PER_SEC for finer G2/G3 arcs (MarlinFirmware#16510) * Fix compile error w/out LCD (MarlinFirmware#16502) * Add Probe Offsets menu (MarlinFirmware#16444) * Fix Probe Offset XY edit items (et Français) (MarlinFirmware#16523) * Update Russian language (MarlinFirmware#16522) * [cron] Bump distribution date (2020-01-10) * Prevent Z misaligment on tool change (MarlinFirmware#16518) * Update Italian language (MarlinFirmware#16527) * ESP3d integration for ESP32 (MarlinFirmware#16515) * [cron] Bump distribution date (2020-01-11) * Migrate actions to default (2.0.x) branch * Only constrain motion on homed axes (MarlinFirmware#16533) Co-authored-by: Scott Lahteine <[email protected]> * Fix probeless delta build (MarlinFirmware#16537) * Use RECIPROCAL macro (not _RECIP) (MarlinFirmware#16530) * [cron] Bump distribution date (2020-01-12) * Restore test_builds action to bugfix * Update auto_build.py paths for Atom/Sublime * [cron] Bump distribution date (2020-01-13) * Add GTM32 (STM32F103VET6) environment (MarlinFirmware#16454) * Power options formatting * Geeetech G2Pro configuration (MarlinFirmware#16553) * Fix Linux upload path detection (MarlinFirmware#16514) * Add SERVO, TONE timers to variant for better STEVAL_3DP001V1 support (MarlinFirmware#16538) * Clean up whitespace * [cron] Bump distribution date (2020-01-14) * Improved STMicro L64XX stepper driver support (MarlinFirmware#16452) * Make lcd_power_loss_recovery_cancel exportable * Fix PLR cancel with ExtUI (MarlinFirmware#16556) * Bring MP_SCARA config up to date * Fix Fysetc S6 FLASH_PAGE_SIZE and test build (MarlinFirmware#16560) * [cron] Bump distribution date (2020-01-15) * Update more configs * Move configurations to a separate repo * Fix build error with unsupported reset flags (MarlinFirmware#16562) * Steval_3DP001V1 timers, analog inputs, etc. (MarlinFirmware#16565) * Use Flash EEPROM on BTT002 (MarlinFirmware#16558) * Get test configs from GitHub * Fix typo * Nikon IR support for time lapse photos (MarlinFirmware#16539) * Adjustable ADC debounce delay (MarlinFirmware#16264) * [cron] Bump distribution date (2020-01-16) * STM32 RODATA LENGTH (MarlinFirmware#16580) * Fix I2C address of MCP4728 on LPC176x (MarlinFirmware#16578) * Fix GTM32 environment (to prevent a crash) * Fix some warnings, Melzi pins * Move macros to stepper/indirection * Fix TOUCH_UI_FTDI_EVE bugs (MarlinFirmware#16540) * ESP32 HAL: Fix random pauses during prints (MarlinFirmware#16548) * [cron] Bump distribution date (2020-01-17) * STM32 soft SPI. STEVAL_3DP001V1 SD read. M906 tweaks. (MarlinFirmware#16579) * Clean up HAL ADC, old test scripts * Adjust GTM32 build flags (MarlinFirmware#16582) * Shared SPI sanity check (MarlinFirmware#16581) * More CI test updates * Update FYSETC S6 pins (MarlinFirmware#16559) * PINDA v2 temperature sensor / compensation (MarlinFirmware#16293) * [cron] Bump distribution date (2020-01-18) * Allow RRW Keypad with any LCD * [cron] Bump distribution date (2020-01-19) * [cron] Bump distribution date (2020-01-20) * Fix M112 with Emergency Parser * Simplify TMC monitor code * Updates for L64XX * Function-like macros * Use bool in pin compare * Patch for _STEP_INIT * Simplify a drivers.h macro (MarlinFirmware#16589) * SAMD51: ADC for probe temperature compensation (MarlinFirmware#16596) * Update FYSETC S6 Peripheral Pins (MarlinFirmware#16593) * Update BTT002 pins (MarlinFirmware#16591) * Reset shutdown timer on M85 (MarlinFirmware#16587) * AVR sanity check for MONITOR_DRIVER_STATUS with SW Serial (MarlinFirmware#16421) * STEVAL_3DP001V1: Easier Serial2 (for WIFI interface) (MarlinFirmware#16599) * Fix Greek language string (MarlinFirmware#16601) * Quad Z stepper support (MarlinFirmware#16277) * LPC1768: Allow I2C master channel override (MarlinFirmware#16584) * Move steps/mm out of slim menus (MarlinFirmware#16603) * Fix CHAMBER_MAXTEMP security margin (MarlinFirmware#16600) * L64xx M906 Fix status variable, formatting (MarlinFirmware#16597) * Provide methods for M420 + MBL (MarlinFirmware#16602) * [cron] Bump distribution date (2020-01-21) * Fix STM401/4xx/STM32F7xx timers, STEVAL_3DP001V1 warning (MarlinFirmware#16621) * Override for LPC1768 u8g/digipot I2C master ID (MarlinFirmware#16622) * Release UI on G26 priming timeout (MarlinFirmware#16449) * Add HMS434 V15 ATSAM board (MarlinFirmware#16620) * Tweak some config spacing * G12 defaults per tool. Event G-code for post-toolchange (MarlinFirmware#16554) * Arc segment radius scaling (MarlinFirmware#16551) * Update mfdoc, mfpub * [cron] Bump distribution date (2020-01-22) * Tweak mfpub stashing * [cron] Bump distribution date (2020-01-23) * Enable use of latest TMCStepper on MKS Robin Nano (MarlinFirmware#16652) * [cron] Bump distribution date (2020-01-24) * Convert chars only for enabled languages * Extra debugging for leveling on/off * Bring configs and drivers.h up to date * Duet Smart Effector support (MarlinFirmware#16641) * BigTreeTech GTR V1.0 / Support 8 extruders, heaters, temp sensors, fans (MarlinFirmware#16595) * [cron] Bump distribution date (2020-01-26) * Fix DELTA_CALIBRATION_MENU recursive call (MarlinFirmware#16656) * Fix MKS Base + Digipot compile error (MarlinFirmware#16636) * Add ESP3DLib idletask entry point (MarlinFirmware#16658) * Fix Serial defines for M43 on AVR (MarlinFirmware#16649) * Fix HOMING_BACKOFF_MM for DELTA (MarlinFirmware#16657) * Clean up PID language defines * More 8 extruder defines * Update Slovak language (MarlinFirmware#16646) * Fix M43 timer report on AVR (MarlinFirmware#16645) * Fix Spanish (swapped BLTouch strings) (MarlinFirmware#16637) * SKR 1.3 sensorless endstops hack (MarlinFirmware#16659) * Fix PID F menu label * [cron] Bump distribution date (2020-01-27) * Preserve CWD for write/remove file (MarlinFirmware#16667) * Rename some temperature members * Fix Trigorilla 1.4 limit switches See MarlinFirmware#16612 * Fix serial port redirection (index ≠ port num) (MarlinFirmware#16687) * G60/G61 Position Save/Restore (MarlinFirmware#16557) * Remove extraneous G60/G61 lines * Fix Manual Bed Leveling with multiple extruders (MarlinFirmware#16688) * [cron] Bump distribution date (2020-01-28) * Prevent SD access from resetting ESP32 (MarlinFirmware#16690) * [cron] Bump distribution date (2020-01-29) * Fix Toolchange (!no_move) return to status (MarlinFirmware#16699) * [cron] Bump distribution date (2020-01-30) * Cleanup of old includes, add comments * Fix HAS_FAN macro (MarlinFirmware#16717) * Fix probe temp calibration (MarlinFirmware#16718) * Support for E4d@BOX mainboard (MarlinFirmware#16716) * Fix missing string for M48 build (MarlinFirmware#16708) * Fix G60/G61 slots > 8 and compile error (MarlinFirmware#16715) * Move L64XX index_to_axis to progmem (MarlinFirmware#16697) * Refactor heater watch, job timer auto-start (MarlinFirmware#16725) * Auto assign DIAG pins for multi-endstop (MarlinFirmware#16723) * Tweak G60/G61 slots * Fix compile error in SdVolume on ESP32 (MarlinFirmware#16728) * Simultaneous use of rotary encoder and touch buttons (MarlinFirmware#16729) * Set up DIAG endstops for BTT SKR 1.4 / 1.4 Turbo (MarlinFirmware#16727) * Extend RX/TX pins for up to 8 extruders * Fix up, improve endstop pin auto-assignment Followup for MarlinFirmware#16723 * (21) PT100 for MCUs with 3.3v logic (MarlinFirmware#16731) * [cron] Bump distribution date (2020-01-31) * Add sanity-check for new Advanced Pause option Followup to MarlinFirmware#16372 * Include macros for delta ABC * Update Russian language (MarlinFirmware#16745) * Fix BTT SKR 1.4 extra endstop pins (MarlinFirmware#16738) * Option for Trigorilla 1.4 with add-on endstops board (MarlinFirmware#16737) * Consistent M112 with Emergency Parser (MarlinFirmware#16747) * Improve mfadd helper script - Use the original branch name if none is supplied - Set the remote tracking to the source - Accept User/Branch or User:Branch syntax * Clean up i2c encoder, sanitize serial * Misc cleanup, whitespace * Encapsulate probe as singleton class (MarlinFirmware#16751) * G34 automatic point assignment (MarlinFirmware#16473) * Fix Temperature::over_autostart_threshold (MarlinFirmware#16749) * Update Russian language (MarlinFirmware#16750) * Fix CURRENT_STEP_DOWN compile error * Drop obsolete SD special char handling See MarlinFirmware#14035 * Probe singleton patch Followup to MarlinFirmware#16751 * Fix RGB / Neopixel white color bug See MarlinFirmware#16752 * Suppress a compile warning * More 8-extruder fixups Co-authored-by: Scott Lahteine <[email protected]> Co-authored-by: Tanguy Pruvot <[email protected]> Co-authored-by: Jason Smith <[email protected]> Co-authored-by: Luc <[email protected]> Co-authored-by: thisiskeithb <[email protected]> Co-authored-by: FLYmaker <[email protected]> Co-authored-by: randellhodges <[email protected]> Co-authored-by: ferengi82 <[email protected]> Co-authored-by: Luu Lac <[email protected]> Co-authored-by: petrzjunior <[email protected]> Co-authored-by: InsanityAutomation <[email protected]> Co-authored-by: Giuliano Zaro <[email protected]> Co-authored-by: Dirk O. Kaar <[email protected]> Co-authored-by: Pascal de Bruijn <[email protected]> Co-authored-by: Bob Kuhn <[email protected]> Co-authored-by: Alexander Gavrilenko <[email protected]> Co-authored-by: swilkens <[email protected]> Co-authored-by: Lino Barreca <[email protected]> Co-authored-by: rado79 <[email protected]> Co-authored-by: Acenotass <[email protected]> Co-authored-by: ellensp <[email protected]> Co-authored-by: Walt Sorensen <[email protected]> Co-authored-by: yedey <[email protected]> Co-authored-by: George Fu <[email protected]> Co-authored-by: Vertabreaker <[email protected]> Co-authored-by: greppp <[email protected]> Co-authored-by: Jamie <[email protected]> Co-authored-by: Justin <[email protected]> Co-authored-by: ManuelMcLure <[email protected]> Co-authored-by: 0r31 <[email protected]> Co-authored-by: Alejandro Aguilera <[email protected]> Co-authored-by: meponderR <[email protected]> Co-authored-by: Mehdi Beyk Mohamadi <[email protected]> Co-authored-by: FlyingSamson <[email protected]> Co-authored-by: Ryan V1 <[email protected]> Co-authored-by: David Klasinc <[email protected]> Co-authored-by: gjdodd <[email protected]> Co-authored-by: Dennis <[email protected]> Co-authored-by: felixstorm <[email protected]> Co-authored-by: vivian-ng <[email protected]> Co-authored-by: tompe-proj <[email protected]> Co-authored-by: MaukCC <[email protected]> Co-authored-by: Ryan <[email protected]> Co-authored-by: Artur Petrzak <[email protected]> Co-authored-by: yangwenxiong <[email protected]> Co-authored-by: Roman Moravčík <[email protected]> Co-authored-by: Robby Candra <[email protected]> Co-authored-by: Hans007a <[email protected]> Co-authored-by: Neskik <[email protected]> Co-authored-by: Mauro <[email protected]> Co-authored-by: Radek Pietruszewski <[email protected]> Co-authored-by: chgi <[email protected]> Co-authored-by: Robert Stein <[email protected]> Co-authored-by: rebel1 <[email protected]>
Description
The MM_PER_ARC_SEGMENT approach has a weakness where high values lose resolution (most noticeable on small-radius arcs) and low values risk flooding the system with huge numbers of small segments if a high feedrate is used.
Instead of fixing the length of the arc segment, this update adds the ability to derive the segment length from the feed rate. Faster curves use coarser physical resolution and slower curves use finer resolution.
Benefits
CNC firmware can use a wide range of feed rates and there can be wide differences in expectations as far as what resolution is considered reasonable. A plotter may expect to draw very fast, while a helical plunge to drill a small hole may expect a circle and not a hexagon. With feedrate-derived arc segment lengths, both of these can be supported with common firmware.
Related Issues