-
Notifications
You must be signed in to change notification settings - Fork 26
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
Not able to run the demo #19
Comments
Hey @amodpatil1, have you source ( |
Yes, I did source the workspace before the running the command and I tried it multiple times and I also tried doing from start as well, but it did not work. |
I think there is some problem with the action_client_demo.py |
Have you colcon all the yasmin packages (yasmin, yasmin_msgs, yasmin_demo, yasmin_ros, yasmin_viewe) or only yasmin? |
I did it for yasmin only. Shouldn't the entire package get built when I do Colcon build? |
No, since they are different packages. |
okay I will try that. |
Starting >>> yasmin_demo
|
That is a problem with the ROS 2 distro. Foxy EOL was on June 20th, 2023. Thus, yasmin was updated to Humble. |
I have just added support for Foxy. It should work now. |
okay I will try |
--- stderr: yasmin_demo
|
Pull and try again. I have done another update. |
It is working now. But now there is this ros2 run demo_nodes_py add_two_ints_servers |
The service demo is not running |
Both the commands are not executable |
You have to install the ROS 2 demo packages (ros-humble-demo-nodes-py, ros-humble-demo-nodes-cpp, ros-humble-action-tutorials-py, ros-humble-action-tutorials-cpp). |
I am able to find the demos for foxy, can you please help me out? |
Have you tried to install them with |
Yes it started working but I am not able to understand how can I build a custom FSM on yasmin. Could we please have a call on this where you can explain me the implementation of yasmin on my project? |
@amodpatil1, you have several examples in the README that includes basic states, ROS 2-based states and a demo with Nav2. If you want further explanations, you can send me an email. |
Do I need to have a separate package for my state machine? |
Yes, you should create a new package with your code. |
do I need to add the dependencies from yasmin into my package.xml as well? |
No, but you can add them to the package.xml. |
What would be the effieicent way to implement yasmin? Would it be via creating a package or a YAML file? |
Can I use this as a reference for my custom machine? Copyright (C) 2023 Miguel Ángel González SantamartaThis program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program. If not, see https://www.gnu.org/licenses/.from typing import Dict, List, Union class StateMachine(State):
|
I prefer using new packages. What do you mean by a YAML file?
What do you mean by reference? |
I mean can I write my state machine using the one you wrote as a base for mine custom state machine |
states:
This is the example for the yaml file |
Can you send me the screenshot of it? |
Here you have a video. I am pushing msgs in different topics and different tabs. Is this what you want? Screencast.2024-06-17.18.18.58.mp4 |
Yes this is what I want. Did you do any changes in the yasmin_node? |
No, I haven't changed anything. I have just executed it as you gave me. |
Now I just want to listen to multiple topics simultaneously when the state machine is running, after this my state machine will complete |
I am not able to listen to a single node as well. |
Isn't it what I just showed you in the video?
What do you mean by listening to a node? |
Yes, I tried the same approach as you did but there was no change in the states. |
I don't know what could be happening. Put some logs in the subscriber callbacks to check if your node is receiving msgs. It may also be a problem with the ROS 2 distro, I am using Humble. |
It ran It was my mistake it was executing the wrong executable. |
#!/usr/bin/env python3 Copyright (C) 2023 Miguel Ángel González SantamartaThis program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program. If not, see https://www.gnu.org/licenses/.import time class FSMNode(Node):
define state Idleclass IdleState(State):
define state Drivingclass DrivingState(State):
define state StopObstacleclass StopObstacleState(State):
define state StopNearParkclass StopNearParkState(State):
define state Parkclass ParkState(State):
maindef main():
if name == "main": This is the code and now I am not able to run the viewer node. |
It was running before |
I have just run it and everything works. Which environment are you using (Ubuntu version, ROS 2 distro, etc)? |
ubuntu 20.04 and ros2 foxy |
Untitled.video.-.Made.with.Clipchamp.mp4 |
Update yasmin by using git pull and try it again. |
Okay |
I will try now |
There is no change |
I will try by cloning it again |
Not working even after cloning it again |
Have you used colcon and source after updating? |
Yes |
I have just found an error with the transitions of your state machine. You are trying to move to a state/outcome named "PARKED" that does not exist. Changing it to an existing outcome or state solves your error. Here you have an example: #!/usr/bin/env python3
import threading
import time
import math
import rclpy
from rclpy.node import Node
from std_msgs.msg import Bool
from geometry_msgs.msg import Pose
from yasmin import State
from yasmin import Blackboard
from yasmin import StateMachine
from yasmin_viewer import YasminViewerPub
class FSMNode(Node):
def __init__(self, blackboard):
super().__init__('fsm_node')
self.blackboard = blackboard
self.create_subscription(Bool, '/vi_start', self.vi_start_callback, 10)
self.create_subscription(Pose, '/loc_pose', self.loc_pose_callback, 10)
self.create_subscription(Bool, '/stop', self.stop_callback, 10)
self.create_subscription(Pose, '/route', self.route_callback, 10)
self.create_subscription(Bool, '/trajpf', self.trajpf_callback, 10)
self.create_subscription(Bool, '/trajpr', self.trajpr_callback, 10)
print("init")
def vi_start_callback(self, msg):
self.blackboard.adapt_vi_start_trigger = msg.data
def loc_pose_callback(self, msg):
self.blackboard.adapt_loc = (msg.position.x, msg.position.y)
def stop_callback(self, msg):
self.blackboard.adapt_envmod = msg.data
# If an obstacle is detected, inform adapt_trajp to stop
if msg.data: # Assuming True means obstacle detected
stop_msg = Bool()
stop_msg.data = True
self.blackboard.adapt_trajp_publisher.publish(stop_msg)
def route_callback(self, msg):
self.blackboard.adapt_roucomp = (msg.position.x, msg.position.y)
def trajpf_callback(self, msg):
self.blackboard.trajpf_complete = msg.data
def trajpr_callback(self, msg):
self.blackboard.trajpr_complete = msg.data
class IdleState(State):
def __init__(self) -> None:
super().__init__(["driving_state"])
self.logger = rclpy.logging.get_logger('IdleState')
def execute(self, blackboard: Blackboard) -> str:
print("Executing state IDLE")
# Wait for start trigger from adapt_vi
while not blackboard.adapt_vi_start_trigger:
self.logger.info('going to sleep')
time.sleep(0.1)
return "driving_state"
class DrivingState(State):
def __init__(self) -> None:
super().__init__(["drive", "stop_obstacle", "stop_near_park"])
def execute(self, blackboard: Blackboard) -> str:
print("Executing state DRIVING")
time.sleep(3)
# Check for obstacle detection
if blackboard.adapt_envmod:
print("Obstacle detected by adapt_envmod")
return "stop_obstacle"
# Calculate distance to parking spot
vehicle_location = blackboard.adapt_loc
parking_spot_location = blackboard.adapt_roucomp
distance_to_parking_spot = math.sqrt(
(parking_spot_location[0] - vehicle_location[0]) ** 2 +
(parking_spot_location[1] - vehicle_location[1]) ** 2
)
if distance_to_parking_spot < blackboard.parking_threshold:
print("Near parking spot")
blackboard.adapt_trajp = True
return "stop_near_park"
return "drive"
class StopObstacleState(State):
def __init__(self) -> None:
super().__init__(["stop"])
def execute(self, blackboard: Blackboard) -> str:
print("Executing state STOP_OBSTACLE")
time.sleep(2)
# Check if adapt_envmod detects an obstacle (assuming adapt_envmod is True means obstacle detected)
if blackboard.adapt_envmod:
print("Obstacle detected by adapt_envmod")
# Inform adapt_trajp to stop
stop_msg = Bool()
stop_msg.data = True
blackboard.adapt_trajp_publisher.publish(stop_msg)
return "stop"
class StopNearParkState(State):
def __init__(self) -> None:
super().__init__(["park"])
def execute(self, blackboard: Blackboard) -> str:
print("Executing state STOP_NEAR_PARK")
time.sleep(2)
# Trigger parking procedure
blackboard.adapt_trajp = True
return "park"
class ParkState(State):
def __init__(self) -> None:
super().__init__(["parked"])
def execute(self, blackboard: Blackboard) -> str:
print("Executing state PARK")
while not blackboard.trajpf_complete:
time.sleep(0.1)
while not blackboard.trajpr_complete:
time.sleep(0.1)
print("Vehicle parked")
return "parked"
def main():
print("yasmin_demo")
# init ROS 2
rclpy.init()
# create a FSM
sm = StateMachine(outcomes=["finished"])
# create and set blackboard
blackboard = Blackboard()
blackboard.obstacle_detected = False
blackboard.near_parking_spot = False
blackboard.adapt_vi_start_trigger = False # Initial state of the start trigger
# Initialize adapt_loc with a tuple representing coordinates
blackboard.adapt_loc = (0, 0)
blackboard.adapt_obj = None # Initialize adapt_obj
blackboard.adapt_livtrac = None # Initialize adapt_livtrac
# Initialize adapt_roucomp with a dummy parking spot location
blackboard.adapt_roucomp = (10, 10)
blackboard.adapt_trajp = False # Initialize adapt_trajp
blackboard.adapt_envmod = False # Initialize adapt_envmod as no obstacle detected
# Distance threshold for parking spot detection
blackboard.parking_threshold = 1.0
blackboard.trajpf_complete = False # Initialize trajpf_complete
blackboard.trajpr_complete = False # Initialize trajpr_complete
# init ROS 2 node
fsm_node = FSMNode(blackboard)
blackboard.adapt_trajp_publisher = fsm_node.create_publisher(
Bool, '/adapt_trajp', 10)
# add states
sm.add_state(
"IDLE",
IdleState(),
transitions={
"driving_state": "DRIVING"
}
)
sm.add_state(
"DRIVING",
DrivingState(),
transitions={
"drive": "DRIVING",
"stop_obstacle": "STOP_OBSTACLE",
"stop_near_park": "STOP_NEAR_PARK"
}
)
sm.add_state(
"STOP_OBSTACLE",
StopObstacleState(),
transitions={
"stop": "STOP_OBSTACLE" # Ensure outcome is "stop" when obstacle detected
}
)
sm.add_state(
"STOP_NEAR_PARK",
StopNearParkState(),
transitions={
"park": "PARK"
}
)
sm.add_state(
"PARK",
ParkState(),
transitions={
"parked": "finished" # Changed outcome to "parked"
}
)
# pub FSM info
YasminViewerPub("YASMIN_DEMO", sm)
# execute FSM
def execute_fsm():
outcome = sm.execute(blackboard)
print(outcome)
fsm_thread = threading.Thread(target=execute_fsm)
fsm_thread.start()
# Spin ROS 2 node
rclpy.spin(fsm_node)
# Shutdown
fsm_thread.join()
rclpy.shutdown()
if __name__ == "__main__":
main() |
Hi, I have one issue that I want to stay one state only and that state should not have a transition. How do I do that? |
Hey @amodpatil1, all states should have transitions and a path to your state machine's final outcome. You can also make a transition from a state to itself, creating a loop and staying in that state till the transition to another state or a final outcome triggers. |
Okay |
colcon build --packages-select yasmin
ros2 run yasmin_demo yasmin_demo.py
Package 'yasmin_demo' not found
not able to run the command. please help me out.
The text was updated successfully, but these errors were encountered: