X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=scripts%2Fwt_node.py;h=4a6af7b9f954989b8fa14c38422ce620addd9395;hp=5fc2e2d53155630563bf342d12769c9d3861de27;hb=cba57a46f758cff1cb49df0b337eac82ab4453f3;hpb=8818294be6d3833647713c6db2412e742c4d34fe diff --git a/scripts/wt_node.py b/scripts/wt_node.py index 5fc2e2d..4a6af7b 100755 --- a/scripts/wt_node.py +++ b/scripts/wt_node.py @@ -4,6 +4,7 @@ import rospy import tf import struct +import thread import prctl import spidev from time import sleep @@ -48,7 +49,7 @@ class LPD8806: self.spi.writebytes(l) self.latch() -class MoveBase: +class WTBase: def __init__(self): rospy.init_node('wild_thumper') prctl.set_name("wild_thumper") @@ -77,6 +78,8 @@ class MoveBase: rospy.Subscriber("cmd_vel_out", Twist, self.cmdVelReceived) rospy.Subscriber("led_stripe", LedStripe, self.led_stripe_received) rospy.Subscriber("imu", Imu, self.imuReceived) + self.bDocked = False + self.bDocked_last = False self.run() def run(self): @@ -117,16 +120,20 @@ class MoveBase: self.set_speed(self.cmd_vel[0], self.cmd_vel[1]) self.cur_vel = self.cmd_vel self.cmd_vel = None + + self.check_docked() rate.sleep() def execute_dyn_reconf(self, config, level): self.bClipRangeSensor = config["range_sensor_clip"] self.range_sensor_max = config["range_sensor_max"] + self.range_sensor_fov = config["range_sensor_fov"] self.odom_covar_xy = config["odom_covar_xy"] self.odom_covar_angle = config["odom_covar_angle"] self.rollover_protect = config["rollover_protect"] self.rollover_protect_limit = config["rollover_protect_limit"] self.rollover_protect_pwm = config["rollover_protect_pwm"] + self.bStayDocked = config["stay_docked"] return config @@ -212,11 +219,13 @@ class MoveBase: msg.status.append(stat) self.pub_diag.publish(msg) + current = struct.unpack(">h", i2c_read_reg(0x52, 0x0D, 2))[0]/1000.0 + if self.pub_battery.get_num_connections() > 0: batmsg = BatteryState() batmsg.header.stamp = rospy.Time.now() batmsg.voltage = volt - batmsg.current = float('nan') + batmsg.current = current batmsg.charge = float('nan') batmsg.capacity = float('nan') batmsg.design_capacity = 5.0 @@ -230,6 +239,8 @@ class MoveBase: rospy.logerr("Voltage critical: %.2fV" % (volt)) self.volt_last_warn = rospy.Time.now() + self.bDocked = volt > 10 + def get_odom(self): speed_trans, speed_rot, posx, posy, angle = struct.unpack(">fffff", i2c_read_reg(0x50, 0x38, 20)) @@ -266,6 +277,7 @@ class MoveBase: odom.child_frame_id = "base_footprint" odom.twist.twist.linear.x = speed_trans odom.twist.twist.linear.y = 0.0 + odom.twist.twist.linear.z = 0.0 odom.twist.twist.angular.z = speed_rot odom.twist.covariance = odom.pose.covariance @@ -335,7 +347,7 @@ class MoveBase: def get_dist_forward_left(self): if self.pub_range_fwd_left.get_num_connections() > 0: dist = self.read_dist_srf(0x15) - self.send_range(self.pub_range_fwd_left, "sonar_forward_left", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, 30) + self.send_range(self.pub_range_fwd_left, "sonar_forward_left", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, self.range_sensor_fov) def update_dist_forward_left(self): if self.pub_range_fwd_left.get_num_connections() > 0: @@ -344,7 +356,7 @@ class MoveBase: def get_dist_backward(self): if self.pub_range_bwd.get_num_connections() > 0: dist = self.read_dist_srf(0x17) - self.send_range(self.pub_range_bwd, "sonar_backward", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, 30) + self.send_range(self.pub_range_bwd, "sonar_backward", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, self.range_sensor_fov) def update_dist_backward(self): if self.pub_range_bwd.get_num_connections() > 0: @@ -353,7 +365,7 @@ class MoveBase: def get_dist_forward_right(self): if self.pub_range_fwd_right.get_num_connections() > 0: dist = self.read_dist_srf(0x19) - self.send_range(self.pub_range_fwd_right, "sonar_forward_right", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, 30) + self.send_range(self.pub_range_fwd_right, "sonar_forward_right", Range.ULTRASOUND, dist, 0.04, self.range_sensor_max, self.range_sensor_fov) def update_dist_forward_right(self): if self.pub_range_fwd_right.get_num_connections() > 0: @@ -363,7 +375,31 @@ class MoveBase: for led in msg.leds: self.pStripe.set(led.num, red=led.red, green=led.green, blue=led.blue) self.pStripe.update() + + def check_docked(self): + if self.bDocked and not self.bDocked_last: + rospy.loginfo("Docking event") + elif not self.bDocked and self.bDocked_last: + if not self.bStayDocked or self.cur_vel != (0, 0): + rospy.loginfo("Undocking event") + else: + rospy.loginfo("Undocking event..redocking") + thread.start_new_thread(self.redock, ()) + + self.bDocked_last = self.bDocked + + def redock(self): + self.cmd_vel = (-0.1, 0) + for i in range(100): + if self.bDocked: + break + sleep(0.01) + self.cmd_vel = (0, 0) + if self.bDocked: + rospy.loginfo("Redocking done") + else: + rospy.logerr("Redocking failed") if __name__ == "__main__": - MoveBase() + WTBase()