mirror of
https://github.com/OSURoboticsClub/Rover_2017_2018.git
synced 2025-11-08 18:21:15 +00:00
Added battery status monitoring. Also made wheel status senders/recievers.
This commit is contained in:
@@ -147,7 +147,7 @@ class DriveControl(object):
|
|||||||
self.second_motor.write_registers(0, second_motor_register_data)
|
self.second_motor.write_registers(0, second_motor_register_data)
|
||||||
|
|
||||||
except Exception, error:
|
except Exception, error:
|
||||||
print "Error occurred:", error
|
pass
|
||||||
|
|
||||||
self.new_control_message = False
|
self.new_control_message = False
|
||||||
|
|
||||||
|
|||||||
@@ -91,11 +91,13 @@ class IrisController(object):
|
|||||||
|
|
||||||
self.drive_command_publisher = rospy.Publisher(self.drive_command_publisher_topic, DriveCommandMessage,
|
self.drive_command_publisher = rospy.Publisher(self.drive_command_publisher_topic, DriveCommandMessage,
|
||||||
queue_size=1)
|
queue_size=1)
|
||||||
self.iris
|
self.iris_status_publisher = rospy.Publisher(self.iris_status_publisher_topic, IrisStatusMessage,
|
||||||
|
queue_size=1)
|
||||||
|
|
||||||
self.registers = []
|
self.registers = []
|
||||||
|
|
||||||
|
self.iris_connected = False
|
||||||
|
|
||||||
self.run()
|
self.run()
|
||||||
|
|
||||||
def __setup_minimalmodbus_for_485(self):
|
def __setup_minimalmodbus_for_485(self):
|
||||||
@@ -125,7 +127,7 @@ class IrisController(object):
|
|||||||
try:
|
try:
|
||||||
self.registers = self.iris.read_registers(0, len(MODBUS_REGISTERS))
|
self.registers = self.iris.read_registers(0, len(MODBUS_REGISTERS))
|
||||||
except Exception, error:
|
except Exception, error:
|
||||||
print error
|
self.iris_connected = False
|
||||||
|
|
||||||
def broadcast_drive_if_current_mode(self):
|
def broadcast_drive_if_current_mode(self):
|
||||||
if self.registers[MODBUS_REGISTERS[REGISTER_STATE_MAPPING["DRIVE_VS_ARM"]]] < SBUS_VALUES["SBUS_MID"]:
|
if self.registers[MODBUS_REGISTERS[REGISTER_STATE_MAPPING["DRIVE_VS_ARM"]]] < SBUS_VALUES["SBUS_MID"]:
|
||||||
@@ -161,7 +163,10 @@ class IrisController(object):
|
|||||||
print "Arm"
|
print "Arm"
|
||||||
|
|
||||||
def broadcast_iris_status(self):
|
def broadcast_iris_status(self):
|
||||||
print self.registers[MODBUS_REGISTERS["VOLTAGE_24V"]]
|
status_message = IrisStatusMessage()
|
||||||
|
status_message.iris_connected = True
|
||||||
|
status_message.voltage_24v = self.registers[MODBUS_REGISTERS["VOLTAGE_24V"]]
|
||||||
|
self.iris_status_publisher.publish(status_message)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
<param name="port" value="17018" />
|
<param name="port" value="17018" />
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<node name="gps_status_udp" pkg="nimbro_topic_transport" type="tcp_receiver" output="screen">
|
<node name="udp_statuses" pkg="nimbro_topic_transport" type="udp_receiver" output="screen">
|
||||||
<param name="port" value="17019" />
|
<param name="port" value="17019" />
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@
|
|||||||
<param name="destination_addr" value="$(arg target)" />
|
<param name="destination_addr" value="$(arg target)" />
|
||||||
<param name="destination_port" value="17013" />
|
<param name="destination_port" value="17013" />
|
||||||
<rosparam param="topics">
|
<rosparam param="topics">
|
||||||
[{name: "/rover_status/bogie_status", compress: false, rate: 1.0}]
|
[{name: "/rover_status/wheel_status", compress: false, rate: 1.0}]
|
||||||
</rosparam>
|
</rosparam>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
@@ -146,11 +146,14 @@
|
|||||||
</rosparam>
|
</rosparam>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<node name="gps_status_udp_sender" pkg="nimbro_topic_transport" type="udp_sender" output="screen">
|
<node name="udp_statuses_sender" pkg="nimbro_topic_transport" type="udp_sender" output="screen">
|
||||||
<param name="destination_addr" value="$(arg target)" />
|
<param name="destination_addr" value="$(arg target)" />
|
||||||
<param name="destination_port" value="17019" />
|
<param name="destination_port" value="17019" />
|
||||||
<rosparam param="topics">
|
<rosparam param="topics">
|
||||||
[{name: "/rover_status/gps_status", compress: true, rate: 5.0}]
|
[
|
||||||
|
{name: "/rover_status/gps_status", compress: true, rate: 5.0},
|
||||||
|
{name: "/rover_status/battery_status", compress: false, rate: 1.0}
|
||||||
|
]
|
||||||
</rosparam>
|
</rosparam>
|
||||||
</node>
|
</node>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ find_package(catkin REQUIRED COMPONENTS
|
|||||||
|
|
||||||
add_message_files(
|
add_message_files(
|
||||||
FILES
|
FILES
|
||||||
|
BatteryStatusMessage.msg
|
||||||
RoverSysStatus.msg
|
RoverSysStatus.msg
|
||||||
WheelStatuses.msg
|
WheelStatuses.msg
|
||||||
FrSkyStatus.msg
|
FrSkyStatus.msg
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
float32 battery_voltage
|
||||||
@@ -8,8 +8,8 @@ import os.path
|
|||||||
import psutil
|
import psutil
|
||||||
import pynmea2
|
import pynmea2
|
||||||
import subprocess
|
import subprocess
|
||||||
from rover_status.msg import CameraStatuses, WheelStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo
|
from rover_status.msg import BatteryStatusMessage, CameraStatuses, WheelStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo
|
||||||
from rover_control.msg import DriveCommandMessage, DriveStatusMessage
|
from rover_control.msg import DriveCommandMessage, DriveStatusMessage, IrisStatusMessage
|
||||||
from std_msgs.msg import Empty
|
from std_msgs.msg import Empty
|
||||||
from nmea_msgs.msg import Sentence
|
from nmea_msgs.msg import Sentence
|
||||||
from time import time
|
from time import time
|
||||||
@@ -19,6 +19,7 @@ from time import time
|
|||||||
# Global Variables
|
# Global Variables
|
||||||
#####################################
|
#####################################
|
||||||
# Publishers
|
# Publishers
|
||||||
|
DEFAULT_BATTERY_TOPIC_NAME = "battery_status"
|
||||||
DEFAULT_CAMERA_TOPIC_NAME = "camera_status"
|
DEFAULT_CAMERA_TOPIC_NAME = "camera_status"
|
||||||
DEFAULT_WHEEL_TOPIC_NAME = "wheel_status"
|
DEFAULT_WHEEL_TOPIC_NAME = "wheel_status"
|
||||||
DEFAULT_FRSKY_TOPIC_NAME = "frsky_status"
|
DEFAULT_FRSKY_TOPIC_NAME = "frsky_status"
|
||||||
@@ -27,9 +28,11 @@ DEFAULT_JETSON_TOPIC_NAME = "jetson_status"
|
|||||||
DEFAULT_MISC_TOPIC_NAME = "misc_status"
|
DEFAULT_MISC_TOPIC_NAME = "misc_status"
|
||||||
|
|
||||||
MAX_JETSON_UPDATE_HERTZ = 0.2
|
MAX_JETSON_UPDATE_HERTZ = 0.2
|
||||||
|
MAX_IRIS_UPDATE_HERTZ = 0.2
|
||||||
|
|
||||||
# Subscribers
|
# Subscribers
|
||||||
DEFAULT_REQUEST_UPDATE_TOPIC_NAME = "update_requested"
|
DEFAULT_REQUEST_UPDATE_TOPIC_NAME = "update_requested"
|
||||||
|
DEFAULT_IRIS_STATUS_TOPIC_NAME = "/rover_control/iris_status"
|
||||||
DEFAULT_BOGIE_LEFT_TOPIC_NAME = '/rover_control/drive_status/left'
|
DEFAULT_BOGIE_LEFT_TOPIC_NAME = '/rover_control/drive_status/left'
|
||||||
DEFAULT_BOGIE_RIGHT_TOPIC_NAME = '/rover_control/drive_status/right'
|
DEFAULT_BOGIE_RIGHT_TOPIC_NAME = '/rover_control/drive_status/right'
|
||||||
DEFAULT_BOGIE_REAR_TOPIC_NAME = '/rover_control/drive_status/rear'
|
DEFAULT_BOGIE_REAR_TOPIC_NAME = '/rover_control/drive_status/rear'
|
||||||
@@ -59,6 +62,7 @@ class SystemStatuses:
|
|||||||
rospy.init_node('SystemStatuses')
|
rospy.init_node('SystemStatuses')
|
||||||
|
|
||||||
# Get Topic Names
|
# Get Topic Names
|
||||||
|
self.battery_topic_name = rospy.get_param("~pub_battery_status_topic", DEFAULT_BATTERY_TOPIC_NAME)
|
||||||
self.camera_topic_name = rospy.get_param("~pub_camera_status_topic", DEFAULT_CAMERA_TOPIC_NAME)
|
self.camera_topic_name = rospy.get_param("~pub_camera_status_topic", DEFAULT_CAMERA_TOPIC_NAME)
|
||||||
self.wheel_topic_name = rospy.get_param("~pub_wheel_status_topic", DEFAULT_WHEEL_TOPIC_NAME)
|
self.wheel_topic_name = rospy.get_param("~pub_wheel_status_topic", DEFAULT_WHEEL_TOPIC_NAME)
|
||||||
self.frsky_topic_name = rospy.get_param("~pub_frsky_status_topic", DEFAULT_FRSKY_TOPIC_NAME)
|
self.frsky_topic_name = rospy.get_param("~pub_frsky_status_topic", DEFAULT_FRSKY_TOPIC_NAME)
|
||||||
@@ -69,12 +73,15 @@ class SystemStatuses:
|
|||||||
# Subscribers
|
# Subscribers
|
||||||
self.request_update_topic_name = rospy.get_param("~sub_request_update_status_topic",
|
self.request_update_topic_name = rospy.get_param("~sub_request_update_status_topic",
|
||||||
DEFAULT_REQUEST_UPDATE_TOPIC_NAME)
|
DEFAULT_REQUEST_UPDATE_TOPIC_NAME)
|
||||||
|
|
||||||
|
self.iris_status_topic_name = rospy.get_param("~sub_iris_status_topic", DEFAULT_IRIS_STATUS_TOPIC_NAME)
|
||||||
self.bogie_left_topic_name = rospy.get_param("~sub_bogie_left_topic", DEFAULT_BOGIE_LEFT_TOPIC_NAME)
|
self.bogie_left_topic_name = rospy.get_param("~sub_bogie_left_topic", DEFAULT_BOGIE_LEFT_TOPIC_NAME)
|
||||||
self.bogie_right_topic_name = rospy.get_param("~sub_bogie_right_topic", DEFAULT_BOGIE_RIGHT_TOPIC_NAME)
|
self.bogie_right_topic_name = rospy.get_param("~sub_bogie_right_topic", DEFAULT_BOGIE_RIGHT_TOPIC_NAME)
|
||||||
self.bogie_rear_topic_name = rospy.get_param("~sub_bogie_rear_topic", DEFAULT_BOGIE_REAR_TOPIC_NAME)
|
self.bogie_rear_topic_name = rospy.get_param("~sub_bogie_rear_topic", DEFAULT_BOGIE_REAR_TOPIC_NAME)
|
||||||
self.gps_nmea_topic_name = rospy.get_param("~sub_gps_nmea_topic", DEFAULT_GPS_NMEA_TOPIC_NAME)
|
self.gps_nmea_topic_name = rospy.get_param("~sub_gps_nmea_topic", DEFAULT_GPS_NMEA_TOPIC_NAME)
|
||||||
|
|
||||||
# init all publisher functions
|
# init all publisher functions
|
||||||
|
self.pub_battery = rospy.Publisher(self.battery_topic_name, BatteryStatusMessage, queue_size=1)
|
||||||
self.pub_camera = rospy.Publisher(self.camera_topic_name, CameraStatuses, queue_size=1)
|
self.pub_camera = rospy.Publisher(self.camera_topic_name, CameraStatuses, queue_size=1)
|
||||||
self.pub_wheel = rospy.Publisher(self.wheel_topic_name, WheelStatuses, queue_size=1)
|
self.pub_wheel = rospy.Publisher(self.wheel_topic_name, WheelStatuses, queue_size=1)
|
||||||
self.pub_FrSky = rospy.Publisher(self.frsky_topic_name, FrSkyStatus, queue_size=1)
|
self.pub_FrSky = rospy.Publisher(self.frsky_topic_name, FrSkyStatus, queue_size=1)
|
||||||
@@ -90,6 +97,7 @@ class SystemStatuses:
|
|||||||
self.manual_update_requested = False
|
self.manual_update_requested = False
|
||||||
|
|
||||||
# init all message variables
|
# init all message variables
|
||||||
|
self.battery_message = BatteryStatusMessage()
|
||||||
self.camera_msg = CameraStatuses()
|
self.camera_msg = CameraStatuses()
|
||||||
self.wheel_msg = WheelStatuses()
|
self.wheel_msg = WheelStatuses()
|
||||||
self.FrSky_msg = FrSkyStatus()
|
self.FrSky_msg = FrSkyStatus()
|
||||||
@@ -106,6 +114,7 @@ class SystemStatuses:
|
|||||||
self.__update_all_previous_values()
|
self.__update_all_previous_values()
|
||||||
|
|
||||||
self.last_jetson_message_sent = time()
|
self.last_jetson_message_sent = time()
|
||||||
|
self.last_iris_message_sent = time()
|
||||||
|
|
||||||
# init all RoverSysMessage values
|
# init all RoverSysMessage values
|
||||||
def __pull_new_message_values(self):
|
def __pull_new_message_values(self):
|
||||||
@@ -138,6 +147,9 @@ class SystemStatuses:
|
|||||||
|
|
||||||
# Instantiates all subscriber methods
|
# Instantiates all subscriber methods
|
||||||
def __instantiate_subscribers(self):
|
def __instantiate_subscribers(self):
|
||||||
|
# Iris Status Subscriber
|
||||||
|
self.iris_status_sub = rospy.Subscriber(self.iris_status_topic_name, IrisStatusMessage, self.__iris_status_callback)
|
||||||
|
|
||||||
# Bogie Wheel Subscribers
|
# Bogie Wheel Subscribers
|
||||||
self.bogie_left_sub = rospy.Subscriber(self.bogie_left_topic_name, DriveStatusMessage, self.__left_wheel_callback)
|
self.bogie_left_sub = rospy.Subscriber(self.bogie_left_topic_name, DriveStatusMessage, self.__left_wheel_callback)
|
||||||
self.bogie_right_sub = rospy.Subscriber(self.bogie_right_topic_name, DriveStatusMessage, self.__right_wheel_callback)
|
self.bogie_right_sub = rospy.Subscriber(self.bogie_right_topic_name, DriveStatusMessage, self.__right_wheel_callback)
|
||||||
@@ -145,6 +157,9 @@ class SystemStatuses:
|
|||||||
# GPS NMEA subscriber
|
# GPS NMEA subscriber
|
||||||
self.gps_nmea_sub = rospy.Subscriber(self.gps_nmea_topic_name, Sentence, self.__set_gps_info)
|
self.gps_nmea_sub = rospy.Subscriber(self.gps_nmea_topic_name, Sentence, self.__set_gps_info)
|
||||||
|
|
||||||
|
def __iris_status_callback(self, data):
|
||||||
|
self.battery_message.battery_voltage = data.voltage_24v
|
||||||
|
|
||||||
def __left_wheel_callback(self, data):
|
def __left_wheel_callback(self, data):
|
||||||
self.wheel_msg.front_left = data.first_motor_connected
|
self.wheel_msg.front_left = data.first_motor_connected
|
||||||
self.wheel_msg.middle_left = data.second_motor_connected
|
self.wheel_msg.middle_left = data.second_motor_connected
|
||||||
@@ -228,6 +243,7 @@ class SystemStatuses:
|
|||||||
|
|
||||||
# Used mainly for init, sets all previous values in one go
|
# Used mainly for init, sets all previous values in one go
|
||||||
def __update_all_previous_values(self):
|
def __update_all_previous_values(self):
|
||||||
|
self.__set_previous_battery_values()
|
||||||
self.__set_previous_camera_values()
|
self.__set_previous_camera_values()
|
||||||
self.__set_previous_jetson_values()
|
self.__set_previous_jetson_values()
|
||||||
self.__set_previous_frsky_value()
|
self.__set_previous_frsky_value()
|
||||||
@@ -274,6 +290,9 @@ class SystemStatuses:
|
|||||||
self.previous_sample_containment_connection_status = self.misc_msg.sample_containment_connection_status
|
self.previous_sample_containment_connection_status = self.misc_msg.sample_containment_connection_status
|
||||||
self.previous_tower_connection_status = self.misc_msg.tower_connection_status
|
self.previous_tower_connection_status = self.misc_msg.tower_connection_status
|
||||||
|
|
||||||
|
def __set_previous_battery_values(self):
|
||||||
|
self.previous_battery_voltage = self.battery_message.battery_voltage
|
||||||
|
|
||||||
def on_update_requested(self, _):
|
def on_update_requested(self, _):
|
||||||
self.manual_update_requested = True
|
self.manual_update_requested = True
|
||||||
|
|
||||||
@@ -283,6 +302,13 @@ class SystemStatuses:
|
|||||||
# Update all message values
|
# Update all message values
|
||||||
self.__pull_new_message_values()
|
self.__pull_new_message_values()
|
||||||
|
|
||||||
|
if (self.battery_message.battery_voltage != self.previous_battery_voltage or
|
||||||
|
self.manual_update_requested):
|
||||||
|
if (time() - self.last_iris_message_sent) > (1.0 / MAX_IRIS_UPDATE_HERTZ):
|
||||||
|
self.__set_previous_battery_values()
|
||||||
|
self.pub_battery.publish(self.battery_message)
|
||||||
|
self.last_iris_message_sent = time()
|
||||||
|
|
||||||
# Camera Check -- if current value is now different from previous value,
|
# Camera Check -- if current value is now different from previous value,
|
||||||
# update the previous value for cameras and publish to listening Subscribers
|
# update the previous value for cameras and publish to listening Subscribers
|
||||||
if (self.camera_msg.camera_zed != self.previous_camera_zed or
|
if (self.camera_msg.camera_zed != self.previous_camera_zed or
|
||||||
|
|||||||
Reference in New Issue
Block a user