Skip to content

Add headings and other geometric pins in motion using State_tags#3995

Open
rodw-au wants to merge 29 commits intoLinuxCNC:masterfrom
rodw-au:state-tags-arcs
Open

Add headings and other geometric pins in motion using State_tags#3995
rodw-au wants to merge 29 commits intoLinuxCNC:masterfrom
rodw-au:state-tags-arcs

Conversation

@rodw-au
Copy link
Copy Markdown
Contributor

@rodw-au rodw-au commented May 2, 2026

Outline

create new [motion.interp.xx ] pins for heading and various geometric data (refer man motion for this PR). Note the following use cases behind this PR.

  • heading requested by Andy as it was trivial to add while working on this. Its been in Mach3 for years. Useful for tangential knives and saws.
  • normal-heading angle from current position to arc centre. Allow bevelled cutting in conjunction with heading. This could allow cuttings of bevels (eg with a plasma torch) with 2D gcode. While torch holders exist that keep the angled torch tip axial to the Z axis, external offsets could be used to calculate the desired XYZ coordinates to centre the torch tip
  • radius A theory of mine. Plasma cutters use torch voltage as a process contol variable to set torch height to obtain even kerf but this assumes a constant velocity (reducing velocity increases torch voltage). When the torch aproaches a centrepetal radius limit, the system could lock the height and switch to using current as the process control variable to keep the voltage constant.
  • iscircle allows a plasma cutter to detect bolt holes (where arc start position = end position) and apply custom hole processing rules more inteligently than the current state. Can be used in conjunction with normal-heading for countersinking holes.

I am sure the community will find many other use cases.

Code notes

  • Uses an extension of state_tags.
  • New procedures tag_straight() and tag_arc() in interp_convert.cc apply our new tags for straight moves and arcs.
  • Because these tags are only applied at the beginning of a segment, heading calculations are applied in motion/control.c/update_status() in real time.
  • The rest of the code is mechanical to transfer the tags added by the interpreter back to motion so the data can be used in real time.
  • May provide a framework for using additional tags in motion

Caveats

We use the state tag motion_type (GM_FIELD_MOTION_MODE) to detect G0,G1,G2,G3 in motion. Currently there is no way to use existing interpreter equates for these values so the numbers are hard coded as 0,10,20,30.

RunTests

These pass locally

Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors
rod@debian:~/devt/linuxcnc$ 

Acknowledgements

Many thanks to Luca Toniolo (grandixximo) for his encouragement and help resolving errors with the tests.

Rod and others added 14 commits April 13, 2026 17:44
merge latest upstream into state-tags-arcs branch
merge master to state-tag-arcs branch
…d read

active_modes() in rs274ngc_pre.cc still ran the original unclamped loop
above the clamped one, so the stack overflow into saved_settings[5] was
unchanged. The line-number copy was also commented out. Drop the duplicate
and restore the line-number copy.

write_state_tag() still dereferenced block on the iscircle assignment
(`block->iscircle = (block == NULL) ? 0 : block->iscircle`), reintroducing
the M70 NULL-deref. Replace with a plain null-guarded read.

control.c output_to_hal() read the iscircle bit out of `tag.fields[]` using
the StateFlag index GM_FLAG_IS_CIRCLE, which indexes past `fields[]`
(GM_FIELD_MAX_FIELDS == 8). Read it from packed_flags instead, like the
update_status() copy does. Also dropped the duplicate
interp_normal_heading write in the G2/G3 branch and restored the
WATCH_FLAGS debug block to live inside update_status().
Round 2: re-fix M70 segfault and iscircle handling
M_PI_2 is a glibc extension and is not exposed by RTAI's rtapi_math.h,
so the RTAI build fails with 'M_PI_2 undeclared' at control.c:2283.
M_PI is available in both, so use M_PI/2.0 instead.
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Some observations:

  • Why is there a file called arc_heading?
  • I'm not sure that creating test-files in the root LCNC directory called nc_files is a good idea. Tests are supposed to be in the tests directory and have a real test associated. If they are not for testing, then you need to have a specific config and the should be created in the config/sim/... somewhere as an example.
  • The line docs/man/man9/output_buffer.9 is malplaced in the root .gitignore and should be in the docs/man/.gitignore file. However, it is probably malplaced in this PR as it seems unrelated to this PR.
  • The diff of src/emc/rs274ngc/interp_convert.cc is 7000+ lines. Most, if not all, seems to be inappropriate (or stylistic wrong) white-space changes. What are the actual differences in this file?

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Thanks for the feedback.

  1. I will remove the spurious (empty) arc_heading
  2. The nc_folder was created due to issue RIP build now makes a temp file or folder (I think called $) in the working directory where linuxcnc 2.10pre is invoked from the command line #3924 . I reported which was not resolved until after I commenced work on this PR. I will remove it as there is no need to demonstrate these pins with a custom sim. (I just used the normal axis sim for testing)
  3. docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore
  4. Sorry if the style has been broken. Changes in interp_convert.cc are two new procedures at the end tag_straight() and tag_arcs() which are each called once from convert_straight() and convert_arc2(). New procedures are from line 7080 and on. Probably easiest to review in my fork; state_tags_arcs branch. https://github.com/rodw-au/linuxcnc/blob/state-tags-arcs/src/emc/rs274ngc/interp_convert.cc#L7080

