|  |   | 
| (23 intermediate revisions by the same user not shown) | 
| Line 1: | Line 1: | 
| − | {{DISPLAYTITLE:Hamster python API}} | + | {{DISPLAYTITLE:Hamster Python API}} | 
|  | [[Category:Hamster]] |  | [[Category:Hamster]] | 
|  |  |  |  | 
| Line 23: | Line 23: | 
|  | </syntaxhighlight> |  | </syntaxhighlight> | 
|  |  |  |  | 
| − | === Python Example 1 ===
 | + | * Install dependencies | 
| − | * Receive laser scan from robot to decide if free |  | 
| − |   |  | 
| − | <syntaxhighlight lang="python" line='line'>
 |  | 
| − | #!/usr/bin/env python
 |  | 
| − | import rospy
 |  | 
| − | from sensor_msgs.msg import Imu
 |  | 
| − |   |  | 
| − | def is_free(ranges ,start_index, end_index ,min_distance):
 |  | 
| − | 	#sub array from angle to angle
 |  | 
| − | 	s_ranges = ranges[start_index:end_index]
 |  | 
| − | 	#filter the array 
 |  | 
| − | 	b_ranges = filter(lambda x: x <= min_distance, s_ranges)
 |  | 
| − | 	return len(b_ranges) == 0
 |  | 
| − |   |  | 
| − |  
 |  | 
| − | def callback(msg):		    
 |  | 
| − | 	if is_free(msg.ranges,160,200,0.2): print "FREE"
 |  | 
| − | 	else: print "BLOCKED"
 |  | 
| − |  
 |  | 
| − | rospy.init_node('scan_values')
 |  | 
| − |   |  | 
| − | #Put your Hamster number instead of agent<number>
 |  | 
| − | #The agent number is printed on the Hamster cover 
 |  | 
| − | sub = rospy.Subscriber('/agent14/scan', LaserScan, callback)
 |  | 
| − |   |  | 
| − |   |  | 
| − | rospy.spin()
 |  | 
|  |  |  |  | 
|  | + | <syntaxhighlight lang="bash" line='line'> | 
|  | + | sudo apt-get install ros-kinetic-desktop ros-kinetic-ackermann-* | 
|  | </syntaxhighlight> |  | </syntaxhighlight> | 
|  |  |  |  | 
| − | === Python Example 2 === | + | === Beginner tutorials === | 
| − | Detect right/left turn from IMU
 |  | 
