-
Notifications
You must be signed in to change notification settings - Fork 304
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
Fix hardware component unconfiguration #1755
base: master
Are you sure you want to change the base?
Fix hardware component unconfiguration #1755
Conversation
@sahand-ghaffari-ocado, all pull requests must be targeted towards the |
This pull request is in conflict. Could you fix it @sahand-ghaffari-ocado? |
420cb16
to
3fa2c3f
Compare
3fa2c3f
to
eb4c19d
Compare
Can the issue be reproduced via a unit test? Could you please add one if possible? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sahand-ghaffari-ocado regarding your issues, it might happen in Humble, but I don't think this is the case with the Rolling version.
Could you try to check with your setup by compiling from sources (Development version), this way you can run the setup of the Rolling on Humble without any issues.
vcs import --input https://raw.githubusercontent.com/ros-controls/ros2_control_ci/master/ros_controls.rolling-on-$ROS_DISTRO.repos src
If you confirm this is working, then we just have to do some backports to have a proper fix on Humble. For instance, #1646 should kind of fix this issue.
@sahand-ghaffari-ocado any update on this? |
@saikishor thank you for your response. I haven't had the chance to test the Rolling version yet, but I plan to give it a try soon. |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #1755 +/- ##
=======================================
Coverage 86.77% 86.78%
=======================================
Files 116 116
Lines 10703 10703
Branches 981 967 -14
=======================================
+ Hits 9288 9289 +1
Misses 1062 1062
+ Partials 353 352 -1
Flags with carried forward coverage won't be shown. Click here to find out more.
|
Summary
Unconfiguring a hardware component using the
~/set_hardware_component_state
service results in code failures. This occurs because theon_cleanup()
function removes resources while the read and write functions of the hardware component are still attempting to access those resources. The issue arises because the primary state is not set toUNCONFIGURED
until after theon_cleanup
function is executed, rather than before it is called.Problem Description
~/set_hardware_component_state
service call is invoked, theset_hardware_component_state_srv_cb()
function is executed. This function then callsset_component_state()
function. In this function, thecleanup_hardware()
function is called when the target state isPRIMARY_STATE_UNCONFIGURED
.cleanup_hardware
function uses the bind method to call thecleanup
method of either the SystemInterface, SensorInterface, or ActuatorInterface class, depending on the type of hardware component. Thecleanup()
function, in turn, calls theon_cleanup
function of the hardware component class. In this context, theon_cleanup
function is called in theURPositionHardwareInterface
class, which is defined in theUniversal_Robots_ROS2_Driver
repository and inherits fromhardware_interface::SystemInterface
.on_cleanup
function removes and unassigns pointers, as well as cleans up threads, while the read and write functions of theControllerManager
class continue running. The read and write functions in theControllerManager
class call the corresponding read and write functions in theResourceManager
class, which then invoke the read and write functions of the hardware components from theSystemInterface
,SensorInterface
, orActuatorInterface
classes. These functions first check if the state isPRIMARY_STATE_INACTIVE
orPRIMARY_STATE_ACTIVE
before executing the read and write operations on the hardware component.on_cleanup
function is called and removes some of the resources while the state of the robot has not yet been set toUNCONFIGURED
, the read and write functions of the hardware component can still be called. Since these functions attempt to access resources that have already been removed, this can result in code crashes.Environment:
Proposed Solution
To prevent such crashes, it's suggested to ensure that the state is properly set to
UNCONFIGURED
before any resources are cleaned up. This way, the read and write functions will not be invoked after resources have been removed, avoiding access to invalid or dangling pointers. Therefore, it is suggested to modify thecleanup()
function inSystemInterface
,SensorInterface
orActuatorInterface