Skip to content

feat: state_broadcaster implementation#58

Open
dmalexa5 wants to merge 1 commit into
learnsyslab:mainfrom
dmalexa5:devel
Open

feat: state_broadcaster implementation#58
dmalexa5 wants to merge 1 commit into
learnsyslab:mainfrom
dmalexa5:devel

Conversation

@dmalexa5

@dmalexa5 dmalexa5 commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Hi @danielsanjosepro,

I wanted to open this PR mostly for discussion about a major (breaking) change, so I won't be offended at all if you decide not to go in this direction :)

The state_broadcaster is intended to be something of a catch-all implementation of the joint_state_broadcaster, the twist and pose broadcasters, plus some additional functionality around model-compensated wrench and effort broadcasting. It aims to complete the following:

  • Unify pose_broadcaster and twist_broadcaster while ensuring that robots with no velocity or effort interface are still able to use the broadcaster
  • Add functionality around external force measurements (my personal area of research is wrench-aware manipulation, so this is critical)
  • Eventually, replace the franka_ros2_teleop setup controller with a robot-agnostic purely-crisp implementation, which would require an external_effort broadcaster native to this repository

This interface is a state-only plugin (like any original broadcaster) and at minimum publishes pose and joint states. If complete velocity and effort interfaces are available, it also publishes twist, raw wrench, residual external joint effort, and external wrench. Also has optional gravity, Coriolis, and inertial compensation (used to calculate the external effort and wrench).

Similar to the cartesian and admittance controllers, its topics, frames, reference-frame conventions, publish rates, wrench damping, and compensation toggles are generated parameters from src/state_broadcaster.yaml. I tried to keep this as crisp-ish as possible, but feel free to point out anything that needs to change!

Tested these changes on humble with a couple FR3 arms. Works great! Also can test on jazzy and kilted if you think this is a good direction to go... riht now I just use it in my own research. Similarly, crisp_controllers_demos would need to be updated, which I could also do if necessary.

Best,
David

@dmalexa5

dmalexa5 commented Jun 8, 2026

Copy link
Copy Markdown
Contributor Author

Would it be better to alias pose_broadcaster and twist_broadcaster to this new broadcaster so the change is backwards compatible? Alternatively, I could decouple into a wrench_broadcaster and effort_broadcaster to make this a non-breaking change.

@danielsanjosepro danielsanjosepro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really like the idea of this unified broadcaster. I think it is a good idea to alias the pose broadcaster and twist broadcaster to keep backwards compatibility (because crisp_py depends on both). If you could add these changes to the pixi_franka_ros2 or the demos it would be great!

And I am happy that the code could help you on your on going research. Thanks for your contribution!

use_coriolis_compensation:
type: bool
default_value: false
default_value: true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets keep the defaults here except if there is a strong reason to change them

Comment on lines +302 to +311
effort_publisher:
topic:
type: string
default_value: "commanded_effort"
description: "Topic name for publishing commanded joint efforts as std_msgs/Float64MultiArray. Values are in joints order."
publish_frequency:
type: double
default_value: 1000.0
description: "Frequency in Hz for publishing commanded joint efforts. Values <= 0.0 disable publishing."

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here we could make the publishing of the commanded effort for now default turned off (0.0 default value). If this value is needed for introspection only you can use the controller statistics to visualize it :)

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.

2 participants