Exemplo n.º 1
0
    def get_battery_state(self, battery):
        """Get the current state of a battery."""
        battery_config = BATTERIES[battery]
        battery_state = BatteryState()

        battery_voltage = PiPuckBatteryServer.get_battery_voltage(battery_config["path"])

        self._battery_history[battery].insert(0, battery_voltage)
        self._battery_history[battery] = self._battery_history[battery][:HISTORY_MAX]

        split_point = len(self._battery_history[battery]) // 2
        head_half = self._battery_history[battery][:split_point]
        tail_half = self._battery_history[battery][split_point:]

        try:
            battery_delta = (sum(head_half) / len(head_half)) - (sum(tail_half) / len(tail_half))
        except ZeroDivisionError:
            battery_delta = 0.0

        battery_state.voltage = battery_voltage
        battery_state.present = True
        battery_state.design_capacity = battery_config["design_capacity"]
        battery_state.power_supply_technology = battery_config["power_supply_technology"]

        average_battery_voltage = sum(self._battery_history[battery]) / len(
            self._battery_history[battery])

        if average_battery_voltage >= battery_config["max_voltage"] * CHARGED_VOLTAGE_MARGIN:
            battery_state.power_supply_status = BatteryState.POWER_SUPPLY_STATUS_FULL
        elif battery_delta < 0:
            battery_state.power_supply_status = BatteryState.POWER_SUPPLY_STATUS_DISCHARGING
        elif battery_delta > 0:
            battery_state.power_supply_status = BatteryState.POWER_SUPPLY_STATUS_CHARGING
        else:
            battery_state.power_supply_status = BatteryState.POWER_SUPPLY_STATUS_NOT_CHARGING

        if average_battery_voltage >= battery_config["max_voltage"] * OVER_VOLTAGE_MARGIN:
            battery_state.power_supply_health = BatteryState.POWER_SUPPLY_HEALTH_OVERVOLTAGE
        elif average_battery_voltage <= battery_config["min_voltage"]:
            # It is unclear whether this means "out of charge" or "will never charge again", we
            # assume here that it means "out of charge".
            battery_state.power_supply_health = BatteryState.POWER_SUPPLY_HEALTH_DEAD
        else:
            battery_state.power_supply_health = BatteryState.POWER_SUPPLY_HEALTH_GOOD

        battery_state.percentage = clamp(
            (average_battery_voltage - battery_config["min_voltage"]) /
            (battery_config["max_voltage"] - battery_config["min_voltage"]), 1.0, 0.0)

        battery_state.current = NAN
        battery_state.charge = NAN
        battery_state.capacity = NAN
        battery_state.location = battery_config["location"]

        return battery_state
Exemplo n.º 2
0
def battery_republisher():
	global MotorDriverPort

	#print "Battery republisher launched"
	bat_status = BatteryState()
	BAT_FULL = 6*4.2
	BAT_MIN = 6*3.3

	bat_status.header.frame_id = 'robot'

	bat_status.current = float('nan')
	bat_status.charge = float('nan')
	bat_status.capacity = float('nan')
	bat_status.design_capacity = float('nan')

	bat_status.power_supply_technology = BatteryState().POWER_SUPPLY_TECHNOLOGY_LIPO

	for cell in range(0, 6):
		bat_status.cell_voltage.append(float('nan'))

	bat_status.location = 'Main Battery'

	bat_status.serial_number = "NA"

	while 1:

		MotorDriverPort.write('GetBatTotal\n')
		sleep(0.05)
		recv_data = MotorDriverPort.readline()
		print recv_data

	#	print recv_data

		bat_status.header.stamp = rospy.Time.now()


		try:
			bat_status.voltage = float(recv_data)
			bat_status.percentage = bat_status.voltage/BAT_FULL
			bat_status.present = bat_status.voltage<BAT_FULL and bat_status.voltage>BAT_MIN

			battery_pub.publish(bat_status)

		except:
			if DEBUG:
				print "Receive Error"
			else:
				pass

		sleep(0.01)
Exemplo n.º 3
0
 def on_new_telemetry(self, message):
     for servo in message.servos:
         self.voltages[servo.id] = servo.voltage
     if len(self.voltages) == SERVO_COUNT:
         voltages = self.voltages.values()
         self.voltages.clear()
         voltage = max(voltages)
         battery_state = BatteryState()
         battery_state.header.stamp = rospy.Time.now()
         battery_state.voltage = voltage
         battery_state.current = float("nan")
         battery_state.charge = float("nan")
         battery_state.capacity = float("nan")
         battery_state.design_capacity = float("nan")
         battery_state.percentage = 100 - (MAX_VOLTAGE - voltage) / (
             MAX_VOLTAGE - MIN_VOLTAGE) * 100
         battery_state.power_supply_status = BatteryState.POWER_SUPPLY_STATUS_DISCHARGING
         battery_state.power_supply_health = BatteryState.POWER_SUPPLY_HEALTH_UNKNOWN
         battery_state.power_supply_technology = BatteryState.POWER_SUPPLY_TECHNOLOGY_LIPO
         battery_state.present = True
         battery_state.cell_voltage = [float("nan")] * 3
         battery_state.location = "Primary batter bay"
         battery_state.serial_number = "N/A"
         self.battery_publisher.publish(battery_state)
         # skip the first check so that you don't get a warning if battery is already bellow some value
         if self.first_check:
             self.first_check = False
             self.lowest_recorded_voltage = voltage
             return
         if voltage < 10.2:
             if self.last_critical_voltage_warning + self.critical_voltage_warning_period < rospy.Time.now(
             ):
                 self.speech_publisher.publish("battery_critical")
                 self.face_color_publisher.publish("flash:red")
                 self.last_critical_voltage_warning = rospy.Time.now()
         elif voltage < 11 and self.lowest_recorded_voltage >= 11:
             self.speech_publisher.publish("battery_below_11")
         elif voltage < 12 and self.lowest_recorded_voltage >= 12:
             self.speech_publisher.publish("battery_below_12")
         if voltage < self.lowest_recorded_voltage:
             self.lowest_recorded_voltage = voltage
