Maintenance 1 of n


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

- -----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

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
VxEh
=+ihM
- -----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBAgAGBQJSViczAAoJEKMrjjFBXi8RxRoP/Rj11BhHooPhp5mhQQ76Tg9t
AaVr+NZyaBp+uVRv3LR/1c2Ixfvw8GYb18BBOCE0qp5aOkxlJ01/pKV6b2UV8onb
bAbxWE//f53oqsZsRHfjAS9C3QXbTU5eiUSq0cb5Cuwe9Im7Y2KTQxd9e5lr1NiJ
FajNVGJM09m/aVrQH+ySx4b0T86cej5hGewjYVOul+p04uBKWa7HXNhdyfGRP2ov
7EkN12+JEqz1j5IwkPcUdmfxgGFu85te8pMAuku24v7k8qEsKRmNcJJajynTv20o
E/a9MFv75FTi5Nh3OX2HsGFEIhCoAVLzDnzMHJ4XrR1ZjJCVN7FCRNLZLZPvzSkj
bWDMjBNK1AAQEhOklB4VLhx3JLVZUBzbli7uRK44FuLIUxwjBBUUjVV66lNzDkbv
10YIe8lU8LRtoUzCz5X07fhetllSypTAax0ZlTzCZ7teAzlEX4NGLuumVsGradxy
7bnESJN+ZvbOXEdrhP4mqFjsqmu7nrpE6Q4GxHwuMtX0HckQ7CDXMDEi/45vT+PG
x55Rb99HgFj3fBXSHHLXPkxYPdtX29rlk2YYI0jdQyhQHk9PjapiaZte9yePeXEb
TX5Rjt28k2sJXQyDP+nDaWTtdJOl8PB+lrTl3pW/cfTeEdM3xAB5n5H32KPRBver
oxmgtI9SEXvfGSMQMzuT
=zqYK
-----END PGP SIGNATURE-----

DA3C4AC9

Turtlebot Wanderer

The Wanderer program allows the turtlebot to move around randomly while avoiding any nearby objects.  Using the attached Xbox Kinect, the robot reads its laserscan messages and determines if there are any obstacles closer than 0.6 meters.  If there are none, it moves forward.  If it does detect any obstacles, it rotates away from them and then continues moving forward.

Turtlebot2 used with Wanderer to carry around drinks

Scan_msg class

Much of this program depends on a class called Scan_msg.  At it’s initialization, a Scan_msg object creates a publisher, pub, for twist messages, variable msg to hold the twist message, variables sect_1, sect_2, and sect_3, and 3 dictionaries – ang, fwd, and dbgmsg– to hold the angular speed, linear speed, and debug message for each possible instance, respectively.
Variables sect_1, sect_2, and sect_3 each represent a specific part of the field of view of the turtlebot (see image below). 

Illustration of turtlebot field of view
 

The two main functions of this class are sort() and movement()

sort() takes in a laserscan message and goes through all the ranges read by the robot.  If any of the ranges is less than 0.6 m (an obstacle is detected), it determines which section of the field of view (sect_1, sect_2, or sect_3) the obstacle is located in and changes the value of that  section to 1.   
 

movement()  takes in the values of sect_1, sect_2, and sect_3 and uses them to determine how to move.  To do this, it creates a number with the values of these 3 variables and assigns that number to the  variable sectsect is then used with the class dictionaries to change the angular and linear velocities  of msg to the proper values and display the correct debug message.  Finally, movement() published this modified twist message (see code below).

sect = int(str(self.sect_1) + str(self.sect_2) + str(self.sect_3))
self.msg.angular.z = self.ang[sect]
self.msg.linear.x = self.fwd[sect]
rospy.loginfo(self.dbgmsg[sect])
self.pub.publish(self.msg) 

Finally, the reset_sect() function is run to reset the values of sect_1, sect_2, and sect_3 to 0.   

The function for_callback() takes in a laserscan message and runs both of the above functions. 

listener() and call_back functions
The listener() function first initializes the node navigation_sensors, and then creates a subscriber with callback function call_back()call_back() takes a Scan_msg object and passes the laserscan message to the class function for_callback(). 

Overview 
At the start of this program, a Scan_msg object called sub_obj is created.  listener() is then run, starting the subscriber, which passes a laserscan message to the call_back() function.  call_back() passes the laserscan message to sub_obj‘s for_callback() function.  for_callback() first runs sort(), which updates variables sect_1, sect_2, and sect_3 accordingly, then passes these updated variables to movement() which uses them to determine where to go, updates the class twist message, and publishes that message.  This process repeats for each laserscan message. 

App Chooser
Wanderer was also added as an additional feature to  App Chooser (for android).  In order to do this, I wrote files wanderer.launch, wanderer.interface, and wanderer.app and added a wanderer_icon.jpeg (for the icon) in a folder called wanderer_app.  The interface file lists any publishers and subscribers.  In the wanderer app, there were none.  The launch file defines a single node, “navigation_sensors” from the wanderer.py program (see below).

    

Lastly, the app file defines a few attributes of the app and also gives the package/name of the other files and image.  In order to add this app to App Chooser, I edited the file turtlebot_apps.installed to include the wanderer app.

 Wanderer appears on the far right along with the other apps in App Chooser

All source code available at: 
https://github.com/IHeartEngineering/ihe_turtlebot_wander