www.gusucode.com > robotexamples 工具箱 matlab源码程序 > robotexamples/ros/TurtleBotBasicExplorationExample.m

    %% Explore Basic Behavior of the TurtleBot
%% Introduction
% This example helps you to explore
% basic autonomy with the TurtleBot(R). The described behavior drives the robot
% forward and changes its direction when there is an obstacle.
% You will subscribe to the laser scan topic and publish the velocity
% topic to control the TurtleBot.
%
% Prerequisites: <docid:robotics_examples.example-TurtleBotCommunicationExample>

% Copyright 2014-2016 The MathWorks, Inc.

%% Hardware Support Package for TurtleBot
% This example gives an overview of working with a TurtleBot using its native ROS interface.
% The Robotics System Toolbox(TM) Support Package for TurtleBot(R)-Based Robots
% provides a more streamlined interface to TurtleBot. It allows you to:
%
% * Acquire sensor data and send control commands without explicitly calling ROS commands
% * Communicate transparently with a simulated robot in Gazebo or with a physical TurtleBot
%
% To install the support package, open *Add-Ons > Get Hardware Support
% Packages* on the MATLAB *Home* tab and select "TurtleBot-Based Robots". 
% Alternatively, use the |<docid:robotics_ref.bu5jj8h roboticsAddons>| command.
%
%% Connect to the TurtleBot
% Make sure you have a TurtleBot running either in simulation through
% Gazebo(R) or on real hardware. Refer to 
% <docid:robotics_examples.example-GettingStartedWithGazeboExample> or
% <docid:robotics_examples.example-GettingStartedWithRealTurtleBotExample> for the startup 
% procedure. Any Gazebo world works while running in simulation, however,
% |Gazebo TurtleBot World| is the most interesting for the purposes of this
% example.
%
% * Initialize ROS. Connect to the TurtleBot by replacing 
% the sample IP address (192.168.1.1) with the IP address of the TurtleBot.
%
%   ipaddress = '192.168.1.1'
%
%% 
rosinit(ipaddress)
%%
% * Create a publisher for the robot's velocity and create a message for that topic.
%%
  robot = rospublisher('/mobile_base/commands/velocity');
  velmsg = rosmessage(robot);

  
%% Receive Scan Data
% Make sure that you start the
% Kinect(R) camera if you are working with real TurtleBot hardware. That
% command is: |roslaunch turtlebot_bringup 3dsensor.launch|.
% You must execute the command in a terminal on the TurtleBot.
% The TurtleBot uses the Kinect data to simulate a laser scan that is
% published on the |/scan| topic. For the remainder of this example, the
% term "laser scan" refers to data published on this topic.
%
% * Subscribe to the topic |/scan|. 
%% 
  laser = rossubscriber('/scan');
%%
% * Wait for one laser scan message to arrive and then display it.
%%
  scan = receive(laser,3)
  figure
  plot(scan);
%%
% If you see an error, it is possible that the laser scan topic is
% not receiving any data. If you are running in simulation, try restarting Gazebo. 
% If you are using hardware, make sure the that you started the Kinect
% camera properly.
%
% * In Gazebo, the scan is similar to this scan:
%
% <<laser_scan_explore.png>>
%
% * Run the following lines of code, which plot a live laser scan feed for
% twenty seconds. Move an object in front of the TurtleBot and bring it
% close enough until it no longer shows up in the plot window. 
% The laser scan has a limited range because of hardware
% limitations of the Kinect camera. The Kinect has a minimum sensing range of
% 0.8 meters and a maximum range of 4 meters. Any objects outside these
% limits will not be detected by the sensor.
%%
  tic;
  while toc < 10
      scan = receive(laser,3);
      plot(scan);
  end
  
  
%% Simple Obstacle Avoidance
% Based on the distance readings from the laser scan, you can implement a
% simple obstacle avoidance algorithm. You can use a simple |while| loop to
% implement this behavior.
%
% * Set some parameters that will be used in the processing loop. You can modify
% these values for different behavior.
%%
  spinVelocity = 0.6;       % Angular velocity (rad/s)
  forwardVelocity = 0.1;    % Linear velocity (m/s)
  backwardVelocity = -0.02; % Linear velocity (reverse) (m/s)
  distanceThreshold = 0.6;  % Distance threshold (m) for turning
%%
% * Run a loop to move the robot forward and compute the closest
% obstacles to the robot. When an obstacle is within the limits of the
% |distanceThreshold|, the robot turns. This loop stops after 20
% seconds of run time. CTRL+C (or Control+C on the Mac) also stops this loop.
%%
  tic;
  while toc < 20
      % Collect information from laser scan
      scan = receive(laser);
      plot(scan);
      data = readCartesian(scan);
      x = data(:,1);
      y = data(:,2);
      % Compute distance of the closest obstacle
      dist = sqrt(x.^2 + y.^2);
      minDist = min(dist);     
      % Command robot action
      if minDist < distanceThreshold
          % If close to obstacle, back up slightly and spin
          velmsg.Angular.Z = spinVelocity;
          velmsg.Linear.X = backwardVelocity;
      else
          % Continue on forward path
          velmsg.Linear.X = forwardVelocity;
          velmsg.Angular.Z = 0;
      end   
      send(robot,velmsg);
  end
  
  
%% Disconnect from the Robot
% * It is good practice to clear the workspace of publishers,
% subscribers, and other ROS related objects when you are finished with
% them.
%
%   clear
%%
% * It is recommended to use |rosshutdown| once you are done working with 
% the ROS network. Shut down the global node and disconnect from the
% TurtleBot.
%% 
  rosshutdown


%% More Information
% The laser scan has a minimum range at which it no
% longer sees objects in its way. That minimum is somewhere around 0.5
% meters from the Kinect camera.
%
% The laser scan cannot detect glass walls. Following is an
% image from the Kinect camera:
%
% <<turtlebot_view.png>>
% 
% Here is the corresponding laser scan:
%
% <<turtlebot_scan.png>>
%
% The trash can is visible, but you cannot see the glass wall.
% When you use the TurtleBot in areas with windows or
% walls that the TurtleBot might not be able to detect, be aware of the limitations
% of the laser scan.


%% Next Steps
%
% * Refer to the next example: <docid:robotics_examples.example-TurtleBotTeleoperationExample>
%%
displayEndOfDemoMessage(mfilename)