Пример #1
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)
Пример #2
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
Пример #3
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()
Пример #5
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)