-
Notifications
You must be signed in to change notification settings - Fork 0
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
529 - Implement service for planning - acting communication #549
Changes from all commits
cfcb486
ffbb8fd
b807fea
391a113
d604775
3336a2f
de3c919
26a344e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,82 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
#!/usr/bin/env python | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# import BehaviourEnum | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import ros_compatibility as roscomp | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from ros_compatibility.node import CompatibleNode | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from rospy import Subscriber, Publisher | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import rospy | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from planning.srv import RequestBehaviourChange, RequestBehaviourChangeResponse | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from std_msgs.msg import String, Int8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
class RequestBehaviourChangeService(CompatibleNode): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
super(RequestBehaviourChangeService, self).__init__( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"RequestBehaviourChangeService" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.role_name = self.get_param("role_name", "hero") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.control_loop_rate = self.get_param("control_loop_rate", 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.__curr_behavior = None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
self.service = rospy.Service( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"RequestBehaviourChange", | ||||||||||||||||||||||||||||||||||||||||||||||||||||
RequestBehaviourChange, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.handle_request_behaviour_change, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
self.behaviour_pub: Publisher = self.new_publisher( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Int8, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
f"/paf/{self.role_name}/behaviour_request", | ||||||||||||||||||||||||||||||||||||||||||||||||||||
qos_profile=1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
self.curr_behavior_sub: Subscriber = self.new_subscription( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
String, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
f"/paf/{self.role_name}/curr_behavior", | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.__set_curr_behavior, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
qos_profile=1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
self.behaviour_pub.publish(0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
rospy.spin() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+39
to
+40
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Document initial behavior request and remove blocking spin() The initial behavior request of 0 needs documentation explaining its purpose. Also, + # Initialize with default cruise behavior (0)
self.behaviour_pub.publish(0)
- rospy.spin() 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def __set_curr_behavior(self, data: String): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Sets the received current behavior of the vehicle. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.__curr_behavior = data.data | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def handle_request_behaviour_change(self, req): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.__curr_behavior == "us_unstuck" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
or self.__curr_behavior == "us_stop" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
or self.__curr_behavior == "us_overtake" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
or self.__curr_behavior == "Cruise" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.behaviour_pub.publish(req.request) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return RequestBehaviourChangeResponse(True) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return RequestBehaviourChangeResponse(False) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+48
to
+58
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle the case when If Apply this diff to incorporate the check: def handle_request_behaviour_change(self, req):
+ if self.__curr_behavior is None:
+ rospy.logwarn("Current behavior is not set yet.")
+ return RequestBehaviourChangeResponse(False)
if (
self.__curr_behavior == "us_unstuck"
or self.__curr_behavior == "us_stop"
or self.__curr_behavior == "us_overtake"
or self.__curr_behavior == "Cruise"
):
self.behaviour_pub.publish(req.request)
return RequestBehaviourChangeResponse(True)
else:
return RequestBehaviourChangeResponse(False) 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def run(self): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Control loop | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
:return: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
self.spin() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+60
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Implement control loop in run method The run method's docstring mentions a control loop but doesn't implement one. Either implement the loop or update the docstring. def run(self):
"""
- Control loop
-
- :return:
+ Runs the node's main loop using ROS spin.
"""
self.spin() 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if __name__ == "__main__": | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
main function starts the RequestBehaviourChangeService node | ||||||||||||||||||||||||||||||||||||||||||||||||||||
:param args: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
roscomp.init("RequestBehaviourChangeService") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
node = RequestBehaviourChangeService() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
node.run() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
except KeyboardInterrupt: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
pass | ||||||||||||||||||||||||||||||||||||||||||||||||||||
finally: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
roscomp.shutdown() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
uint8 request | ||
--- | ||
bool answer |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# Request Behaviour Change Service | ||
|
||
This service is hosted in the node RequestBehaviourChangeService. | ||
|
||
Calling it requires a behaviour ID integer (based on the corresponding enum) and returns a bool depending on whether the request is granted. | ||
|
||
To use it, import RequestBehaviourChange from planning.srv. | ||
|
||
Comment on lines
+3
to
+8
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Enhance service documentation with behavior ID details. The documentation should specify:
🧰 Tools🪛 Markdownlint (0.35.0)1-1: null (MD041, first-line-heading, first-line-h1) |
||
To call it, create a callable instance with: | ||
|
||
```python | ||
rospy.wait_for_service('RequestBehaviourChange') | ||
|
||
name = rospy.ServiceProxy('RequestBehaviourChange', RequestBehaviourChange) | ||
``` | ||
|
||
Then, you can just use this instance in a try setup: | ||
|
||
```python | ||
try: | ||
response = name(input) | ||
except rospy.ServiceException as e: | ||
# handle exception | ||
``` | ||
|
||
For communication with the behaviour tree this node publishes a granted request to a topic behaviour_request. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add details about behaviour_request topic. The documentation should specify:
🧰 Tools🪛 LanguageTool[uncategorized] ~24-~24: Possible missing comma found. (AI_HYDRA_LEO_MISSING_COMMA)
Comment on lines
+1
to
+26
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add missing sections to complete the documentation. The documentation should include additional sections:
Would you like me to help generate content for these sections? 🧰 Tools🪛 LanguageTool[uncategorized] ~26-~26: Possible missing comma found. (AI_HYDRA_LEO_MISSING_COMMA) |
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.
🛠️ Refactor suggestion
Include role_name in service name for multi-robot scenarios
The service name should be namespaced with
role_name
to support multiple robots: