Skip to content
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

Refs/heads/488 feature split up acting controller #508

Merged
merged 7 commits into from
Nov 22, 2024

Conversation

vinzenzm
Copy link
Collaborator

@vinzenzm vinzenzm commented Nov 17, 2024

Description

Split up acting into acting and control. No functional changes.

Fixes # (issue)

#421

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

Does this PR introduce a breaking change?

e.g. is old functionality not usable anymore

Most important changes

Which files functionalities are most important in this PR. On which part should the reviewer be focussed on?

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works (might be obsolete with CI later on)
  • New and existing unit tests pass locally with my changes (might be obsolete with CI later on)

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a new passthrough node for improved message handling in the acting component.
    • Added a control launch file to streamline the launch process for vehicle control nodes.
  • Documentation

    • Updated and reorganized documentation for the acting and control components, enhancing clarity and usability.
    • New architecture documentation for the control component detailing its structure and functionality.
    • Comprehensive documentation for the passthrough component, explaining its role and functionality.
    • Enhanced clarity in the acting_testing.md document regarding the functionality of the Acting_Debug_Node.
  • Bug Fixes

    • Corrected file paths in various documentation files to reflect the new directory structure.

Moved pure_pursuit, stanley, vehicle and velocity controller to new control pck
Changed topic names in the new control package
Added a passthrough node in acting, which passes necessary topic to control
Adapted acting launch file to accomodate the changes
Moved necessary documentation from acting to control.
Added documentation for passthrough node.
Adjusted linking in Readmes
Added new architecuraly diagrams.
Added and updated linking through markdown documentation.
Moved assets into correct folder and updated docs accordingly.
@vinzenzm vinzenzm linked an issue Nov 17, 2024 that may be closed by this pull request
Copy link
Contributor

coderabbitai bot commented Nov 17, 2024

Walkthrough

The changes in this pull request involve significant modifications to the ROS (Robot Operating System) configuration and structure for the acting and control packages. A passthrough node has been introduced to streamline message passing, replacing several controller nodes. Additionally, new launch and configuration files for the control package have been created. The documentation has been updated to reflect these structural changes, including new files and updated paths for existing components.

Changes

File Path Change Summary
code/acting/launch/acting.launch Removed nodes for velocity_controller, stanley_controller, pure_pursuit_controller, and vehicle_controller; added passthrough node; modified parameters for MainFramePublisher; included control.launch.
code/acting/src/acting/passthrough.py Introduced new passthrough node class for message passing; defined Passthrough class and its main function.
code/control/CMakeLists.txt Created CMake configuration for the control project; specified dependencies and package declaration.
code/control/launch/control.launch Added new launch file defining multiple nodes for vehicle control with parameters for role_name and control_loop_rate.
code/control/package.xml Created package.xml for the control package with metadata and dependencies.
code/control/setup.py Introduced setup.py for packaging the control module.
code/control/src/pure_pursuit_controller.py Updated subscription and publication topics to use a centralized naming scheme under "acting".
code/control/src/stanley_controller.py Updated subscription and publication topics to use a centralized naming scheme under "acting"; updated import paths.
code/control/src/velocity_controller.py Changed subscription topic for target velocity to a fixed path without role_name.
doc/acting/README.md Updated documentation structure and titles; corrected filenames.
doc/acting/acting_testing.md Enhanced clarity regarding Acting_Debug_Node functionality; refined setup instructions.
doc/acting/architecture_documentation.md Restructured documentation; expanded summary of the acting component's role and interactions.
doc/acting/passthrough.md Created documentation for the passthrough component.
doc/control/README.md Introduced documentation for the control component.
doc/control/architecture_documentation.md Added detailed architecture documentation for the control component.
doc/control/steering_controllers.md Updated file paths and image references for steering controllers.
doc/control/vehicle_controller.md Modified file paths for the Vehicle Controller documentation.
doc/control/velocity_controller.md Updated file paths and image references for the velocity controller documentation.

Possibly related PRs

Suggested labels

infrastructure, enhancement

Suggested reviewers

  • seitzseb

Poem

🐇 In the land where code does flow,
A passthrough node begins to grow.
Controllers fade, but fear not,
For simpler paths are now our lot!
With docs refined and paths aligned,
The acting's clear, our goals defined! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (24)
doc/acting/README.md (1)

8-8: Add missing newline at end of file

The file should end with a single newline character.

 4. [How to test/tune the acting component](./acting_testing.md)
+
🧰 Tools
🪛 Markdownlint

8-8: null
Files should end with a single newline character

(MD047, single-trailing-newline)

code/acting/launch/acting.launch (2)

6-12: Enhance the passthrough node documentation

While the comment indicates the purpose, it would be helpful to provide more details about:

  • The specific messages being passed through
  • The topics being subscribed to and published
  • The relationship with the control package

Consider expanding the comment like this:

-    <!--Passthrough
-    all messages the control package needs-->
+    <!-- Passthrough Node
+         Forwards essential messages from acting to control package:
+         - List specific message types
+         - List input/output topics
+         - Explain interaction with control package
+    -->

1-21: Well-structured separation of acting and control components

The launch file changes effectively implement the separation of acting and control functionality through:

  1. Introduction of a passthrough node for clean message passing
  2. Removal of controller nodes (now in control package)
  3. Proper parameter sharing between packages

This architecture promotes better modularity and maintainability.

Consider documenting the following in the package's README:

  • The new architecture overview
  • The role of the passthrough node
  • The interaction between acting and control packages
code/control/launch/control.launch (2)

2-3: Add documentation for launch file arguments

Consider adding XML comments to document:

  • Purpose and impact of the control_loop_rate parameter
  • Explanation of the role_name parameter and its possible values
  • Any constraints or dependencies for these parameters
 <launch>
+    <!-- control_loop_rate: Time interval between control commands in seconds.
+         Must be 0.05s to meet leaderboard requirements and prevent lag. -->
+    <!-- role_name: Identifier for the vehicle in the system. Default: "hero" -->
     <arg name="role_name" default="hero" />
     <arg name="control_loop_rate" default="0.05" />

6-26: Consider refining the logging strategy

All nodes currently output to screen, which could flood the console with messages. Consider:

  • Using a ROS logger with different verbosity levels
  • Redirecting output to log files for non-critical nodes
  • Keeping screen output only for critical messages

Consider using ROS parameter groups

The control_loop_rate and role_name parameters are duplicated across all nodes. Consider using a parameter group or YAML configuration:

 <launch>
     <arg name="role_name" default="hero" />
     <arg name="control_loop_rate" default="0.05" />
+    
+    <!-- Load common parameters -->
+    <rosparam command="load" file="$(find control)/config/controller_params.yaml" />

Highlight critical timing requirement

The timing requirement (0.05s) is crucial for system performance but is hidden in a comment. Consider:

  1. Moving this to the top of the file as a prominent warning
  2. Adding validation for the control_loop_rate parameter
  3. Documenting this requirement in the package's README
code/acting/src/acting/passthrough.py (1)

59-68: Improve QoS configuration and add error handling.

  1. Use descriptive QoS profile constants instead of magic number 1
  2. Add error handling for message publishing
+from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy
+
+    def _message_callback(self, msg, publisher):
+        try:
+            publisher.publish(msg)
+        except Exception as e:
+            self.get_logger().error(f"Failed to publish message: {e}")
+
     def __init__(self):
+        self.qos_profile = QoSProfile(
+            reliability=QoSReliabilityPolicy.RELIABLE,
+            history=QoSHistoryPolicy.KEEP_LAST,
+            depth=1
+        )
         for topic in self.passthrough_topics:
             self.publishers[topic.pub_name] = self.new_publisher(
-                topic.topic_type, topic.pub_name, qos_profile=1
+                topic.topic_type, topic.pub_name, qos_profile=self.qos_profile
             )
             self.subscribers[topic.pub_name] = self.new_subscription(
                 topic.topic_type,
                 topic.sub_name,
-                callback=self.publishers[topic.pub_name].publish,
-                qos_profile=1,
+                callback=lambda msg, pub=self.publishers[topic.pub_name]: 
+                    self._message_callback(msg, pub),
+                qos_profile=self.qos_profile,
             )
