Ruben-RV-ROS01

From robotica.unileon.es
Revision as of 17:57, 27 February 2014 by Rrodrf04 (talk | contribs) (Stop and resume actual navigation in ROS navigation stack)

Jump to: navigation, search
  • Project name: Turtlebot robot indoor navigation
  • Dates: July 2013 -
  • Degree: Summer Research Residence
  • Authors: Ruben
  • Contact: runix404@gmail.com
  • SVN Repositories:
  • Tags: ROS, navigation, turtlebot
  • Technologies: kinect, pcl, openni, c++, cmake, ROS
  • State: Ongoing


ROS Fuerte Installation on Ubuntu 12.04

Repository configuration

First we need to add the repository

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu precise main" > /etc/apt/sources.list.d/ros-latest.list'

and setup the keys

wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

Installation

We need to refresh the cache of your package manager

sudo apt-get update

In our case, we decide to install ros-fuerte-desktop-full that is recommended in the ROS web, but you can also install other as explained on the web

sudo apt-get install ros-fuerte-desktop-full


Enviroment Configuration

Now we need to configure the enviroment variables

echo "source /opt/ros/fuerte/setup.bash" >> ~/.bashrc

For refresh the enviroment variables of your terminal you can reset it or type

 . ~/.bashrc

Turtlebot installation

The turtlebot installation is very simple, you only have to type in your terminal


 sudo apt-get install ros-fuerte-turtlebot*

Navigation

Feasible Solutions

The feasible solutions are Dynamic Window and Potencial Field :

1.-Dynamic Window : is a velocity-based local planner that calculates the optimal collision-free ('admissible') linear and angular velocity for a robot required to reach its goal

2.-Potential-field : In the pontetial-field navigation each obstacle has an obstacle 'force field' for repelling the robot, and the goal has a attraction fiel

Dynamic window algorithm

1.- Calculate the desired velocities ( angular and linear ).

2.- Select the allowable velocities ( angular and linear ) , this is compute the dynamic window, after this step we have a allowable velocities range ( [ min linear, max linear ], [ min angular, max angular ])


3.- For each tuple [ v, w ] determine the closest obstacle

4.- Determine if the distance to the closest obstacle is within the robots braking distance.

5.- Now, we can calculate the score of this tuple, the velocities that are more near to desired velocities will get a more score

6.- Now we select the velocity that has the most score

7.- If the score is higher than a minimun score return this tuple, else the linear and angular velocities will be 0

In pseudocode (source)

  BEGIN DWA(robotPose,robotGoal,robotModel)
  	desiredV = calculateV(robotPose,robotGoal)
  	laserscan = readScanner()
  	allowable_v = generateWindow(robotV, robotModel)
  	allowable_w  = generateWindow(robotW, robotModel)
  	for each v in allowable_v
  	   for each w in allowable_w
  	   dist = find_dist(v,w,laserscan,robotModel)
  	   breakDist = calculateBreakingDistance(v)
  	   if (dist > breakDist)  //can stop in time
  	      heading = hDiff(robotPose,goalPose, v,w)
  	      clearance = (dist-breakDist)/(dmax - breakDist)
  	      cost = costFunction(heading,clearance, abs(desired_v - v))
  	      if (cost > optimal)
  	         best_v = v
  	         best_w = w
  	         optimal = cost
  	 set robot trajectory to best_v, best_w
   END

Experiments

In these experiments, the robot will try to reach the position (3,3) from the origin.

1. Simple scenario Simple navigation

2. A wall scenario Navigation with obstacle

3. A realistic scenario

Path Planning

Voronoi

ongoing

Graph SLAM

ongoing


Convert sensor_msgs/Range to sensor_msgs/LaserScan message

Stop and resume actual navigation in ROS navigation stack

The main goal of this chapter is stop and resume the actual navigation, this can be useful when the robot need to wait for example to a person.

For achieve that, we need to modify the move base package and introduce a few lines. This lines only check if the navigation is stopped and then don't sending the velocity command. And for modify the state of the navigation, we create a new topic to change this value.

When you want to start the navigation stack, you must start the custom navigation stack that introduces this modifications, after you can change this value using the library libmb_sendskip.so that includes the class MB_robot::SendState that allows to change this parameter with the method sendState(bool state).

Goals correction for navigation stack