diff --git a/src/drone_services/msg/DroneArmStatus.msg b/src/drone_services/msg/DroneArmStatus.msg new file mode 100644 index 00000000..117ae05f --- /dev/null +++ b/src/drone_services/msg/DroneArmStatus.msg @@ -0,0 +1 @@ +bool armed false \ No newline at end of file diff --git a/src/drone_services/msg/DroneRouteStatus.msg b/src/drone_services/msg/DroneRouteStatus.msg new file mode 100644 index 00000000..bcf2a7c0 --- /dev/null +++ b/src/drone_services/msg/DroneRouteStatus.msg @@ -0,0 +1,2 @@ +int32 current_setpoint_index +float32[5] current_setpoint # x,y,z,angle,take_picture \ No newline at end of file diff --git a/src/drone_services/msg/DroneStatus.msg b/src/drone_services/msg/DroneStatus.msg new file mode 100644 index 00000000..0489be52 --- /dev/null +++ b/src/drone_services/msg/DroneStatus.msg @@ -0,0 +1,5 @@ +float32 battery_percentage +float32 cpu_usage +int32 route_setpoint # -1 if no route +wstring control_mode +bool armed \ No newline at end of file diff --git a/src/drone_status/drone_status/drone_status.py b/src/drone_status/drone_status/drone_status.py new file mode 100644 index 00000000..ab8046af --- /dev/null +++ b/src/drone_status/drone_status/drone_status.py @@ -0,0 +1,63 @@ +import rclpy +from rclpy.node import Node + +from drone_services.msg import DroneStatus +from drone_services.msg import DroneControlMode +from drone_services.msg import DroneArmStatus +from drone_services.msg import DroneRouteStatus +from px4_msgs.msg import BatteryStatus +from px4_msgs.msg import Cpuload + +CONTROL_MODE_ATTITUDE = 1 +CONTROL_MODE_VELOCITY = 2 +CONTROL_MODE_POSITION = 3 + +class DroneStatus(Node): + def __init__(self): + super().__init__('drone_status') + #publish to drone/status topic + self.publisher = self.create_publisher(DroneStatus, '/drone/status', 10) + self.control_mode_subscriber = self.create_subscription(DroneControlMode, '/drone/control_mode', self.control_mode_callback, 10) + self.arm_status_subscriber = self.create_subscription(DroneArmStatus, '/drone/arm_status', self.arm_status_callback, 10) + self.route_status_subscriber = self.create_subscription(DroneRouteStatus, '/drone/route_status', self.route_status_callback, 10) + self.battery_status_subscriber = self.create_subscription(BatteryStatus, '/fmu/out/battery_status', self.battery_status_callback, 10) + self.cpu_load_subscriber = self.create_subscription(Cpuload, '/fmu/out/cpuload', self.cpu_load_callback, 10) + #publish every 0.5 seconds + self.timer = self.create_timer(0.5, self.publish_status) + self.armed = False + self.control_mode = "attitude" + self.battery_percentage = 100.0 + self.cpu_usage = 0.0 + self.route_setpoint = 0 + + def publish_status(self): + msg = DroneStatus() + msg.armed = self.armed + msg.control_mode = self.control_mode + msg.battery_percentage = self.battery_percentage + msg.cpu_usage = self.cpu_usage + msg.route_setpoint = self.route_setpoint + self.publisher.publish(msg) + self.get_logger().info('Publishing: "%s"' % msg.status) + + def control_mode_callback(self,msg): + if msg.control_mode == CONTROL_MODE_ATTITUDE: + self.control_mode = "attitude" + elif msg.control_mode == CONTROL_MODE_VELOCITY: + self.control_mode = "velocity" + elif msg.control_mode == CONTROL_MODE_POSITION: + self.control_mode = "position" + else: + self.control_mode = "unknown" + + def arm_status_callback(self,msg): + self.armed = msg.armed + + def route_status_callback(self,msg): + self.route_setpoint = msg.current_setpoint_index + + def battery_status_callback(self, msg): + self.battery_percentage = msg.remaining * 100.0 + + def cpu_load_callback(self, msg): + self.cpu_usage = msg.load \ No newline at end of file diff --git a/src/drone_status/package.xml b/src/drone_status/package.xml index 61241c9d..96b4dd15 100644 --- a/src/drone_status/package.xml +++ b/src/drone_status/package.xml @@ -1,18 +1,21 @@ - drone_status - 0.0.0 - TODO: Package description - ubuntu - TODO: License declaration + drone_status + 0.0.0 + Package for combining several data points from the drone into a single topic + ubuntu + Apache License 2.0 + rclpy + drone_services + px4_msgs - ament_copyright - ament_flake8 - ament_pep257 - python3-pytest + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest - - ament_python - - + + ament_python + + \ No newline at end of file diff --git a/src/px4_msgs b/src/px4_msgs index ffc3a4cd..b64ef047 160000 --- a/src/px4_msgs +++ b/src/px4_msgs @@ -1 +1 @@ -Subproject commit ffc3a4cd578776213a444abe17d7eabf9621b266 +Subproject commit b64ef0475c1d44605688f4770899fe453d532be4