Repository navigation
docs: correct the section 5 claims hardware contradicted - #25
Merged
Merged
Conversation
Walked every entry point in DEVELOPER_GUIDE section 5 (15 subsections,
about 60 entry points) against a LiteArm 7-DOF running Litearm1.10.0-7J,
calling only what the documents say. 186 of 190 checks held. Six claims
did not.
set_joint_limits does not reject widening. The firmware intersects the
request with its compile-time default and answers ACK, so writing the
current values back is accepted with no error and no change -- the call
IS idempotent, and it cannot be used to confirm that a write landed. The
doc said the opposite, which sends anyone trying to verify a limit write
in the wrong direction. ERR{0x23,0x02} is for a NaN, an empty
intersection or an out-of-range idx. Narrowing is also irreversible in
RAM, which is worth saying out loud.
CartPlan.settled lists two causes for ok=True, settled=False; the
commonest one is missing. settled also requires the TCP read back after
arrival to sit inside 6 mm / 0.03 rad, and this arm's TCP repeatability
is 3-10 mm -- right at that edge. Measured on a 20 mm move_l: 4 of 5 runs
were settled=False purely from 7.9-9.9 mm of position error, with
settle_err_rad down at one quantisation step. Read from the doc alone,
that looks like "another motion invalidated your trajectory".
Two names do not exist on the SDK side: the state frame renders
ARM_MODE_MOVE_MIT_ALL as MIT_ALL, so mode_name == "MOVE_MIT_ALL" is never
true; and LOG_MAX_SAMPLES / CTRL_HZ live in litearm.log without being
re-exported at package level.
Two smaller ones in the same walk: move_c's start-mismatch check is local
and raises InvalidCommandError, not the CartesianPlanError used for the
firmware's own err 1/2/3; and its collinear check has a scale threshold
-- three collinear points 20 mm apart are accepted and planned, 100 mm
apart is rejected. ERR{0x08,0x04} is also unreachable from this SDK when
zero_g() belongs to this client, because the guard rejects locally before
the frame is sent.
Two docstrings (cart.py, params.py) plus both developer guides. No
behaviour change.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Walked every entry point in
DEVELOPER_GUIDE§5 — 15 subsections, about 60 entry points —against a LiteArm 7-DOF running
Litearm1.10.0-7J, calling only what the documents say.186 of 190 checks held. Six claims did not. Two of those six would send a careful reader in the
wrong direction, so they are worth correcting rather than leaving as a footnote.
Independent of #24: both touch
docs/DEVELOPER_GUIDE.md, but in different sections (there §5.1,here §5.3 / §5.7 / §5.8 / §5.10), so they do not conflict.
1.
set_joint_limits()does not reject wideningThe doc says writing the current values back is judged a widening request and rejected
(
ERR[23,2]), "so it is not idempotent". Measured on J1:[-2.809546947, 2.809546947][-2.859547, 2.859547]The firmware's own error text states the rule: "只许收窄, 照编译期默认值取交集" — intersect
with the compile-time default. Widening is therefore a silent no-op, not a rejection, and
writing the current values back is idempotent. The consequence the doc gets wrong is the
useful one: you cannot use this call to confirm that a limit write landed.
ERR{0x23,0x02}isfor a NaN, an empty intersection or an out-of-range
idx.This is not the SDK swallowing the error:
set_joint_limitsgoes through the same_cmdACK/ERR path as
set_joint_param, which does surfaceERR{0x22,0x02}.Narrowing is also irreversible in RAM — the intersection only ever shrinks — which the doc
did not say. (It was not tested for that reason.)
2.
CartPlan.settled— the commonest cause is missingcart.pylists two causes forok=True, settled=False: the trajectory was invalidated byanother motion, or
get_tcp()could not be read. There is a third, and on this arm it dominates:the arm settled but the TCP read back afterwards sits outside 6 mm / 0.03 rad.
Five consecutive
move_l(wait=True)calls, 20 mm of travel, no other motion,get_tcp()healthy:settledsettle_err_radThis arm's TCP position repeatability measures 3–10 mm, i.e. right at the 6 mm tolerance, so
settled=Falsehere is an ordinary outcome. Read from the doc alone it looks like "anothermotion invalidated your trajectory", which is a different investigation entirely.
3–4. Two names that do not exist on the SDK side
ARM_MODE_MOVE_MIT_ALLasMIT_ALL(_protocol.MODE_NAMES), notMOVE_MIT_ALL.state.mode_name == "MOVE_MIT_ALL"is never true. The warning itself is rightand now confirmed:
send_mit_allreportsMIT_ALLtoo, so the two really areindistinguishable from the state frame. (
send_mitis a different mode,MOVE_MIT.)LOG_MAX_SAMPLESandCTRL_HZlive inlitearm.logand are not re-exported at packagelevel, unlike
LogSample/LogReader/parse_samplesin the same subsection.5–6. Two smaller ones from the same walk
move_c's start-mismatch check is local and raisesInvalidCommandError; theCartesianPlanErrorin the same section covers the firmware's own err 1/2/3. The collinearcheck (err=2) also has a scale threshold — three collinear points 20 mm apart are accepted
and planned (n_wp=7), 100 mm apart is rejected.
ERR{0x08,0x04}is unreachable from this SDK while hand-guiding:zero_g()'s guard rejectsevery other downstream command locally, before the frame is sent. It needs another host to
have entered zero-g.
Changes
docs/DEVELOPER_GUIDE.md,docs/DEVELOPER_GUIDE.zh-CN.md— §5.3, §5.7, §5.8, §5.10 as above.src/litearm/cart.py— theCartPlandocstring now lists three causes forok=True, settled=Falseand says to rule out the TCP-tolerance one first.src/litearm/params.py—set_joint_limitsdocstring records the intersection behaviour.Documentation and two docstrings. No behaviour change.
Testing
The measurements above were taken on hardware. Everything reachable by document only was called
that way; the irreversible entry points listed in §7 (
save_params,model.commit,model.revert,params.reset_factory,model.set_jm,enter_dfu,activate) were notexecuted, and neither was narrowing a joint limit.
Issues
None — found while doing a document-driven acceptance pass. No tracking issue.