Navigation¶
This example is similar to Click-and-drive but includes a PathPlanner
to find a path around an obstacle.
#!/usr/bin/env python3
from nicegui import ui
from nicegui.events import SceneClickEventArguments
from rosys.automation import Automator
from rosys.driving import Driver, Odometer, robot_object
from rosys.geometry import Point, Pose, Prism
from rosys.hardware import RobotSimulation, WheelsSimulation
from rosys.pathplanning import Obstacle, PathPlanner, obstacle_object, path_object
shape = Prism.default_robot_shape()
PathPlanner.USE_PERSISTENCE = False
path_planner = PathPlanner(shape)
path_planner.obstacles['0'] = Obstacle(id='0', outline=[Point(x=3, y=0), Point(x=0, y=3), Point(x=3, y=3)])
wheels = WheelsSimulation()
robot = RobotSimulation([wheels])
odometer = Odometer(wheels)
driver = Driver(wheels, odometer)
automator = Automator(None, on_interrupt=wheels.stop)
async def handle_click(e: SceneClickEventArguments):
for hit in e.hits:
if hit.object_id == 'ground':
goal = Pose(x=hit.x, y=hit.y, yaw=odometer.prediction.direction(Point(x=hit.x, y=hit.y)))
path = await path_planner.search(start=odometer.prediction, goal=goal)
path3d.update(path)
automator.start(driver.drive_path(path))
with ui.scene(on_click=handle_click, width=600):
robot_object(shape, odometer)
obstacle_object(path_planner)
path3d = path_object()
ui.label('click into the scene to drive the robot')
ui.run(title='RoSys')
Path Following¶
When following a path, a "carrot" is dragged along a spline and the robot follows it like a donkey. Additionally, there is a virtual "hook" attached to the robot, which is pulled towards the carrot.
There are three parameters:
hook_offset
: How far from the wheel axis (i.e. the coordinate center of the robot) is the hook, which is pulled towards the carrot.carrot_offset
: How far ahead of the carrot is the robot pulled. This parameter is necessary in order to have the hook pulled a bit further, even though the carrot already reached the end of the spline.carrot_distance
: How long is the "thread" between hook and carrot (or the offset point ahead of the carrot, respectively).
In the following illustration these points are depicted as spheres: the coordinate center of the robot (blue, small), the hook (blue, large), carrot (orange, small), offset point ahead of the carrot (orange, large).
You can display a wire frame version of the robot by passing debug=true
to the robot_object
.
Note
The automation drive_spline
has an optional argument flip_hook
.
It turns the hook 180 degrees to the back of the robot, while preserving the distance hook_offset
to the robot's coordinate center.
This allows the robot to drive backwards to a point behind it instead of turning around and approaching it forwards.
A more complex example can be found in the RoSys GitHub repository. There you can create new obstacles and choose between straight driving or navigation.