Exemplo n.º 4
0
    def publish_state(self):
        state = BatteryState()
        state.header.frame_id = "usv"
        state.header.stamp = rospy.Time.now()

        state.voltage = self.voltage
        state.current = self.power_battery
        state.charge = self.charging_current
        #state.capacity = self.design_capacity * (self.percentage / 100.0)
        state.design_capacity = self.design_capacity
        state.percentage = (self.percentage/100.0)
        state.power_supply_status = self.state_charging
        state.power_supply_health = BatteryState.POWER_SUPPLY_HEALTH_UNKNOWN
        state.power_supply_technology = BatteryState.POWER_SUPPLY_TECHNOLOGY_LIPO
        state.present = True

        state.cell_voltage = [self.voltage]
        state.location = "Slot 1"
        state.serial_number = "SUSV LIPO 3000mAH"

        self.pub.publish(state)
def bs_err_inj(tb3_name):
    #Create error-injected topic
    rospy.init_node('batterystate_err_inj')

    #########################################
    #Create new message
    batterystate_msg = BatteryState()

    #Fill message with values
    batterystate_msg.header.seq = 0
    batterystate_msg.header.stamp.secs = 0
    batterystate_msg.header.stamp.nsecs = 0
    batterystate_msg.header.frame_id = ""

    batterystate_msg.voltage = 0.0
    batterystate_msg.current = 0.0
    batterystate_msg.charge = 0.0
    batterystate_msg.capacity = 0.0
    batterystate_msg.design_capacity = 0.0
    batterystate_msg.percentage = 0.0
    batterystate_msg.power_supply_status = 0
    batterystate_msg.power_supply_health = 0
    batterystate_msg.power_supply_technology = 0
    batterystate_msg.bool = 1

    batterystate_msg.cell_voltage = []

    batterystate_msg.location = ""
    batterystate_msg.serial_number = ""

    #########################################

    rate = rospy.Rate(50)

    #Publish message into new topic
    while not rospy.is_shutdown():
        my_pub = rospy.Publisher(tb3_name + 'batterystate_err_inj',
                                 BatteryState,
                                 queue_size=10)
        my_sub = rospy.Subscriber(tb3_name + 'battery_state', BatteryState,
                                  listener)

        #########################################
        #INJECT ERRORS HERE
        batterystate_msg.header.seq = actual_seq
        batterystate_msg.header.stamp.secs = actual_secs
        batterystate_msg.header.stamp.nsecs = actual_nsecs
        batterystate_msg.header.frame_id = actual_frameid

        batterystate_msg.voltage = actual_voltage
        batterystate_msg.current = actual_current
        batterystate_msg.charge = actual_charge
        batterystate_msg.capacity = actual_capacity
        batterystate_msg.design_capacity = actual_designcapacity
        batterystate_msg.percentage = actual_percentage

        batterystate_msg.power_supply_status = actual_powersupplystatus
        batterystate_msg.power_supply_health = actual_powersupplyhealth
        batterystate_msg.power_supply_technology = actual_powersupplytechnology

        batterystate_msg.present = actual_present
        batterystate_msg.cell_voltage = actual_cellvoltage
        batterystate_msg.location = actual_location
        batterystate_msg.serial_number = actual_serialnumber

        #########################################

        my_pub.publish(batterystate_msg)
        rate.sleep()

    rospy.spin()
Exemplo n.º 6
0
    # print out pure ADC voltage
    # rospy.loginfo("Battery: %.1f Volt" % voltage)

    # completing the ROS message
    # @SA http://docs.ros.org/jade/api/sensor_msgs/html/msg/BatteryState.html
    battery_msg.charge = 0.0
    battery_msg.capacity = 0.0
    battery_msg.design_capacity = 2.2  # 2.2 Ah
    battery_msg.percentage = 0.0  # 0 to 1!
    #    battery_msg.power_supply_status = POWER_SUPPLY_STATUS_DISCHARGING
    #    battery_msg.power_supply_health = POWER_SUPPLY_HEALTH_GOOD
    #    battery_msg.power_supply_technology = POWER_SUPPLY_TECHNOLOGY_LIPO
    battery_msg.power_supply_status = 2
    battery_msg.power_supply_health = 1
    battery_msg.power_supply_technology = 3
    battery_msg.present = True
    battery_msg.cell_voltage = [float(0)]
    battery_msg.location = "1"  # The location into which the battery is inserted. (slot number or plug)
    battery_msg.serial_number = "1"

    # this is the battery voltage
    # @TODO strange, this assignment as to be exactly here...
    battery_msg.voltage = float(voltage)

    # publish voltage
    pubBattery.publish(battery_msg)

    # Sleep for a second until the next reading.
    rospy.sleep(sleepTime)