Ideas to resolve Item 3 would be appreciated.

Just reviewing further, it appears #3924 that the ~/linuxcnc/configs folder contents have been added to the root folder on my PC. I don't think they have been included in this PR. Could someone please check and confirm?

…that was not resolved when work commenced on this PR.

2. Deleted spurious arc_heading file.
3. Moved docs/man/man9/output_buffer.9 to docs/man/.gitignore
@hansu
Copy link
Copy Markdown
Member

hansu commented May 3, 2026

docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore

Sorry my fault, I forgot to add the generated man page to gitignore (#3941)

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Hm, I'm not sure I've been looking too good at the nc directory... Point 12 makes 300+ files disappear. That seems very, very wrong. (edit should read point 2)

Point 3 should be a separate PR, I guess.

Point 4 needs to be solved by you taking the original file and only change what is necessary.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Just to add a comment on nc files.

It is not that you cannot or should not add (example) files. The point is that there needs to be some kind of docs or procedures that use or reference them. Just having files without people knowing how to find them is kinda pointless.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore

Sorry my fault, I forgot to add the generated man page to gitignore (#3941)

You are not the first who gets bitten by this. There is a change in the works to let CI fail when this happens.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Just to add a comment on nc files.

It is not that you cannot or should not add (example) files. The point is that there needs to be some kind of docs or procedures that use or reference them. Just having files without people knowing how to find them is kinda pointless.

As mentioned in the original comment, these new pins are documented in the motion man file eg man motion under I_Interpreter Metadata pins._ These should find hteir way to the web site shouldn't they?

Re point 2, you now see the problem with the nc_files folder caused by #3924 . I too only saw it it when the files were removed by git add. It was very wrong as it created the files that should have been under ~/linuxcnc in whatever was the current working directory. So saving the sim to your desktop created this mess!

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

As mentioned in the original comment, these new pins are documented in the motion man file eg man motion under I_Interpreter Metadata pins._ These should find hteir way to the web site shouldn't they?

The man page is a reference for the component. These man pages usually do not do a lot of examples. For that we have the other documentation in the docs/src directory, where specific scenarios are described and more in depth explanations are (should be) presented. This is usually also the place, while explaining and going into depth, to reference the examples provided.

Re point 2, you now see the problem with the nc_files folder caused by #3924 . I too only saw it it when the files were removed by git add. It was very wrong as it created the files that should have been under ~/linuxcnc in whatever was the current working directory. So saving the sim to your desktop created this mess!

Yes, there was that unfortunate wrong side-effect while fixing the Tcl9 compatibility problem, sorry about that. However, it should be fixed now, isn't it?

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

These should find hteir way to the web site shouldn't they?

Man pages should find their way, yes. So does the other documentation afaik.
(if auto updating works, don't know about that)

rod added 2 commits May 4, 2026 07:47
in preparation to fix format errors caused by editor auto format options
Aditional commit to follow
then reapplying chnagfes in this PR to it
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Formatting issue in interp_convert.cc was caused by an errant autoformatting editor I had no idea about.
I reverted to a copy from master branch than reapplied the changes from this PR so the last commit 5461c2d now shows changes nice and clearly.

I can't see a clean way to correct the .gitignore issue by a PR from the oversight in #3941. Its been corrected in this PR.

Re documentation, when I look at a the docs page on the web site, I can't see any chapter where additional documentation of a few extra pins is appropriate except for the man page. Perhaps these gcode samples could be deployed and mentioned on the man page but where do I put them so they turn up in the users nc_file examples?
nc_files.zip.

Adding example gcode for read only pins just does not seem right to me. The man page should be sufficient (as it is for every other component).

All runtests pass
Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

I think this is now OK for approval. It is benign as it does not add any additional features, just exposes some useful information. Breakages are unlikely. Any fixes following user feedback can be added.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 4, 2026

You still have the nc_files/3D_Chips.pdf marked as removed. You need to run git restore on that file and commit.

Comment thread src/emc/rs274ngc/interp_internal.hh Outdated
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

Corrected typos in comments. (1 was pre existing)
Rebased to master branch to bring in .gitignmore entry for docs/man/man9/output_buffer.9
removed unused tag GM_FIELD_FLOAT_FEEDRATE which was not necessary in the end.

Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Thanks for everyone's help

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

I had to force add Chips as it had been removed so restore failed.

rod@debian:~/devt/linuxcnc$ git restore ./nc_files/3D_Chips.pdf
error: pathspec './nc_files/3D_Chips.pdf' did not match any file(s) known to git
rod@debian:~/devt/linuxcnc$ git add ./nc_files/3D_Chips.pdf
The following paths are ignored by one of your .gitignore files:
nc_files/3D_Chips.pdf
hint: Use -f if you really want to add them.
hint: Disable this message with "git config advice.addIgnoredFile false"
rod@debian:~/devt/linuxcnc$ git add -f ./nc_files/3D_Chips.pdf
rod@debian:~/devt/linuxcnc$ git commit
[state-tags-arcs 4fc14bca89] force added missing 3D_Chips.pdf file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 nc_files/3D_Chips.pdf
rod@debian:~/devt/linuxcnc$ git push

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

I don't trust Githubs tests, all runtests still pass locally
Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Comment thread src/emc/motion/control.c
Comment thread src/emc/motion/motion.c Outdated
Comment thread src/emc/motion/state_tag.h Outdated
Comment thread src/emc/rs274ngc/interp_internal.hh
Remove spurious inserted text in comments
Uncommented "motion.jog-is-active" pin in motion.c
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 5, 2026

The problem with purely whitespace changes are that they are detractors from what is being changed. As such, it may be fine to change whitespace, but in a complex change it can become hard to keep track. (/me being pedantic)

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Yeh, I know you are being pedantic but as you say this is complex so I don't mind. Helps me learn.
I'm getting lots of runtests errors like this here

rod@debian:~$ cd devt/linuxcnc
rod@debian:~/devt/linuxcnc$ . ./scripts/rip-environment
rod@debian:~/devt/linuxcnc$ runtests
Running test: /home/rod/devt/linuxcnc/tests/abort/feed-rate
*** /home/rod/devt/linuxcnc/tests/abort/feed-rate: XFAIL: test run exited with 1
*** SHMERR: Shared memory segment 0x00000064 (Emc motion key) was not removed. Removing...

I did a git clean and rebooted but they are persisting. It can't be anything in that last commit surely. The only code I touched was adding back in the commented out pin.

Any ideas short of recloning?

@andypugh
Copy link
Copy Markdown
Collaborator

andypugh commented May 5, 2026

  • normal-heading angle from current position to arc centre.

I assume that this is just heading +/- 90 degrees. (I thought it might be pointless, but then realised that there is a +/- flip to consider)

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 5, 2026

Then there is a problem in the exit procedure of the motion process. That can be because you have a crash that goes undetected?

Run runtests -s -n. Then the process will stop at the first error and the generated files are not cleaned. You should then be able to look at f.ex. the generated stderr and other output files in the failed test's directory. They may give you an indication what happened.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Thanks. Something odd. 44 tests fail and we only ever had 5 max before Luca helped me clean them up and I did runtests at my last commit and the output was still on the screen when I started tonight.

rod@debian:~/devt/linuxcnc$ runtests -s -n
Running test: /home/rod/devt/linuxcnc/tests/abort/feed-rate
*** /home/rod/devt/linuxcnc/tests/abort/feed-rate: XFAIL: test run exited with 1
Runtest: 1 tests run, 0 successful, 1 failed + 0 expected, 0 skipped, 0 shmem errors
Failed: 
/home/rod/devt/linuxcnc/tests/abort/feed-rate

Linuxcnc_debug.txt in home folder says

error: Cannot find instance 1 of '[DISPLAY]INTRO_GRAPHIC'
error: Cannot find instance 1 of '[DISPLAY]INTRO_TIME'

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 5, 2026

What is in file in /home/rod/devt/linuxcnc/tests/abort/feed-rate/stderr? There may be other during the test generated files in there.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Hmm, so it says its an ini file thing but I have no idea where/if runtests has one. I check the env is set correctly for the rip path,

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 5, 2026

Hmm, so it says its an ini file thing but I have no idea where/if runtests has one. I check the env is set correctly for the rip path,

You cannot depend on the files files in the home directory. Those are mostly not used in the tests.

If unsure about RIP setup, run the tests from the src directory like ../scripts/rip-environment runtests -s -n, which should always work as intended.

You can specify the test you want to run like: ../scripts/rip-environment runtests -s -n ../tests/abort/feed-rate, which will only run the test in that test directory. But you have to look for result and stderr files in that test directory.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

hmm, looks like it is to do with enabling that pin

rod@debian:~/devt/linuxcnc/tests/abort/feed-rate$ cat stderr
+ rm -f sim.var
+ linuxcnc -r test.ini
Note: Using POSIX realtime
emc/tooldata/tooldata_common.cc, 315: Failed to open tool table file 'simpockets.tbl': No such file or directory
emc/tooldata/tooldata_common.cc, 315: Failed to open tool table file 'simpockets.tbl': No such file or directory
HAL: ERROR: pin_new(motion.jog-is-active) called with already-initialized memory
HAL: ERROR: duplicate variable 'motion.jog-is-active'
MOTION: init_hal_io() failed
motmod: rtapi_app_main: Operation not permitted (-1)
./core_sim.hal:8: waitpid failed /home/rod/devt/linuxcnc/bin/rtapi_app motmod
./core_sim.hal:8: /home/rod/devt/linuxcnc/bin/rtapi_app exited without becoming ready
./core_sim.hal:8: insmod for motmod failed, returned -1
Note: Using POSIX realtime

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

rod@debian:~/devt/linuxcnc/tests/abort/feed-rate$ cat stderr

  • rm -f sim.var
  • linuxcnc -r test.ini
    Note: Using POSIX realtime
    emc/tooldata/tooldata_common.cc, 315: Failed to open tool table file 'simpockets.tbl': No such file or directory
    emc/tooldata/tooldata_common.cc, 315: Failed to open tool table file 'simpockets.tbl': No such file or directory
    HAL: ERROR: pin_new(motion.jog-is-active) called with already-initialized memory
    HAL: ERROR: duplicate variable 'motion.jog-is-active'
    MOTION: init_hal_io() failed
    motmod: rtapi_app_main: Operation not permitted (-1)
    ./core_sim.hal:8: waitpid failed /home/rod/devt/linuxcnc/bin/rtapi_app motmod
    ./core_sim.hal:8: /home/rod/devt/linuxcnc/bin/rtapi_app exited without becoming ready
    ./core_sim.hal:8: insmod for motmod failed, returned -1
    Note: Using POSIX realtime

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

duplicate pin, deleted the one I uncommented; see what happens

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

now passing. I must have copied that line down to use as a template when I had syntax errors with the pins

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

  • normal-heading angle from current position to arc centre.

I assume that this is just heading +/- 90 degrees. (I thought it might be pointless, but then realised that there is a +/- flip to consider)

Yeh, normally this angle would be from the centre out (which is calced to get the tangent) but this points from the path back to the centre so we can cut a bevel. I think a component could use external offsets based on these formulas
image

So we could cut a countersunk hole. (the dxf that is used to generate the gcode would have the bolt hole and the outline of the countersink) so we'd use 2 operations and it would be all 2D gcode for 5 axis operations. I've recruited a couple of guys to help with this. Might end up with some components and sims once this is squared away.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors
Hopefully we are done

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Also had a brief look about tangential knives. a voicecoil actutator with 5mm stroke is reasonabley priced so hook that to the end of a stepper motor to hold the knife and we should be able to vary stroke frequency with velocity so as it slows, strokes become slower... would be a pretty simple machine to make...

@andypugh
Copy link
Copy Markdown
Collaborator

andypugh commented May 5, 2026

So we could cut a countersunk hole

I already looked into this a long time ago for kerf correction:
https://sourceforge.net/p/emc/mailman/emc-users/thread/AANLkTin08wfVDXmAUO3y0FrHPGdJL91XKlENEMM4iOjv%40mail.gmail.com/#msg25474106

@rodw-au rodw-au requested a review from BsAtHome May 5, 2026 21:35
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

So we could cut a countersunk hole

I already looked into this a long time ago for kerf correction: https://sourceforge.net/p/emc/mailman/emc-users/thread/AANLkTin08wfVDXmAUO3y0FrHPGdJL91XKlENEMM4iOjv%40mail.gmail.com/#msg25474106

Well that was a long time ago! I have been told water jet machines adjust the cutting head angle to allow for perpendicular cutting. Even plasma has a tapered kerf. I was thinking of countersinking with something simple like

M68 E0 Q45 (Set 'Bevel Angle' variable to 45 degrees)
M64 P1     (Turn on 'Bevel Mode' via digital out)
G2 X10 Y10 I5 J0 (Cut a standard circle)
M65 P1     (Turn off Bevel Mode)

But external offsets would allow the cutting angle to be adjusted dynamically for kerf correction. QTPYVCP's Monokrom plasma GUI includes a material/machine SQL database I contributed containing high definition cutting parameters so it could be extended to include kerf correction for specific materials.

The beauty is that it can all be done in 2D which avoids expensive 5 axis post processing and keeps the operator in familiar 2D territory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants