39
39
40
40
from sensor_msgs .msg import LaserScan , Range
41
41
from std_srvs .srv import SetBool , SetBoolResponse
42
- from neato_node .msg import Button , Sensor
42
+ from neato_node .msg import Button , Sensor , Movement
43
43
from neato_node .srv import SetLed , SetLedResponse , PlaySound , PlaySoundResponse
44
44
from geometry_msgs .msg import Quaternion
45
45
from geometry_msgs .msg import Twist
@@ -61,7 +61,7 @@ def __init__(self):
61
61
62
62
self .robot = Botvac (self .port , self .lds )
63
63
64
- rospy .Subscriber ("cmd_vel " , Twist , self .cmdVelCb )
64
+ rospy .Subscriber ("cmd_dist " , Movement , self .cmdMovementCb )
65
65
self .scanPub = rospy .Publisher ('base_scan' , LaserScan , queue_size = 1 )
66
66
self .odomPub = rospy .Publisher ('odom' , Odometry , queue_size = 1 )
67
67
self .buttonPub = rospy .Publisher ('button' , Button , queue_size = 1 )
@@ -77,8 +77,9 @@ def __init__(self):
77
77
rospy .Service ('play_sound' , PlaySound , self .playSound )
78
78
rospy .Service ('set_lds' , SetBool , self .setLDS )
79
79
80
- self .cmd_vel = [0 , 0 ]
81
- self .old_vel = self .cmd_vel
80
+ self .cmd_vel = 0
81
+ self .cmd_dist = [0 , 0 ]
82
+ self .old_dist = self .cmd_dist
82
83
self .encoders = [0 , 0 ]
83
84
84
85
def spin (self ):
@@ -132,8 +133,10 @@ def spin(self):
132
133
self .robot .setMotors (0 , 0 , 0 );
133
134
self .cmd_vel = [0 , 0 ]
134
135
elif self .cmd_vel != self .old_vel :
135
- self .robot .setMotors (self .cmd_vel [0 ], self .cmd_vel [1 ], max (abs (self .cmd_vel [0 ]), abs (self .cmd_vel [1 ])))
136
-
136
+ self .robot .setMotors (self .cmd_dist [0 ], self .cmd_dist [1 ], self .cmd_vel )
137
+ # reset command distance and speed
138
+ self .robot .cmd_dist = [0 ,0 ]
139
+ self .robot .cmd_vel = 0
137
140
# wait, then do it again
138
141
r .sleep ()
139
142
@@ -163,6 +166,15 @@ def cmdVelCb(self,req):
163
166
x = x * self .robot .max_speed / k ; th = th * self .robot .max_speed / k
164
167
self .cmd_vel = [int (x - th ), int (x + th )]
165
168
169
+ def cmdMovementCb (self ,req ):
170
+ k = req .vel
171
+ # sending commands higher than max speed will fail
172
+ if k > self .robot .max_speed :
173
+ k = self .robot .max_speed
174
+ ros .logwarn ("You have set the speed to more than the maximum speed of the neato. For safety reasons it is set to %d" , self .robot .max_speed )
175
+ self .robot .cmd_vel = k
176
+ self .robot .cmd_dist = [req .x_dist , req .y_dist ]
177
+
166
178
def publish_odom (self , odom ):
167
179
# get motor encoder values
168
180
left , right = self .robot .getMotors ()
0 commit comments