===== T3b-rrt - Curvature-constrained local planning in RRT ====== The main task is to implement the Rapidly Exploring Random Trees (RRT). |**Deadline** | 7. December 2019, 23:59 PST | |**Points** | 3 | |**Label in BRUTE** | t3b-rrt | |**Files to submit** | archive with the ''RRTDubinsPlanner.py'' file | |**Resources** | {{ :courses:b4m36uir:hw:uir-t3b-rrt.zip | T3b-rrt resource package (updated 27.11.2019)}}| \\ ===Assignment=== In ''RRTDubinsPlanner.py'' implement the Rapidly Exploring Random Tree (RRT) randomized sampling-based path planning algorithm according to the description and pseudocode presented in the {{courses:b4m36uir:lectures:b4m36uir-lec07-slides.pdf| Lecture 07}}. The algorithm should provide a collision free curvature constrained path through an environment represented by a geometrical map. The ''RRTDubinslanner.plan'' function has the following prescription import SamplingPlanner as sp ... class RRTPlanner(sp.SamplingPlanner): ... def plan(self, environment, start, goal): """ Method to plan the path Parameters ---------- environment: Environment Map of the environment that provides collision checking start: numpy array (4x4) start configuration of the robot in SE(3) coordinates goal: numpy array (4x4) goal configuration of the robot in SE(3) coordinates Returns ------- list(numpy array (4x4)) the path between the start and the goal Pose in SE(3) coordinates """ #TODO: t3b-rrt - implement the curvature constrained RRT planner print (start) print (goal) assert not environment.check_robot_collision(start), 'start collision' assert not environment.check_robot_collision(goal), 'goal collision' path = [start,goal] return(path) The path is contrained by the minimal turning radius ''RRTPlanner.turning_radius''. The ''dubins'' package is to be used to compute the curvature constrained paths. Although the curvature constrained path is effectively $SE(2)$, i.e., three degrees of freedom, $SE(3)$ is used to represent the individual poses. The pose $\mathbf{P} \in SE(3)$ is given as $$ \mathbf{P} = \begin{bmatrix} \mathbf{R} & \mathbf{T}\\ [0, 0, 0] & 1 \end{bmatrix}, $$ where $\mathbf{R} \in \mathcal{R}^{3\times3}$ is the rotation matrix for which $\mathbf{R}\cdot\mathbf{R} = \mathbf{I}$ and $\det(\mathbf{R})=1$. $\mathbf{T} \in \mathcal{R}^3$ is the translation vector Therefore, the individual poses are the rigid body transformations in the global reference frame. Hence, the position of the robot $r$ is given as the transformation of the robot base pose $\mathbf{r}_b$ in homogeneous coordinates, given as:$$ \begin{bmatrix} \mathbf{r}\\ 1 \end{bmatrix} = \mathbf{P}\cdot\begin{bmatrix} \mathbf{r}_b\\ 1\end{bmatrix}, $$ which can be also written as$$ \mathbf{r} = \mathbf{R}\cdot\mathbf{r}_b + \mathbf{T}. $$ The boundaries for individual configuration variables are given during the initialization of the planner in ''SamplingPlanner.limits'' variable as a list of lower-bound and upper-bound limit tuples, i.e. ''list( (lower_bound, upper_bound) )'', for each of the variables $(x,y,z,\phi_x,\phi_y,\phi_z)$. The $(x,y,z,\phi_x,\phi_y,\phi_z)$ vector can be transformed to and from $SE(3)$ using the ''sp.te_2_se3'' and ''sp.se3_2_te'' functions, respectively. The individual poses shall not be further than ''SamplingPlanner.max_norm_translation'', which distance should be computed along the curvature constrained path. The collision checking is performed using the ''environment.check_robot_collision'' function that takes on the input an $SE(3)$ pose matrix. The collision checking function returns ''True'' if there is collision between the robot and the environment and ''False'' if there is no collision. Moreover, the ''SamplingPlanner.is_valid_edge'' can be used to check whether the connection from $SE(3)$ represented point ''start'' to $SE(3)$ represented point ''end'' is valid both in terms of the collision checker and maximum distance. \\ === Dubins library installation === pip install dubins \\ === RAPID collision checking library installation notes === **On Linux (tested with Ubuntu 14.04, 16.04, 18.04)** - Download the resource package and ''make'' the rapid library in ''environment/rapid'' directory **On MacOS** - On line 7 of ''environment/rapid/Makefile'' change ''TARGET=librapid.so'' to ''TARGET=librapid.dylib'' - On line 11 of ''environment/rapid/Makefile'' change ''-soname'' to ''-install_name''