doc/control/architecture_documentation.md (3)

4-7: Improve clarity by using more concise phrasing.

Consider revising the sentence structure for better readability:

-The control component applies control theory based on a local trajectory provided
-by the [acting component](./../acting/README.md). It uses knowledge of the current state
-of the vehicle in order to send [CarlaEgoVehicleControl](https://carla.readthedocs.io/en/0.9.8/ros_msgs/#CarlaEgoVehicleControlmsg) commands to the Simulator. This component also sends the [/carla/hero/status](https://leaderboard.carla.org/get_started/) command,
+The control component applies control theory based on a local trajectory provided
+by the [acting component](./../acting/README.md). It uses the vehicle's current state
+to send [CarlaEgoVehicleControl](https://carla.readthedocs.io/en/0.9.8/ros_msgs/#CarlaEgoVehicleControlmsg) commands to the Simulator. This component also sends the [/carla/hero/status](https://leaderboard.carla.org/get_started/) command,
🧰 Tools
🪛 LanguageTool

[style] ~6-~6: Consider a shorter alternative to avoid wordiness.
Context: ...dge of the current state of the vehicle in order to send [CarlaEgoVehicleControl](https://c...

(IN_ORDER_TO_PREMIUM)


27-81: Fix markdown formatting issues.

The document has several formatting inconsistencies:

  1. Add blank lines around headings (lines 27, 53, 66)
  2. Remove trailing spaces
  3. Add a final newline

Apply these fixes:

-### Steering controllers 
+### Steering controllers
+
-> [!TIP] 
+> [!TIP]
 > Follow this link for the [Documentation](./steering_controllers.md) on steering controllers.

-### Velocity controllers 
+### Velocity controllers
+
-> [!TIP]
+> [!TIP]
 > Follow this link for the [Documentation](./velocity_controller.md) on velocity component.

-### vehicle_controller.py
+### vehicle_controller.py
+
-> [!TIP]
+> [!TIP]
 > Follow this link for [Documentation](./vehicle_controller.md) on vehicle controller.
...
  - **emergency**: Bool
+
🧰 Tools
🪛 LanguageTool

[style] ~67-~67: Using many exclamation marks might seem excessive (in this case: 4 exclamation marks for a text that’s 1958 characters long)
Context: ...: Float32 ### vehicle_controller.py > [!TIP] > Follow this link for [Documentati...

(EN_EXCESSIVE_EXCLAMATION)

🪛 Markdownlint

27-27: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


28-28: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


31-31: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


53-53: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


53-53: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


66-66: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


81-81: null
Files should end with a single newline character

(MD047, single-trailing-newline)


1-81: Well-structured documentation supporting component separation.

The documentation effectively describes the control component's architecture and its interaction with the acting component. The clear separation of concerns and well-defined interfaces align with the PR objective of splitting the acting and control functionality.

Consider adding:

  1. Error handling and edge cases for each controller
  2. Configuration parameters and their impact
  3. Performance characteristics and constraints
🧰 Tools
🪛 LanguageTool

[style] ~6-~6: Consider a shorter alternative to avoid wordiness.
Context: ...dge of the current state of the vehicle in order to send [CarlaEgoVehicleControl](https://c...

(IN_ORDER_TO_PREMIUM)


[style] ~67-~67: Using many exclamation marks might seem excessive (in this case: 4 exclamation marks for a text that’s 1958 characters long)
Context: ...: Float32 ### vehicle_controller.py > [!TIP] > Follow this link for [Documentati...

(EN_EXCESSIVE_EXCLAMATION)

🪛 Markdownlint

3-3: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


22-22: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


28-28: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


31-31: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


53-53: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


53-53: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


66-66: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


81-81: null
Files should end with a single newline character

(MD047, single-trailing-newline)

doc/acting/acting_testing.md (3)

11-11: Consider separating acting and control debugging functionality

Given the architectural split between acting and control components, it would be more maintainable to have separate debug nodes for each component. This would:

  • Maintain clear component boundaries
  • Reduce coupling between acting and control
  • Simplify maintenance
  • Make testing more focused

Would you like assistance in creating a separate control debug node and documentation?


18-19: Fix warning syntax and improve clarity

The warning syntax is incorrect and the message could be clearer.

Apply this diff:

->[!WARNING]! Make sure to revert these changes when pushing your branch!
+> [!WARNING]
+> Make sure to revert the launch file and docker-compose changes before committing your changes!

Line range hint 1-50: Update documentation to reflect architectural changes

The documentation needs to be updated to reflect the new architecture where acting and control are separate components. Please add:

  1. Information about the new passthrough node and its role
  2. Control-specific configuration guidance
  3. Clear distinction between acting and control components throughout the document

Would you like me to help draft these documentation updates?

🧰 Tools
🪛 LanguageTool

[uncategorized] ~22-~22: Possible missing comma found.
Context: ...om the acting package. As mentioned above this includes everything we need. - In ...

(AI_HYDRA_LEO_MISSING_COMMA)

doc/acting/architecture_documentation.md (5)

3-5: Improve summary wording for clarity and conciseness.

Consider rewording to avoid wordiness:

-The acting component receives information from the [planning component](./../planning/README.md) as well
-as the [perception component](./../perception/README.md). It processes this information in order to
-navigate on a local basis. This information is then processed in the [control_component](./../control/README.md).
+The acting component processes information from the [planning](./../planning/README.md) and
+[perception](./../perception/README.md) components for local navigation. The processed information
+is then handled by the [control component](./../control/README.md).
🧰 Tools
🪛 LanguageTool

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)


24-25: Fix grammar in documentation link text.

Add the missing article "the":

-> For documentation on passthrough component see: [passthrough](./passthrough.md)
+> For documentation on the passthrough component see: [passthrough](./passthrough.md)
🧰 Tools
🪛 LanguageTool

[uncategorized] ~25-~25: You might be missing the article “the” here.
Context: ...gh.py > [!TIP] > For documentation on passthrough component see: [passthrough](./passthro...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

🪛 Markdownlint

24-24: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


36-42: Improve mathematical formula formatting.

Consider using proper markdown math formatting for better readability:

-rotation = - **current_heading**
-position x = cos(rotation) * **current_pos**.x + sin(rotation) * **current_pos**.y
-position y = sin(rotation) * **current_pos**.x + cos(rotation) * **current_pos**.y
-position z = - **current_pos**.z
-rot_quat = rot as quaternion
-**transform** = position x/y/z, rot_quat, Timestamp(now), "global", "hero"
+- rotation = -current_heading
+- position_x = cos(rotation) × current_pos.x + sin(rotation) × current_pos.y
+- position_y = sin(rotation) × current_pos.x + cos(rotation) × current_pos.y
+- position_z = -current_pos.z
+- rot_quat = rotation as quaternion
+- transform = (position_x, position_y, position_z, rot_quat, Timestamp(now), "global", "hero")

76-76: Add missing newline at end of file.

Add a newline character at the end of the file to comply with markdown best practices.

🧰 Tools
🪛 Markdownlint

76-76: null
Files should end with a single newline character

(MD047, single-trailing-newline)


Line range hint 1-76: Documentation effectively captures architectural changes.

The documentation successfully reflects the separation of acting and control components while maintaining clear explanations of the remaining functionality. The structure is logical, and the component interactions are well-defined.

Consider adding sequence diagrams to illustrate the interaction flow between the acting and control components, which would help developers better understand the new architecture.

🧰 Tools
🪛 LanguageTool

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)


[uncategorized] ~25-~25: You might be missing the article “the” here.
Context: ...gh.py > [!TIP] > For documentation on passthrough component see: [passthrough](./passthro...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

🪛 Markdownlint

17-17: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


24-24: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


44-44: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


27-27: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)

code/control/src/velocity_controller.py (3)

Line range hint 63-117: Consider separating gear control logic

The loop method handles both velocity control and gear selection (reverse). Consider extracting gear control into a separate component to improve modularity and align with the control/acting split objective.

Consider making PID parameters configurable

The PID parameters (0.60, 0.00076, 0.63) are hardcoded. Consider moving these to a configuration file or ROS parameters for easier tuning and maintenance.

-        pid_t = PID(0.60, 0.00076, 0.63)
+        self.kp = self.get_param("pid_kp", 0.60)
+        self.ki = self.get_param("pid_ki", 0.00076)
+        self.kd = self.get_param("pid_kd", 0.63)
+        pid_t = PID(self.kp, self.ki, self.kd)

Line range hint 89-93: Replace magic numbers with named constants

The value -3 as a signal for reverse driving is a magic number. Consider defining it as a class constant for better maintainability and documentation.

+ class VelocityController(CompatibleNode):
+    REVERSE_SIGNAL = -3
+    """Signal value indicating reverse driving mode"""
+
     def __init__(self):

Then update the condition:

-    if self.__target_velocity == -3:
+    if self.__target_velocity == self.REVERSE_SIGNAL:

Line range hint 63-117: Add velocity validation for safety

Consider adding input validation for target and current velocity values to ensure safe vehicle operation. This is particularly important for a control component.

     def __get_target_velocity(self, data: Float32):
+        if not isinstance(data.data, (int, float)):
+            self.logerr("Invalid velocity type received")
+            return
+        if abs(data.data) > self.get_param("max_velocity", 50.0):
+            self.logerr(f"Velocity {data.data} exceeds safety limits")
+            return
         self.__target_velocity = float(data.data)
doc/control/steering_controllers.md (2)

21-21: Fix grammatical issues in controller descriptions.

There are two grammatical issues that should be addressed:

  1. Missing comma after the URL reference
  2. Subject-verb agreement in the Stanley Controller description

Apply these corrections:

- For more indepth information about the PurePursuit Controller, click [this link](https://de.mathworks.com/help/nav/ug/pure-pursuit-controller.html) and [this link](https://thomasfermi.github.io/Algorithms-for-Automated-Driving/Control/PurePursuit.html).At every moment
+ For more indepth information about the PurePursuit Controller, click [this link](https://de.mathworks.com/help/nav/ug/pure-pursuit-controller.html) and [this link](https://thomasfermi.github.io/Algorithms-for-Automated-Driving/Control/PurePursuit.html). At every moment

- The [Stanley Controller's](../../code/control/src/stanley_controller.py ) main features to determine a steering-output is
+ The [Stanley Controller's](../../code/control/src/stanley_controller.py ) main features to determine a steering-output are

Also applies to: 41-41

🧰 Tools
🪛 LanguageTool

[typographical] ~21-~21: It appears that a comma is missing.
Context: ...ng/Control/PurePursuit.html). At every moment it checks a point of the trajectory in ...

(DURING_THAT_TIME_COMMA)


Line range hint 58-67: Consider clarifying the performance differences between environments.

The documentation notes significant performance differences between Dev-Launch and Leaderboard-Launch environments, with a hypothesis about synchronicity. This warrants further investigation and clearer documentation.

Consider:

  1. Adding specific performance metrics or examples
  2. Documenting the exact configuration differences between environments
  3. Creating a tracking issue to investigate the root cause of the performance disparity

Would you like me to help create a GitHub issue to track this investigation?

🧰 Tools
🪛 LanguageTool

[uncategorized] ~59-~59: If “ why” starts an indirect question, you do not need to put a comma before it.
Context: ...ey alot "weaker". We do not exactly know, why the two launches are this different. (D...

(NO_COMMA_BEFORE_INDIRECT_QUESTION)

code/control/src/pure_pursuit_controller.py (1)

Line range hint 61-67: Maintain consistency in topic naming convention

While subscription topics have been centralized under the 'acting' namespace, publication topics still use role-based naming. This inconsistency could lead to confusion and maintenance issues.

Apply this diff to maintain consistency:

         self.pure_pursuit_steer_pub: Publisher = self.new_publisher(
-            Float32, f"/paf/{self.role_name}/pure_pursuit_steer", qos_profile=1
+            Float32, "/paf/acting/pure_pursuit_steer", qos_profile=1
         )

         self.debug_msg_pub: Publisher = self.new_publisher(
-            Debug, f"/paf/{self.role_name}/pure_p_debug", qos_profile=1
+            Debug, "/paf/acting/pure_p_debug", qos_profile=1
         )
code/control/src/stanley_controller.py (1)

Line range hint 57-62: Fix inconsistent topic naming pattern

The publisher topics still use the dynamic role_name while the subscribers have been updated to use the static "acting" namespace. This inconsistency should be fixed.

Apply this diff to maintain consistency:

-            Float32, f"/paf/{self.role_name}/stanley_steer", qos_profile=1
+            Float32, "/paf/acting/stanley_steer", qos_profile=1

-            StanleyDebug, f"/paf/{self.role_name}/stanley_debug", qos_profile=1
+            StanleyDebug, "/paf/acting/stanley_debug", qos_profile=1
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between b0be4de and 5760c6d.

⛔ Files ignored due to path filters (11)
  • doc/assets/acting/acting_architecture.png is excluded by !**/*.png
  • doc/assets/acting/architecture_acting_legacy.png is excluded by !**/*.png
  • doc/assets/control/Steering_PurePursuit.png is excluded by !**/*.png
  • doc/assets/control/Steering_PurePursuit_Tuning.png is excluded by !**/*.png
  • doc/assets/control/Steering_Stanley.png is excluded by !**/*.png
  • doc/assets/control/Steering_Stanley_ComparedToPurePur.png is excluded by !**/*.png
  • doc/assets/control/VelContr_PID_BrakingWithThrottlePID.png is excluded by !**/*.png
  • doc/assets/control/VelContr_PID_StepResponse.png is excluded by !**/*.png
  • doc/assets/control/VelContr_PID_differentVelocities.png is excluded by !**/*.png
  • doc/assets/control/control_architecture.png is excluded by !**/*.png
  • doc/assets/control/emergency_brake_stats_graph.png is excluded by !**/*.png
📒 Files selected for processing (18)
  • code/acting/launch/acting.launch (1 hunks)
  • code/acting/src/acting/passthrough.py (1 hunks)
  • code/control/CMakeLists.txt (1 hunks)
  • code/control/launch/control.launch (1 hunks)
  • code/control/package.xml (1 hunks)
  • code/control/setup.py (1 hunks)
  • code/control/src/pure_pursuit_controller.py (3 hunks)
  • code/control/src/stanley_controller.py (3 hunks)
  • code/control/src/velocity_controller.py (1 hunks)
  • doc/acting/README.md (1 hunks)
  • doc/acting/acting_testing.md (1 hunks)
  • doc/acting/architecture_documentation.md (2 hunks)
  • doc/acting/passthrough.md (1 hunks)
  • doc/control/README.md (1 hunks)
  • doc/control/architecture_documentation.md (1 hunks)
  • doc/control/steering_controllers.md (4 hunks)
  • doc/control/vehicle_controller.md (3 hunks)
  • doc/control/velocity_controller.md (2 hunks)
✅ Files skipped from review due to trivial changes (5)
  • code/control/CMakeLists.txt
  • code/control/package.xml
  • code/control/setup.py
  • doc/control/vehicle_controller.md
  • doc/control/velocity_controller.md
🧰 Additional context used
🪛 Markdownlint
doc/acting/README.md

8-8: null
Files should end with a single newline character

(MD047, single-trailing-newline)

doc/acting/architecture_documentation.md

17-17: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


24-24: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


76-76: null
Files should end with a single newline character

(MD047, single-trailing-newline)

doc/acting/passthrough.md

13-13: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


19-19: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


23-23: null
Files should end with a single newline character

(MD047, single-trailing-newline)

doc/control/README.md

8-8: null
Files should end with a single newline character

(MD047, single-trailing-newline)

doc/control/architecture_documentation.md

3-3: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


22-22: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


28-28: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


31-31: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


53-53: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


27-27: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


53-53: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


66-66: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


81-81: null
Files should end with a single newline character

(MD047, single-trailing-newline)

🪛 LanguageTool
doc/acting/architecture_documentation.md

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)


[uncategorized] ~25-~25: You might be missing the article “the” here.
Context: ...gh.py > [!TIP] > For documentation on passthrough component see: [passthrough](./passthro...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

doc/acting/passthrough.md

[grammar] ~7-~7: Do not use the modal verb ‘ought’ after the verb ‘be’. Did you mean “ought”?
Context: ...ng and control. Summary: This page is ought to provide an overview of the passthrou...

(BE_MD)


[grammar] ~20-~20: Did you mean to write ‘therefore’?
Context: ...e it resided within the acting package. Therefor many global dependencies existed in the...

(THEREFORE)


[uncategorized] ~21-~21: A comma might be missing here.
Context: ...ded within the acting package. Therefor many global dependencies existed in the cont...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)

doc/control/architecture_documentation.md

[style] ~6-~6: Consider a shorter alternative to avoid wordiness.
Context: ...dge of the current state of the vehicle in order to send [CarlaEgoVehicleControl](https://c...

(IN_ORDER_TO_PREMIUM)


[style] ~67-~67: Using many exclamation marks might seem excessive (in this case: 4 exclamation marks for a text that’s 1958 characters long)
Context: ...: Float32 ### vehicle_controller.py > [!TIP] > Follow this link for [Documentati...

(EN_EXCESSIVE_EXCLAMATION)

doc/control/steering_controllers.md

[typographical] ~21-~21: It appears that a comma is missing.
Context: ...ng/Control/PurePursuit.html). At every moment it checks a point of the trajectory in ...

(DURING_THAT_TIME_COMMA)


[uncategorized] ~41-~41: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...features to determine a steering-output is the so-called cross-track-error (e_...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)

🔇 Additional comments (22)
doc/acting/README.md (2)

5-8: Review documentation completeness after architecture split

Given that this PR splits the "acting" functionality into separate "acting" and "control" components:

  1. The removal of controller-specific documentation (velocity_controller.md and steering_controllers.md) suggests this content might need to be migrated to the control component's documentation.
  2. Consider adding a reference or link to the new control component's documentation to help users understand the relationship between these components.
#!/bin/bash
# Description: Check for control component documentation

echo "Checking for control component documentation..."
# Look for potential control documentation directory
fd -t d "control" -d 2

# Check if there are any markdown files mentioning the relationship between acting and control
rg -l "acting.*control|control.*acting" -g "*.md"
🧰 Tools
🪛 Markdownlint

8-8: null
Files should end with a single newline character

(MD047, single-trailing-newline)


5-8: Verify the existence of linked documentation files

The documentation structure has changed significantly. Let's verify that all referenced markdown files exist and are properly linked.

✅ Verification successful

All documentation files exist and are properly structured

All referenced markdown files in the README.md are present and contain relevant content:

  • architecture_documentation.md: Contains comprehensive architecture overview
  • passthrough.md: Documents the temporary passthrough solution
  • main_frame_publisher.md: Details the frame publisher functionality
  • acting_testing.md: Provides testing instructions

The documentation structure accurately reflects the architectural changes splitting "acting" and "control" components.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if all referenced markdown files exist

echo "Checking referenced documentation files..."
for file in architecture_documentation.md passthrough.md main_frame_publisher.md acting_testing.md; do
  if [ -f "doc/acting/$file" ]; then
    echo "✓ Found: $file"
  else
    echo "✗ Missing: $file"
  fi
done

Length of output: 511


Script:

#!/bin/bash
# Let's check the content of the linked files to verify they exist and are properly structured
echo "Checking architecture_documentation.md..."
cat doc/acting/architecture_documentation.md 2>/dev/null || echo "File not found"

echo -e "\nChecking passthrough.md..."
cat doc/acting/passthrough.md 2>/dev/null || echo "File not found"

echo -e "\nChecking main_frame_publisher.md..."
cat doc/acting/main_frame_publisher.md 2>/dev/null || echo "File not found"

echo -e "\nChecking acting_testing.md..."
cat doc/acting/acting_testing.md 2>/dev/null || echo "File not found"

# Also check if there are any other markdown files in the acting directory
echo -e "\nListing all markdown files in doc/acting/..."
ls -1 doc/acting/*.md 2>/dev/null || echo "No markdown files found"

Length of output: 10620

🧰 Tools
🪛 Markdownlint

8-8: null
Files should end with a single newline character

(MD047, single-trailing-newline)

code/acting/launch/acting.launch (3)

18-20: Verify control.launch file setup

The inclusion of control.launch aligns with the PR objective to split acting and control functionality. However, we should verify:

  1. The existence of the control.launch file
  2. That it properly handles the control_loop_rate argument
#!/bin/bash
# Description: Verify control.launch file setup

# Check if control.launch exists and contains proper argument declaration
fd -e launch -x cat {} \; -g "control.launch"

# Verify control package is properly declared as dependency
rg "control" "package.xml"

13-16: Verify MainFramePublisher's dependency on control parameters

Both the passthrough and MainFramePublisher nodes use the same control_loop_rate parameter. Please verify if MainFramePublisher actually needs to be synchronized with the control loop rate.

✅ Verification successful

MainFramePublisher requires control_loop_rate for frame transformation timing

The MainFramePublisher node uses control_loop_rate to synchronize the transformation broadcasts between the global and hero frames. The parameter is used to set the timer frequency for publishing transforms (self.new_timer(self.control_loop_rate, loop)), which is essential for proper coordinate frame transformations used by sensors and visualization.

Key findings:

  • The node publishes TF transforms that convert between static main frame and moving hero frame
  • Transform updates must be synchronized with the control rate for consistent sensor data and visualization
  • Default value of 0.05 matches the control system's update rate
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check how MainFramePublisher uses the control_loop_rate parameter

# Search for control_loop_rate usage in MainFramePublisher
ast-grep --pattern 'rospy.get_param("control_loop_rate")' 
rg "control_loop_rate" --type py -g "MainFramePublisher.py"

Length of output: 1427


Script:

#!/bin/bash
# Let's try to find and examine the MainFramePublisher.py file first
fd MainFramePublisher.py

# Then let's look for any rate or loop related code in it
fd MainFramePublisher.py -x cat {} ';'

# Also search for any launch files that include MainFramePublisher
fd -e launch -x grep -l "MainFramePublisher" {} ';'

Length of output: 3283


4-4: Verify the control loop rate value

The control loop rate of 0.05 (20Hz) seems quite low for a control system. This could impact the system's responsiveness and performance.

✅ Verification successful

The initial search revealed an important comment in control.launch indicating the rate is specifically chosen for leaderboard compatibility. Let's gather more context about the control system implementation and documentation to make a fully informed decision.


Control loop rate of 0.05s (20Hz) is correctly set

The rate of 0.05s is intentionally chosen and consistent across the system:

  • It matches CARLA simulator's fixed delta seconds (carla_ros_bridge.launch)
  • A crucial comment in control.launch states "leaderboard expects commands every 0.05 seconds OTHERWISE IT LAGS REALLY BADLY"
  • This rate is consistently used across all components (perception, planning, acting, control)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for any documentation or comments about the control loop rate
# and check if this value is used consistently across the codebase

# Check for documentation about control loop rate
rg -i "control.*loop.*rate|loop.*rate|frequency|hz" "doc/"

# Check for other occurrences of this value
rg "0\.05|20.*hz" --type py --type launch

Length of output: 1427


Script:

#!/bin/bash
# Let's check Python files in control package for any timing-related code or comments
fd -e py -g 'control/' -x cat {} ';'

# Also check for any documentation files
fd README.md README.txt -x cat {} ';'

# And check for any other launch files that might reference this rate
fd -e launch -x cat {} ';'

Length of output: 14113

code/control/launch/control.launch (1)

1-28: Verify node dependencies and integration

Please verify:

  1. Whether these nodes have any required startup order
  2. The integration with the acting package's passthrough node
✅ Verification successful

Let me generate additional scripts to gather more information about the integration between acting and control packages, since the previous results didn't show the complete picture.


Let me try one more search strategy to find the connections between these packages:


Based on the code analysis, I can now provide a definitive response about the node dependencies and integration:

No strict startup order required, integration through passthrough node is verified

The control nodes are well-integrated through the acting package's passthrough node with clear topic mappings:

  • The passthrough node (code/acting/src/passthrough.py) handles all required topic translations:
    • /paf/acting/target_velocity/paf/hero/target_velocity
    • /paf/acting/trajectory/paf/hero/trajectory
    • /paf/acting/current_pos/paf/hero/current_pos
    • /paf/acting/current_heading/paf/hero/current_heading

The nodes can start in any order since:

  1. All nodes use ROS topic subscriptions which handle asynchronous connections
  2. Each controller node has proper null checks and debug logging for missing data
  3. The vehicle_controller intelligently switches between Stanley and Pure Pursuit based on velocity (>5 m/s uses Stanley)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for node dependencies and integration

# Look for node dependencies in launch files
echo "Checking for node dependencies..."
rg --type xml "depend|require" -A 5 -B 5

# Check how these nodes are referenced in the acting package
echo "Checking integration with acting package..."
rg --type xml "control.launch" -A 10 -B 10

# Look for topic connections between acting and control packages
echo "Checking for topic connections..."
ast-grep --pattern 'rospy.Publisher($_, $_)' 
ast-grep --pattern 'rospy.Subscriber($_, $_)'

Length of output: 22512


Script:

#!/bin/bash
# Check for launch file inclusions and node dependencies
echo "Checking launch file inclusions..."
rg --type xml "include.*control.launch" -A 5 -B 5

# Look for topic connections in control nodes
echo "Checking control nodes for topic connections..."
rg "rospy\.(Publisher|Subscriber)" code/control/ -A 2 -B 2

# Check acting nodes for control-related topics
echo "Checking acting nodes for control-related topics..."
rg "rospy\.(Publisher|Subscriber)" code/acting/ -A 2 -B 2

# Check for any launch file dependencies or required conditions
echo "Checking launch conditions..."
rg --type xml "required=\"true\"" -A 5 -B 5

Length of output: 582


Script:

#!/bin/bash
# Search for launch file references in all launch files
echo "Checking all launch files for control integration..."
fd -e launch -x cat {}

# Look for Python imports and topic connections in control nodes
echo "Checking control node implementations..."
fd -e py -t f . code/control/ -x cat {}

# Look for Python imports and topic connections in acting nodes
echo "Checking acting node implementations..."
fd -e py -t f . code/acting/ -x cat {}

Length of output: 79003

code/acting/src/acting/passthrough.py (4)

1-13: LGTM! Well-structured imports.

The imports are properly organized and demonstrate good practices:

  • ROS compatibility layer for version independence
  • Specific message type imports
  • Type hints support

71-87: LGTM! Well-structured node initialization.

The main function follows ROS best practices:

  • Proper node initialization
  • Error handling with graceful shutdown
  • Clean entry point implementation

28-28: 🛠️ Refactor suggestion

Make role_name configurable via ROS parameters.

The hard-coded role_name should be configurable to support different robot configurations.

-    role_name = "hero"  # Legacy will change soon
+    def __init__(self):
+        super().__init__('passthrough')
+        self.role_name = self.get_parameter_or('role_name', 'hero')

Likely invalid or redundant comment.


22-26: Consider monitoring message latency.

While the passthrough approach effectively decouples the control package from global dependencies, it introduces an additional hop in the message flow. For time-critical control operations, consider:

  1. Adding latency monitoring
  2. Implementing message timestamps validation
  3. Adding metrics for dropped messages
doc/control/architecture_documentation.md (1)

29-29: Verify referenced documentation files exist.

Please ensure all linked documentation files are present:

#!/bin/bash
# Check if referenced documentation files exist
docs=(
    "doc/control/steering_controllers.md"
    "doc/control/velocity_controller.md"
    "doc/control/vehicle_controller.md"
)

for doc in "${docs[@]}"; do
    if [ -f "$doc" ]; then
        echo "Found: $doc"
    else
        echo "Missing: $doc"
    fi
done

Also applies to: 55-55, 68-68

doc/acting/architecture_documentation.md (1)

7-11: LGTM! Table of contents accurately reflects the new architecture.

The restructured ToC clearly shows the separation of acting and control components, aligning with the PR objectives.

code/control/src/velocity_controller.py (1)

26-26: Verify topic naming convention consistency

While the target velocity subscription has been updated to use a fixed path /paf/acting/target_velocity, other topics (throttle, brake, reverse) still use role-based naming. This mixed approach might need to be reviewed for consistency with the acting/control split architecture.

✅ Verification successful

Topic naming pattern is intentionally split between fixed and role-based paths

The mixed approach in topic naming is actually correct and intentional as part of the acting/control split architecture:

  • The /paf/acting/* fixed paths are used for communication between acting and control nodes
  • Role-based paths (/paf/{role_name}/*) are used for internal communication within each component

This is evidenced by:

  1. All controllers (velocity, stanley, pure pursuit) consistently subscribe to /paf/acting/* topics for inputs
  2. The acting/passthrough.py module explicitly maps between role-based and fixed paths
  3. Internal control topics (throttle, brake, reverse) correctly maintain role-based naming
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for other potential topic references that might need updating
rg -A 2 "/paf/acting/" code/
# Check for remaining role-based topics
rg -A 2 "f\"/paf/\{self\.role_name\}" code/

Length of output: 23099

doc/control/steering_controllers.md (4)

Line range hint 27-31: LGTM: Mathematical formulas are well-documented.

The mathematical formulas for the PurePursuit controller are clearly presented with proper LaTeX formatting and variable explanations.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~41-~41: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...features to determine a steering-output is the so-called cross-track-error (e_...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)


[typographical] ~46-~46: It appears that a comma is missing.
Context: ...control/Steering_Stanley.png) At every moment it checks the closest point of the traj...

(DURING_THAT_TIME_COMMA)


Line range hint 50-54: LGTM: Stanley controller implementation details are clear.

The explanation of the Stanley controller's two main components (trajectory-heading and cross-track-error) is thorough and well-documented with proper mathematical notation.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~59-~59: If “ why” starts an indirect question, you do not need to put a comma before it.
Context: ...ey alot "weaker". We do not exactly know, why the two launches are this different. (D...

(NO_COMMA_BEFORE_INDIRECT_QUESTION)


18-18: Verify the updated path to the PurePursuit Controller implementation.

The documentation references the new path ../../code/control/src/pure_pursuit_controller.py. Let's verify this path exists after the restructuring.

✅ Verification successful

Path to PurePursuit Controller is correctly updated

The referenced path ../../code/control/src/pure_pursuit_controller.py in the documentation is verified to exist in the codebase after the restructuring.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the existence of the PurePursuit controller implementation
fd "pure_pursuit_controller.py" | grep "control/src"

Length of output: 94


23-23: Verify the updated image paths in the assets directory.

The documentation references several images that have been moved from acting to control directory. Let's verify these paths exist after the restructuring.

Also applies to: 34-34, 44-44, 57-57

✅ Verification successful

Image paths in the assets directory are correctly updated

The verification confirms that all referenced steering controller images are present in the new location under doc/assets/control/:

  • Steering_PurePursuit.png
  • Steering_Stanley.png
  • And additional related images
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the existence of controller images in the new location
echo "Checking for controller images in the new location..."
fd -e png . | grep "assets/control" | grep -E "Steering_(PurePursuit|Stanley)"

Length of output: 388

code/control/src/pure_pursuit_controller.py (2)

14-14: LGTM: Helper functions properly imported

The import of helper functions from the acting package is well-placed and the functions are properly utilized in the code.


Line range hint 36-57: Verify topic compatibility across the system

The subscription topics have been centralized under the 'acting' namespace, removing role-based naming. While this aligns with the restructuring goals, we should verify that:

  1. All publishers to these topics have been updated accordingly
  2. No other nodes still expect the role-based topic names
✅ Verification successful

Topic namespace changes require coordination with passthrough node

The verification reveals that the passthrough node (code/acting/src/acting/passthrough.py) is already handling the namespace transition correctly:

trajectory = passthrough(
    pub_name="/paf/acting/trajectory",
    sub_name=f"/paf/{role_name}/trajectory",
    ...
)
position = passthrough(
    pub_name="/paf/acting/current_pos",
    sub_name=f"/paf/{role_name}/current_pos",
    ...
)
heading = passthrough(
    pub_name="/paf/acting/current_heading",
    sub_name=f"/paf/{role_name}/current_heading",
    ...
)

The passthrough node acts as a bridge, subscribing to role-based topics and republishing to the new centralized /paf/acting/ namespace. This ensures compatibility between:

  • Publishers using role-based topics (e.g., position_heading_publisher_node.py)
  • Subscribers using centralized topics (e.g., pure_pursuit_controller.py)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify topic publishers and subscribers across the system

# Check for any remaining references to role-based trajectory topics
echo "Checking for role-based trajectory topic references..."
rg -l "paf/.+/trajectory" --type py

# Check for any remaining references to role-based current_pos topics
echo "Checking for role-based current_pos topic references..."
rg -l "paf/.+/current_pos" --type py

# Check for any remaining references to role-based current_heading topics
echo "Checking for role-based current_heading topic references..."
rg -l "paf/.+/current_heading" --type py

# Check for publishers to the new centralized topics
echo "Checking for publishers to new centralized topics..."
rg -l "publish.*paf/acting/(trajectory|current_pos|current_heading)" --type py

Length of output: 2241


Script:

#!/bin/bash
# Let's examine the actual topic references in these files to understand the context better

echo "Checking trajectory topic usage..."
rg "paf/.+/trajectory|paf/acting/trajectory" -B2 -A2 --type py

echo -e "\nChecking current_pos topic usage..."
rg "paf/.+/current_pos|paf/acting/current_pos" -B2 -A2 --type py

echo -e "\nChecking current_heading topic usage..."
rg "paf/.+/current_heading|paf/acting/current_heading" -B2 -A2 --type py

# Also check for any topic publishers in the codebase
echo -e "\nChecking for topic publishers..."
ast-grep --pattern 'self.create_publisher($_, $_, "paf/acting/trajectory")'
ast-grep --pattern 'self.create_publisher($_, $_, "paf/acting/current_pos")'
ast-grep --pattern 'self.create_publisher($_, $_, "paf/acting/current_heading")'

Length of output: 19449

code/control/src/stanley_controller.py (3)

Line range hint 1-283: Implementation looks solid!

The Stanley Controller implementation is well-structured with:

  • Clear separation of concerns
  • Proper error handling for edge cases
  • Comprehensive documentation
  • Consistent coding style

The only issues are the topic naming inconsistencies noted above.


15-15: Verify the new import path accessibility

The import path has been updated to use the new module structure acting.helper_functions.

✅ Verification successful

Import path is correctly structured and accessible

The verification confirms:

  • The helper_functions.py module exists at the correct location: code/acting/src/acting/helper_functions.py
  • The import is consistently used across both controller implementations:
    • code/control/src/stanley_controller.py
    • code/control/src/pure_pursuit_controller.py
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the new import path exists and is accessible
# Test: Check if the helper_functions module exists in the acting package
fd -e py "helper_functions.py" | grep "acting"

# Test: Check for any other potential imports of these functions
rg "from.*helper_functions import (vector_angle|points_to_vector)"

Length of output: 373


31-31: Verify topic compatibility across the system

The subscription topics have been changed to use a static "acting" namespace instead of the dynamic role_name. While this aligns with the PR's restructuring goal, we need to ensure all publishers have been updated accordingly.

Also applies to: 36-38, 50-52

✅ Verification successful

Topic changes are properly handled through a passthrough node

The change to static "acting" namespace is safe because:

  • The passthrough.py node in the acting package acts as a bridge, subscribing to the old dynamic topics (/paf/{role_name}/...) and republishing them to the new static topics (/paf/acting/...)
  • All publishers still use the dynamic role_name pattern
  • The control nodes (stanley_controller.py, pure_pursuit_controller.py) are the only subscribers to the new static topics
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify topic publishers and subscribers across the system
# Test: Search for any remaining uses of the old topic pattern
rg "/paf/\$\{.*role_name\}/(trajectory|current_pos|current_heading)"

# Test: Find all publishers to the new topics
ast-grep --pattern 'new_publisher($_, "/paf/acting/(trajectory|current_pos|current_heading)")'

Length of output: 166


Script:

#!/bin/bash
# Let's try a broader search for topic patterns and publishers
# Search for any remaining dynamic role_name patterns in topic strings
rg -g '*.py' -g '*.cpp' -g '*.hpp' "role_name.*trajectory|role_name.*current_pos|role_name.*current_heading" -A 2

# Search for the new static topic patterns
rg -g '*.py' -g '*.cpp' -g '*.hpp' "/paf/acting/(trajectory|current_pos|current_heading)" -A 2

# Look for create_publisher or Publisher patterns that might indicate topic publishing
ast-grep --pattern 'create_publisher($$$)'
ast-grep --pattern 'Publisher($$$)'

Length of output: 9744

Comment on lines 15 to 20
@dataclass
class passthrough:
pub_name: str
sub_name: str
topic_type: Type

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Rename class to follow Python naming conventions.

The class name should be in PascalCase as per PEP 8 conventions.

-class passthrough:
+class Passthrough:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@dataclass
class passthrough:
pub_name: str
sub_name: str
topic_type: Type
@dataclass
class Passthrough:
pub_name: str
sub_name: str
topic_type: Type


## Control Architecture

![MISSING: Control-ARCHITECTURE](./../assets/control/control_architecture.png)
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

⚠️ Potential issue

Fix the image path in the architecture documentation

The control architecture diagram exists at doc/assets/control/control_architecture.png, but the documentation is using an incorrect relative path (./../assets/control/control_architecture.png). Update the image reference to use the correct relative path: ../assets/control/control_architecture.png.

🔗 Analysis chain

Add the missing control architecture diagram.

The architecture diagram is marked as missing but is crucial for understanding the system's structure. Please ensure the image file exists at ./../assets/control/control_architecture.png.


Let me verify if the image exists in any other locations or if there are similar image files in the repository.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if the architecture diagram exists
if [ -f "assets/control/control_architecture.png" ]; then
    echo "Image exists"
else
    echo "Image missing"
fi

Length of output: 620


Script:

#!/bin/bash
# Search for control architecture image files in the repository
fd "control.*architecture.*\.png"

# Search for any PNG files in assets or doc directories containing "control"
fd ".*\.png" assets doc | grep -i "control"

Length of output: 678

Comment on lines 15 to 18
![MISSING: Acting-ARCHITECTURE](./../assets/acting/acting_architecture.png)

## Summary of Acting Components
> [!NOTE]
> [Click here to go to control architecture](./../control/architecture_documentation.md)
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Architecture diagram is missing and needs to be added

The architecture diagram file acting_architecture.png is missing from the expected path. Please:

  1. Add the architecture diagram at assets/acting/acting_architecture.png
  2. Ensure the diagram accurately represents the acting architecture
  3. Remove the "MISSING" text from the image alt once the diagram is added
🔗 Analysis chain

Verify architecture diagram and fix formatting.

  1. The "MISSING" text in the image alt suggests the diagram might be missing. Please verify that the diagram exists at ./../assets/acting/acting_architecture.png.
  2. Remove trailing spaces after the note blockquote marker.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the existence of the architecture diagram
if [ -f "assets/acting/acting_architecture.png" ]; then
    echo "Architecture diagram exists"
else
    echo "Architecture diagram is missing"
fi

Length of output: 123

🧰 Tools
🪛 Markdownlint

17-17: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (9)
doc/acting/passthrough.md (4)

4-5: Fix typo in the note section

There's a typo in the word "beeing" which should be "being".

->The passthrough component is a temporary solution while beeing in the transitioning phase of
+>The passthrough component is a temporary solution while being in the transitioning phase of

7-8: Improve summary sentence structure

The current wording is grammatically incorrect.

-**Summary:** This page is ought to provide an overview of the passthrough node and
-reason why it exists
+**Summary:** This page provides an overview of the passthrough node and explains its purpose
🧰 Tools
🪛 LanguageTool

[grammar] ~7-~7: Do not use the modal verb ‘ought’ after the verb ‘be’. Did you mean “ought”?
Context: ...ng and control. Summary: This page is ought to provide an overview of the passthrou...

(BE_MD)


22-25: Improve readability of the reasoning section

The section provides valuable context but needs grammatical improvements.

-Before the control package was outsourced and became its own package it resided within the acting package.
-Therefor many global dependencies existed in the control package. As the goal of the outsourcing was
-to eliminate global dependencies in control theory the passthrough node was created as a first stepping
-stone towards independence.
+Before the control package was outsourced and became its own package, it resided within the acting package.
+Therefore, many global dependencies existed in the control package. As the goal of the outsourcing was
+to eliminate global dependencies in control theory, the passthrough node was created as a first stepping
+stone towards independence.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~22-~22: A comma might be missing here.
Context: ...ckage was outsourced and became its own package it resided within the acting package. T...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[grammar] ~22-~22: Did you mean to write ‘therefore’?
Context: ...e it resided within the acting package. Therefor many global dependencies existed in the...

(THEREFORE)


[uncategorized] ~23-~23: A comma might be missing here.
Context: ...ded within the acting package. Therefor many global dependencies existed in the cont...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[uncategorized] ~24-~24: A comma might be missing here.
Context: ...liminate global dependencies in control theory the passthrough node was created as a f...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


25-25: Consider adding migration timeline information

Since this is described as a temporary solution, it would be helpful to add a section about:

  • The conditions or criteria for removing this temporary component
  • Any planned timeline for the complete separation of packages
  • Steps needed to achieve full independence between packages
doc/control/architecture_documentation.md (2)

4-7: Minor: Consider simplifying the wording

The summary is clear and well-documented. Consider simplifying "in order to" to "to" for more concise wording:

-of the vehicle in order to send [CarlaEgoVehicleControl]
+of the vehicle to send [CarlaEgoVehicleControl]
🧰 Tools
🪛 LanguageTool

[style] ~6-~6: Consider a shorter alternative to avoid wordiness.
Context: ...dge of the current state of the vehicle in order to send [CarlaEgoVehicleControl](https://c...

(IN_ORDER_TO_PREMIUM)


73-81: Consider grouping related inputs in vehicle_controller.py

The inputs could be more organized by grouping related parameters:

- Inputs:
-  - **emergency**: Bool
-  - **curr_behavior**: String
-  - **Speed**: CarlaSpeedometer
-  - **throttle**: Float32
-  - **brake**: Float32
-  - **pure_pursuit_steer**: Float32
-  - **stanley_steer**: Float32
+ Inputs:
+  Status:
+    - **emergency**: Bool
+    - **curr_behavior**: String
+    - **Speed**: CarlaSpeedometer
+  Control:
+    - **throttle**: Float32
+    - **brake**: Float32
+  Steering:
+    - **pure_pursuit_steer**: Float32
+    - **stanley_steer**: Float32
doc/acting/architecture_documentation.md (3)

3-5: Improve clarity in the summary

The summary effectively explains the relationship between components, but can be more concise.

Consider this revision:

-**Summary**: The acting component receives information from the [planning component](./../planning/README.md) as well
-as the [perception component](./../perception/README.md). It processes this information in order to
-navigate on a local basis. This information is then processed in the [control_component](./../control/README.md).
+**Summary**: The acting component receives information from the [planning component](./../planning/README.md) and
+[perception component](./../perception/README.md). It processes this information for local navigation,
+which is then handled by the [control_component](./../control/README.md).
🧰 Tools
🪛 LanguageTool

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)


33-33: Fix typo in input type

There's a typo in the input type.

-- **current_pos**: PoseStampled
+- **current_pos**: PoseStamped

Line range hint 45-83: Consider organizing helper functions by component

With the split between acting and control components, consider grouping these helper functions based on their primary usage (acting vs. control) or moving control-specific functions to the control component.

Consider:

  1. Creating separate helper modules for acting and control
  2. Moving control-specific functions (e.g., those related to vehicle control calculations) to the control component
  3. Keeping only generic utilities in this shared helper module

Would you like assistance in analyzing function usage patterns to determine the optimal organization?

🧰 Tools
🪛 LanguageTool

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5760c6d and 4fb8afb.

📒 Files selected for processing (5)
  • doc/acting/README.md (1 hunks)
  • doc/acting/architecture_documentation.md (1 hunks)
  • doc/acting/passthrough.md (1 hunks)
  • doc/control/README.md (1 hunks)
  • doc/control/architecture_documentation.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • doc/acting/README.md
  • doc/control/README.md
🧰 Additional context used
🪛 LanguageTool
doc/acting/architecture_documentation.md

[style] ~4-~4: Consider a shorter alternative to avoid wordiness.
Context: ...ADME.md). It processes this information in order to navigate on a local basis. This informa...

(IN_ORDER_TO_PREMIUM)

doc/acting/passthrough.md

[grammar] ~7-~7: Do not use the modal verb ‘ought’ after the verb ‘be’. Did you mean “ought”?
Context: ...ng and control. Summary: This page is ought to provide an overview of the passthrou...

(BE_MD)


[uncategorized] ~22-~22: A comma might be missing here.
Context: ...ckage was outsourced and became its own package it resided within the acting package. T...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[grammar] ~22-~22: Did you mean to write ‘therefore’?
Context: ...e it resided within the acting package. Therefor many global dependencies existed in the...

(THEREFORE)


[uncategorized] ~23-~23: A comma might be missing here.
Context: ...ded within the acting package. Therefor many global dependencies existed in the cont...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[uncategorized] ~24-~24: A comma might be missing here.
Context: ...liminate global dependencies in control theory the passthrough node was created as a f...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)

doc/control/architecture_documentation.md

[style] ~6-~6: Consider a shorter alternative to avoid wordiness.
Context: ...dge of the current state of the vehicle in order to send [CarlaEgoVehicleControl](https://c...

(IN_ORDER_TO_PREMIUM)


[style] ~70-~70: Using many exclamation marks might seem excessive (in this case: 4 exclamation marks for a text that’s 1959 characters long)
Context: ... Float32 ### vehicle_controller.py > [!TIP] > Follow this link for [Documentati...

(EN_EXCESSIVE_EXCLAMATION)

🔇 Additional comments (4)
doc/acting/passthrough.md (1)

13-19: LGTM! Clear and well-referenced overview section

The overview effectively explains the node's functionality and provides a helpful reference to the architecture documentation.

doc/control/architecture_documentation.md (2)

9-16: LGTM: Well-structured table of contents

The table of contents provides a clear and logical structure for the documentation.


20-23: Fix relative paths in documentation

The following paths need to be corrected:

  1. Architecture diagram path
  2. Acting architecture documentation path
-![MISSING: Control-ARCHITECTURE](./../assets/control/control_architecture.png)
+![MISSING: Control-ARCHITECTURE](../assets/control/control_architecture.png)

-> [Click here to go to acting architecture](./../acting/architecture_documentation.md)
+> [Click here to go to acting architecture](../acting/architecture_documentation.md)
doc/acting/architecture_documentation.md (1)

37-43: Verify frame transformation calculations

The frame transformation calculations look correct but should be verified to ensure they match the implementation, especially given the architectural split between acting and control components.

✅ Verification successful

Let me gather more information about the frame transformation implementation.


Let me check the coordinate transformation implementation in perception to ensure consistency.


Frame transformation calculations are correctly implemented

The implementation in MainFramePublisher.py matches the documented transformation in architecture_documentation.md:

  • The rotation calculation uses -current_heading as specified
  • Position transformations use the correct trigonometric formulas:
    pos[0] = cos(rot) * current_pos.pose.position.x - sin(rot) * current_pos.pose.position.y  # x
    pos[1] = sin(rot) * current_pos.pose.position.x + cos(rot) * current_pos.pose.position.y  # y
    pos[2] = -current_pos.pose.position.z  # z
  • The quaternion transformation and frame naming ("global" to "hero") are also consistent
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for frame transformation implementation
echo "Searching for frame transformation implementation..."
rg -l "TransformBroadcaster" --type py

# Search for the specific transformation calculations
echo "Searching for transformation calculations..."
ast-grep --pattern 'position_x = cos($rotation) * $current_pos + sin($rotation) * $current_pos'

Length of output: 395


Script:

#!/bin/bash
# Check the actual implementation in MainFramePublisher.py
echo "Content of MainFramePublisher.py:"
cat code/acting/src/acting/MainFramePublisher.py

# Search for any other files that might contain frame transformations
echo -e "\nSearching for files with frame/transform related names:"
fd -t f "frame|transform" --exec grep -l "rotation\|position"

Length of output: 3542


Script:

#!/bin/bash
# Check the coordinate transformation implementation
echo "Content of coordinate_transformation.py:"
cat code/perception/src/coordinate_transformation.py

# Check the coordinate transformation documentation
echo -e "\nContent of coordinate_transformation.md:"
cat doc/perception/coordinate_transformation.md

Length of output: 8710

Copy link
Collaborator

Choose a reason for hiding this comment

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

having a "passthrough" class in upper and lowercase is VERY confusing, but i see one is a dataclass and the other is not.
could you please explain why it is not possible to name the dataclass different ?

@ll7 ll7 requested a review from Copilot November 19, 2024 13:53

Choose a reason for hiding this comment

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

Copilot reviewed 23 out of 31 changed files in this pull request and generated no suggestions.

Files not reviewed (8)
  • code/acting/launch/acting.launch: Language not supported
  • code/control/CMakeLists.txt: Language not supported
  • code/control/launch/control.launch: Language not supported
  • code/control/package.xml: Language not supported
  • code/control/src/pure_pursuit_controller.py: Evaluated as low risk
  • code/control/src/stanley_controller.py: Evaluated as low risk
  • code/control/src/velocity_controller.py: Evaluated as low risk
  • doc/acting/README.md: Evaluated as low risk
Comments skipped due to low confidence (1)

doc/acting/acting_testing.md:13

  • The word 'necesarry' is misspelled. It should be 'necessary'.
There is a dedicated [acting_debug.launch](../../code/acting/launch/acting_debug.launch) file which starts the acting component **as well as the necesarry perception components** automatically.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (3)
code/acting/src/acting/passthrough.py (3)

59-68: Add error handling and QoS documentation

The publisher/subscriber setup needs improvement in two areas:

  1. The hardcoded QoS profile value of 1 should be documented or made configurable
  2. Missing error handling for failed message delivery

Consider adding:

     def __init__(self):
+        super().__init__('passthrough')
+        self.qos_profile = self.get_parameter_or('qos_profile', 1).value
         self.publishers: Dict[str, Publisher] = {}
         self.subscribers: Dict[str, Subscriber] = {}
         for topic in self.mapped_topics:
             self.publishers[topic.pub_name] = self.new_publisher(
                 topic.topic_type,
                 topic.pub_name,
-                qos_profile=1
+                qos_profile=self.qos_profile
             )

+            def safe_callback(msg):
+                try:
+                    self.publishers[topic.pub_name].publish(msg)
+                except Exception as e:
+                    self.get_logger().error(f"Failed to publish message: {e}")

             self.subscribers[topic.pub_name] = self.new_subscription(
                 topic.topic_type,
                 topic.sub_name,
-                callback=self.publishers[topic.pub_name].publish,
+                callback=safe_callback,
-                qos_profile=1,
+                qos_profile=self.qos_profile,
             )

71-84: Enhance error handling in main function

While the function handles KeyboardInterrupt, it should catch and log other potential exceptions for better debugging.

 def main(args=None):
     roscomp.init("passthrough", args=args)
+    node = None
 
     try:
         node = Passthrough()
         node.spin()
     except KeyboardInterrupt:
         pass
+    except Exception as e:
+        import traceback
+        print(f"Node failed with error: {e}")
+        print(traceback.format_exc())
+        return 1
     finally:
+        if node:
+            node.destroy_node()
         roscomp.shutdown()
+    return 0

22-26: Consider documenting the architectural decision

The passthrough node effectively facilitates the separation of acting and control packages. Consider adding more detailed documentation about:

  1. The architectural decision behind this separation
  2. The relationship between acting and control packages
  3. Future plans for removing legacy dependencies

Would you like me to help draft an architectural decision record (ADR) for this change?

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 4fb8afb and 9cb4c9e.

📒 Files selected for processing (1)
  • code/acting/src/acting/passthrough.py (1 hunks)

Comment on lines +31 to +51
target_velocity = TopicMapping(
pub_name="/paf/acting/target_velocity",
sub_name=f"/paf/{role_name}/target_velocity",
topic_type=Float32,
)
# Topics for steering controllers
trajectory = TopicMapping(
pub_name="/paf/acting/trajectory",
sub_name=f"/paf/{role_name}/trajectory",
topic_type=Path,
)
position = TopicMapping(
pub_name="/paf/acting/current_pos",
sub_name=f"/paf/{role_name}/current_pos",
topic_type=PoseStamped,
)
heading = TopicMapping(
pub_name="/paf/acting/current_heading",
sub_name=f"/paf/{role_name}/current_heading",
topic_type=Float32,
)
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve topic configuration management

The topic paths are currently hardcoded with f-strings. Consider moving these configurations to a separate configuration file or ROS parameters for better maintainability.

Example approach:

def get_topic_mappings(self):
    return [
        TopicMapping(
            pub_name=self.get_parameter_or('target_velocity_pub', '/paf/acting/target_velocity').value,
            sub_name=self.get_parameter_or('target_velocity_sub', f'/paf/{self.role_name}/target_velocity').value,
            topic_type=Float32
        ),
        # ... other mappings
    ]

but is only dependent on the acting package.
"""

role_name = "hero" # Legacy will change soon
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove hardcoded role_name value

The comment indicates this is legacy code that will change soon. Consider making this configurable through ROS parameters instead of hardcoding.

-    role_name = "hero"  # Legacy will change soon
+    def __init__(self):
+        super().__init__('passthrough')
+        self.role_name = self.get_parameter_or('role_name', 'hero').value

Committable suggestion skipped: line range outside the PR's diff.

@vinzenzm vinzenzm merged commit 9702edd into main Nov 22, 2024
4 checks passed
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.

[Feature]: Split up Acting / Controller
2 participants