| − | * IMU angles are represented in Quaternions [[https://en.wikipedia.org/wiki/Quaternion]] hence translated to RPY (roll pitch yaw)
 |  | 
| − | * RPY are in radians, translated to degrees
 |  | 
|  |  |  |  | 
| − |   | + | * Exercise 1 - [https://wiki.cogni.io/index.php/HamsterPythonExample1 | Process laser Scan ] | 
| − | <syntaxhighlight lang="python" line='line'>
 | + | * Exercise 2 - [https://wiki.cogni.io/index.php/HamsterPythonExample2 | Process inertial measurement unit (IMU) ] | 
| − |   | + | * Exercise 3 - [https://wiki.cogni.io/index.php/HamsterPythonExample3 | Move until collision ] | 
| − | #!/usr/bin/env python
 |  | 
| − | import rospy
 |  | 
| − | import math
 |  | 
| − | from sensor_msgs.msg import Imu
 |  | 
| − | from tf.transformations import euler_from_quaternion, quaternion_from_euler
 |  | 
| − |   |  | 
| − | def calculate_robot_angle(orientation):
 |  | 
| − | 	quaternion = (
 |  | 
| − | 	    orientation.x,
 |  | 
| − | 	    orientation.y,
 |  | 
| − | 	    orientation.z,
 |  | 
| − | 	    orientation.w)
 |  | 
| − | 	euler = euler_from_quaternion(quaternion)
 |  | 
| − | 	roll = euler[0]
 |  | 
| − | 	pitch = euler[1]
 |  | 
| − | 	yaw = euler[2]
 |  | 
| − | 	return math.degrees(yaw)
 |  | 
| − |   |  | 
| − | prev_angle = 0
 |  | 
| − | def callback(msg):
 |  | 
| − | 	global prev_angle	    
 |  | 
| − | 	curr_angle = calculate_robot_angle(msg.orientation)
 |  | 
| − | 	if curr_angle > prev_angle :
 |  | 
| − | 		print "TURINING LEFT"
 |  | 
| − | 	else:
 |  | 
| − | 		print "TURINIGN RIGHT"
 |  | 
| − | 	prev_angle = curr_angle
 |  | 
| − |   |  | 
| − |   |  | 
| − | rospy.init_node('imu_values')
 |  | 
| − | last_angle = 0
 |  | 
| − |   |  | 
| − | #Put your Hamster number instead of agent<number>
 |  | 
| − | #The agent number is printed on the Hamster cover 
 |  | 
| − | sub = rospy.Subscriber('/agent14/imu', Imu, callback)
 |  | 
| − |   |  | 
| − |   |  | 
| − | rospy.spin()
 |  | 
| − | </syntaxhighlight>
 |  | 
| − |   |  | 
| − | === Python Example 3 ===
 |  | 
| − | * Drives the robot forwards until senses from the Lidar that there is less than a meter free ahead of it |  | 
| − |   |  | 
| − | <syntaxhighlight lang="python" line='line'>
 |  | 
| − |   |  | 
| − | #!/usr/bin/env python
 |  | 
| − | import rospy
 |  | 
| − | from sensor_msgs.msg import LaserScan
 |  | 
| − | from ackermann_msgs.msg import AckermannDriveStamped
 |  | 
| − |   |  | 
| − |   |  | 
| − | pub = rospy.Publisher('/agent14/ackermann_cmd',AckermannDriveStamped, queue_size=1)
 |  | 
| − |   |  | 
| − | def is_free(ranges ,start_index, end_index ,min_distance):
 |  | 
| − | 	#sub array from angle to angle
 |  | 
| − | 	s_ranges = ranges[start_index:end_index]
 |  | 
| − | 	#filter the array 
 |  | 
| − | 	b_ranges = filter(lambda x: x <= min_distance, s_ranges)
 |  | 
| − | 	return len(b_ranges) == 0
 |  | 
| − |   |  | 
| − |  
 |  | 
| − | def callback(msg):
 |  | 
| − | 	global pub		    
 |  | 
| − | 	if is_free(msg.ranges,160,200,1):
 |  | 
| − | 	    ack_msg = AckermannDriveStamped()
 |  | 
| − | 	    ack_msg.header.stamp = rospy.Time.now()
 |  | 
| − | 	    ack_msg.header.frame_id = 'your_frame_here'
 |  | 
| − | 	    ack_msg.drive.steering_angle = 0
 |  | 
| − | 	    ack_msg.drive.speed = 1
 |  | 
| − | 	    pub.publish(ack_msg)
 |  | 
| − |  
 |  | 
| − | rospy.init_node('driving_hamster')
 |  | 
| − |   |  | 
| − | #Put your Hamster number instead of agent<number>
 |  | 
| − | #The agent number is printed on the Hamster cover 
 |  | 
| − | sub = rospy.Subscriber('/agent14/scan', LaserScan, callback)
 |  | 
| − |   |  | 
| − |   |  | 
| − | rospy.spin()
 |  | 
| − |   |  | 
| − | </syntaxhighlight>
 |  | 
</syntaxhighlight>
See imagery from the robot
<syntaxhighlight lang="bash" line='line'>
<syntaxhighlight lang="bash" line='line'>
sudo apt-get install ros-kinetic-desktop ros-kinetic-ackermann-*
</syntaxhighlight>