Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Ken Steinfeldt
2018-03-08 15:04:36 -08:00
14 changed files with 123 additions and 50 deletions

View File

@@ -12,6 +12,7 @@ folders_to_link=(
nimbro_topic_transport nimbro_topic_transport
rover_main rover_main
rover_camera rover_camera
rover_status
) )
# Print heading # Print heading

View File

@@ -45,6 +45,19 @@ class DriveCoordinator(object):
self.wait_time = 1.0 / rospy.get_param("~hertz", DEFAULT_HERTZ) self.wait_time = 1.0 / rospy.get_param("~hertz", DEFAULT_HERTZ)
# Drive data
self.drive_command_data = {
"iris": {
"message": DriveCommandMessage(),
"last_time": time()
},
"ground_station": {
"message": DriveCommandMessage(),
"last_time": time()
}
}
# ########## Class Variables ########## # ########## Class Variables ##########
self.iris_drive_command_subscriber = rospy.Subscriber(self.iris_drive_command_topic, self.iris_drive_command_subscriber = rospy.Subscriber(self.iris_drive_command_topic,
DriveCommandMessage, DriveCommandMessage,
@@ -58,17 +71,6 @@ class DriveCoordinator(object):
self.left_bogie_publisher = rospy.Publisher(self.left_bogie_topic, DriveControlMessage, queue_size=1) self.left_bogie_publisher = rospy.Publisher(self.left_bogie_topic, DriveControlMessage, queue_size=1)
self.right_bogie_publisher = rospy.Publisher(self.right_bogie_topic, DriveControlMessage, queue_size=1) self.right_bogie_publisher = rospy.Publisher(self.right_bogie_topic, DriveControlMessage, queue_size=1)
self.drive_command_data = {
"iris": {
"message": DriveCommandMessage(),
"last_time": time()
},
"ground_station": {
"message": DriveCommandMessage(),
"last_time": time()
}
}
self.last_message_time = time() self.last_message_time = time()

View File

@@ -47,5 +47,9 @@
<node name="end_effector_256x144" pkg="nimbro_topic_transport" type="udp_receiver" output="screen"> <node name="end_effector_256x144" pkg="nimbro_topic_transport" type="udp_receiver" output="screen">
<param name="port" value="17012" /> <param name="port" value="17012" />
</node> </node>
<node name="rover_status" pkg="nimbro_topic_transport" type="tcp_receiver" output="screen">
<param name="port" value="17013" />
</node>
</group> </group>
</launch> </launch>

View File

@@ -14,12 +14,12 @@
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17021" /> <param name="destination_port" value="17021" />
<rosparam param="topics"> <rosparam param="topics">
[ [{name: "/cameras/chassis/camera_control", compress: true, rate: 5.0},
{name: "/cameras/chassis/camera_control", compress: true, rate: 5.0},
{name: "/cameras/undercarriage/camera_control", compress: true, rate: 5.0}, {name: "/cameras/undercarriage/camera_control", compress: true, rate: 5.0},
{name: "/cameras/main_navigation/camera_control", compress: true, rate: 5.0}, {name: "/cameras/main_navigation/camera_control", compress: true, rate: 5.0},
{name: "/cameras/end_effector/camera_control", compress: true, rate: 5.0} {name: "/cameras/end_effector/camera_control", compress: true, rate: 5.0},
] {name: "/cameras/chassis/camera_control", compress: true, rate: 1.0},
{name: "/rover_status/update_requested", compress: true, rate: 1.0}]
</rosparam> </rosparam>
</node> </node>
</group> </group>

View File

@@ -6,6 +6,7 @@
<include file="$(find rover_main)/launch/rover/cameras.launch"/> <include file="$(find rover_main)/launch/rover/cameras.launch"/>
<!-- ########## Start System Status Monitoring Nodes ########## --> <!-- ########## Start System Status Monitoring Nodes ########## -->
<include file="$(find rover_main)/launch/rover/status.launch"/>
<!-- ########## Start Nimbro Topic Transport Nodes ########## --> <!-- ########## Start Nimbro Topic Transport Nodes ########## -->
<include file="$(find rover_main)/launch/rover/topic_transport_senders.launch"/> <include file="$(find rover_main)/launch/rover/topic_transport_senders.launch"/>

View File

@@ -0,0 +1,5 @@
<launch>
<group ns="rover_status">
<node name="rover_status" pkg="rover_status" type="system_statuses_node.py" output="screen"/>
</group>
</launch>

View File

@@ -97,5 +97,18 @@
[{name: "/cameras/end_effector/image_256x144/compressed", compress: false, rate: 0.0}] [{name: "/cameras/end_effector/image_256x144/compressed", compress: false, rate: 0.0}]
</rosparam> </rosparam>
</node> </node>
<node name="rover_tcp_topics" pkg="nimbro_topic_transport" type="tcp_sender" output="screen">
<param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17013" />
<rosparam param="topics">
[{name: "/rover_status/bogie_status", compress: true, rate: 1.0},
{name: "/rover_status/camera_status", compress: true, rate: 1.0},
{name: "/rover_status/frsky_status", compress: true, rate: 1.0},
{name: "/rover_status/gps_status", compress: true, rate: 1.0},
{name: "/rover_status/jetson_status", compress: true, rate: 5.0},
{name: "/rover_status/misc_status", compress: true, rate: 1.0}]
</rosparam>
</node>
</group> </group>
</launch> </launch>

View File

@@ -1,3 +1,3 @@
int8 bogie_connection_1 bool bogie_connection_1
int8 bogie_connection_2 bool bogie_connection_2
int8 bogie_connection_3 bool bogie_connection_3

View File

@@ -1,4 +1,4 @@
int8 camera_zed bool camera_zed
int8 camera_undercarriage bool camera_undercarriage
int8 camera_chassis bool camera_chassis
int8 camera_main_navigation bool camera_main_navigation

View File

@@ -1 +1 @@
int8 FrSky_controller_connection_status bool FrSky_controller_connection_status

View File

@@ -1,5 +1,5 @@
int8 arm_connection_status bool arm_connection_status
int8 arm_end_effector_connection_statuses bool arm_end_effector_connection_statuses
int8 sample_containment_connection_status bool sample_containment_connection_status
int8 tower_connection_status bool tower_connection_status
int8 chassis_pan_tilt_connection_status bool chassis_pan_tilt_connection_status

View File

@@ -1,7 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import rospy import rospy
from system_statuses.msg import CameraStatuses, BogieStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo from rover_status.msg import CameraStatuses, BogieStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo
# THIS IS A SUPER ROUGH EXAMPLE OF HOW TO PULL THE DATA # THIS IS A SUPER ROUGH EXAMPLE OF HOW TO PULL THE DATA
# You can create your own message formats in the msg folder # You can create your own message formats in the msg folder
@@ -9,8 +8,8 @@ from system_statuses.msg import CameraStatuses, BogieStatuses, FrSkyStatus, GPSI
# and storing them into self values. # and storing them into self values.
# The ground control code sounds like it'll be fairly different in format. # The ground control code sounds like it'll be fairly different in format.
class RoverStatuses:
class RoverStatuses:
def __init__(self): def __init__(self):
rospy.init_node('RoverStatuses') rospy.init_node('RoverStatuses')
@@ -74,7 +73,6 @@ class RoverStatuses:
rospy.Subscriber('misc_system_status_chatter', MiscStatuses, self.__misc_callback) rospy.Subscriber('misc_system_status_chatter', MiscStatuses, self.__misc_callback)
rospy.spin() rospy.spin()
if __name__ == '__main__': if __name__ == '__main__':
rover_statuses = RoverStatuses() rover_statuses = RoverStatuses()
rover_statuses.run() rover_statuses.run()

View File

@@ -1,13 +1,34 @@
#!/usr/bin/env python #!/usr/bin/env python
#####################################
# Imports
#####################################
# Python native imports
import rospy import rospy
import os.path import os.path
import psutil import psutil
import subprocess import subprocess
from system_statuses.msg import CameraStatuses, BogieStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo from rover_status.msg import CameraStatuses, BogieStatuses, FrSkyStatus, GPSInfo, MiscStatuses, JetsonInfo
from rover_control.msg import DriveCommandMessage from rover_control.msg import DriveCommandMessage
from std_msgs.msg import Empty
#####################################
# Global Variables
#####################################
DEFAULT_CAMERA_TOPIC_NAME = "camera_status"
DEFAULT_BOGIE_TOPIC_NAME = "bogie_status"
DEFAULT_FRSKY_TOPIC_NAME = "frsky_status"
DEFAULT_GPS_TOPIC_NAME = "gps_status"
DEFAULT_JETSON_TOPIC_NAME = "jetson_status"
DEFAULT_MISC_TOPIC_NAME = "misc_status"
DEFAULT_REQUEST_UPDATE_TOPIC_NAME = "update_requested"
#####################################
# SystemStatuses Class Definition
#####################################
class SystemStatuses: class SystemStatuses:
def __init__(self): def __init__(self):
# Camera path locations # Camera path locations
self.system_path_locations = [ self.system_path_locations = [
@@ -26,13 +47,31 @@ class SystemStatuses:
rospy.init_node('SystemStatuses') rospy.init_node('SystemStatuses')
# Get Topic Names
self.camera_topic_name = rospy.get_param("~camera_status_topic", DEFAULT_CAMERA_TOPIC_NAME)
self.bogie_topic_name = rospy.get_param("~bogie_status_topic", DEFAULT_BOGIE_TOPIC_NAME)
self.frsky_topic_name = rospy.get_param("~frsky_status_topic", DEFAULT_FRSKY_TOPIC_NAME)
self.gps_topic_name = rospy.get_param("~gps_status_topic", DEFAULT_GPS_TOPIC_NAME)
self.jetson_topic_name = rospy.get_param("~jetson_status_topic", DEFAULT_JETSON_TOPIC_NAME)
self.misc_topic_name = rospy.get_param("~misc_status_topic", DEFAULT_MISC_TOPIC_NAME)
self.request_update_topic_name = rospy.get_param("~request_update_status_topic",
DEFAULT_REQUEST_UPDATE_TOPIC_NAME)
# init all publisher functions # init all publisher functions
self.pub_camera = rospy.Publisher('camera_system_status_chatter', CameraStatuses, queue_size=10) self.pub_camera = rospy.Publisher(self.camera_topic_name, CameraStatuses, queue_size=1)
self.pub_bogie = rospy.Publisher('bogie_system_status_chatter', BogieStatuses, queue_size=10) self.pub_bogie = rospy.Publisher(self.bogie_topic_name, BogieStatuses, queue_size=1)
self.pub_FrSky = rospy.Publisher('FrSky_system_status_chatter', FrSkyStatus, queue_size=10) self.pub_FrSky = rospy.Publisher(self.frsky_topic_name, FrSkyStatus, queue_size=1)
self.pub_GPS = rospy.Publisher('GPS_system_status_chatter', GPSInfo, queue_size=10) self.pub_GPS = rospy.Publisher(self.gps_topic_name, GPSInfo, queue_size=1)
self.pub_jetson = rospy.Publisher('jetson_system_status_chatter', JetsonInfo, queue_size=10) self.pub_jetson = rospy.Publisher(self.jetson_topic_name, JetsonInfo, queue_size=1)
self.pub_Misc = rospy.Publisher('misc_system_status_chatter', MiscStatuses, queue_size=10) self.pub_Misc = rospy.Publisher(self.misc_topic_name, MiscStatuses, queue_size=1)
# Subscribers
self.request_update_subscriber = rospy.Subscriber(self.request_update_topic_name, Empty,
self.on_update_requested)
# Manual update variable
self.manual_update_requested = False
# init all message variables # init all message variables
self.camera_msg = CameraStatuses() self.camera_msg = CameraStatuses()
@@ -116,8 +155,8 @@ class SystemStatuses:
try: try:
sensor_temperatures = subprocess.check_output("sensors | grep temp", shell=True) sensor_temperatures = subprocess.check_output("sensors | grep temp", shell=True)
parsed_temps = sensor_temperatures.replace("\xc2\xb0C","").replace("(crit = ","").replace("temp1:","")\ parsed_temps = sensor_temperatures.replace("\xc2\xb0C","").replace("(crit = ","").replace("temp1:","")\
.replace("\n","").replace("+","").split() .replace("\n", "").replace("+", "").split()
self.jetson_msg.jetson_GPU_temp = parsed_temps[4] self.jetson_msg.jetson_GPU_temp = float(parsed_temps[4])
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
print 'sensors call failed (potential reason: on VM)' print 'sensors call failed (potential reason: on VM)'
self.jetson_msg.jetson_GPU_temp = -1.0 self.jetson_msg.jetson_GPU_temp = -1.0
@@ -182,6 +221,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 on_update_requested(self, _):
self.manual_update_requested = True
def run(self): def run(self):
r = rospy.Rate(10) # 10Hz r = rospy.Rate(10) # 10Hz
while not rospy.is_shutdown(): while not rospy.is_shutdown():
@@ -193,7 +235,8 @@ class SystemStatuses:
if (self.camera_msg.camera_zed != self.previous_camera_zed or if (self.camera_msg.camera_zed != self.previous_camera_zed or
self.camera_msg.camera_undercarriage != self.previous_camera_undercarriage or self.camera_msg.camera_undercarriage != self.previous_camera_undercarriage or
self.camera_msg.camera_chassis != self.previous_camera_chassis or self.camera_msg.camera_chassis != self.previous_camera_chassis or
self.camera_msg.camera_main_navigation != self.previous_camera_main_navigation): self.camera_msg.camera_main_navigation != self.previous_camera_main_navigation or
self.manual_update_requested):
self.__set_previous_camera_values() self.__set_previous_camera_values()
self.pub_camera.publish(self.camera_msg) self.pub_camera.publish(self.camera_msg)
@@ -202,25 +245,29 @@ class SystemStatuses:
self.jetson_msg.jetson_RAM != self.previous_jetson_RAM or self.jetson_msg.jetson_RAM != self.previous_jetson_RAM or
self.jetson_msg.jetson_EMMC != self.previous_jetson_EMMC or self.jetson_msg.jetson_EMMC != self.previous_jetson_EMMC or
self.jetson_msg.jetson_NVME_SSD != self.previous_jetson_NVME_SSD or self.jetson_msg.jetson_NVME_SSD != self.previous_jetson_NVME_SSD or
self.jetson_msg.jetson_GPU_temp != self.previous_jetson_GPU_temp): self.jetson_msg.jetson_GPU_temp != self.previous_jetson_GPU_temp or
self.manual_update_requested):
self.__set_previous_jetson_values() self.__set_previous_jetson_values()
self.pub_jetson.publish(self.jetson_msg) self.pub_jetson.publish(self.jetson_msg)
# Placeholder FrSky Controller Check # Placeholder FrSky Controller Check
if self.FrSky_msg.FrSky_controller_connection_status != self.previous_FrSky_controller_connection_status: if (self.FrSky_msg.FrSky_controller_connection_status != self.previous_FrSky_controller_connection_status or
self.manual_update_requested):
self.__set_previous_frsky_value() self.__set_previous_frsky_value()
self.pub_FrSky.publish(self.FrSky_msg) self.pub_FrSky.publish(self.FrSky_msg)
# Placeholder bogie status check # Placeholder bogie status check
if (self.bogie_msg.bogie_connection_1 != self.previous_bogie_connection_1 or if (self.bogie_msg.bogie_connection_1 != self.previous_bogie_connection_1 or
self.bogie_msg.bogie_connection_2 != self.previous_bogie_connection_2 or self.bogie_msg.bogie_connection_2 != self.previous_bogie_connection_2 or
self.bogie_msg.bogie_connection_3 != self.previous_bogie_connection_3): self.bogie_msg.bogie_connection_3 != self.previous_bogie_connection_3 or
self.manual_update_requested):
self.__set_previous_bogie_values() self.__set_previous_bogie_values()
self.pub_bogie.publish(self.bogie_msg) self.pub_bogie.publish(self.bogie_msg)
# Placeholder GPS Information check # Placeholder GPS Information check
if (self.GPS_msg.UTC_GPS_time != self.previous_UTC_GPS_time or if (self.GPS_msg.UTC_GPS_time != self.previous_UTC_GPS_time or
self.GPS_msg.UTC_GPS_time != self.previous_GPS_connection_status): self.GPS_msg.UTC_GPS_time != self.previous_GPS_connection_status or
self.manual_update_requested):
self.__set_previous_gps_values() self.__set_previous_gps_values()
self.pub_GPS.publish(self.GPS_msg) self.pub_GPS.publish(self.GPS_msg)
@@ -233,12 +280,14 @@ class SystemStatuses:
self.previous_chassis_pan_tilt_connection_status or self.previous_chassis_pan_tilt_connection_status or
self.misc_msg.sample_containment_connection_status != self.misc_msg.sample_containment_connection_status !=
self.previous_sample_containment_connection_status or self.previous_sample_containment_connection_status or
self.misc_msg.tower_connection_status != self.misc_msg.tower_connection_status != self.previous_tower_connection_status or
self.previous_tower_connection_status): self.manual_update_requested):
self.__set_previous_misc_values() self.__set_previous_misc_values()
self.pub_Misc.publish(self.misc_msg) self.pub_Misc.publish(self.misc_msg)
# rospy.loginfo(self.msg) if self.manual_update_requested:
self.manual_update_requested = False
r.sleep() r.sleep()