diff --git a/auto_start/auto_start_anchor.sh b/auto_start/auto_start_anchor.sh index 724062c..0d7e9c2 100755 --- a/auto_start/auto_start_anchor.sh +++ b/auto_start/auto_start_anchor.sh @@ -21,4 +21,4 @@ source /home/clucky/rover-ros2/install/setup.bash cd /home/clucky/rover-ros2/ # Launch the ROS 2 node with the desired mode -ros2 launch rover_launch.py mode:=anchor +ros2 launch anchor_pkg rover.launch.py mode:=anchor diff --git a/flake.nix b/flake.nix index c468e6b..8e7b60f 100644 --- a/flake.nix +++ b/flake.nix @@ -31,6 +31,7 @@ pygame scipy crccheck + black ] )) ( diff --git a/src/anchor_pkg/anchor_pkg/anchor_node.py b/src/anchor_pkg/anchor_pkg/anchor_node.py index bba092f..e4d1ff5 100644 --- a/src/anchor_pkg/anchor_pkg/anchor_node.py +++ b/src/anchor_pkg/anchor_pkg/anchor_node.py @@ -43,27 +43,6 @@ class SerialRelay(Node): # Initalize node with name super().__init__("anchor_node")#previously 'serial_publisher' - # New pub/sub with VicCAN - self.fromvic_debug_pub_ = self.create_publisher(String, '/anchor/from_vic/debug', 20) - self.fromvic_core_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/core', 20) - self.fromvic_arm_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/arm', 20) - self.fromvic_bio_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/bio', 20) - - self.mock_mcu_sub_ = self.create_subscription(String, '/anchor/from_vic/mock_mcu', self.on_mock_fromvic, 20) - self.tovic_sub_ = self.create_subscription(VicCAN, '/anchor/to_vic/relay', self.on_relay_tovic_viccan, 20) - self.tovic_debug_sub_ = self.create_subscription(String, '/anchor/to_vic/relay_string', self.on_relay_tovic_string, 20) - - - # Create publishers - self.arm_pub = self.create_publisher(String, '/anchor/arm/feedback', 10) - self.core_pub = self.create_publisher(String, '/anchor/core/feedback', 10) - self.bio_pub = self.create_publisher(String, '/anchor/bio/feedback', 10) - - self.debug_pub = self.create_publisher(String, '/anchor/debug', 10) - - # Create a subscriber - self.relay_sub = self.create_subscription(String, '/anchor/relay', self.on_relay_tovic_string, 10) - # Loop through all serial devices on the computer to check for the MCU self.port = None if port_override := os.getenv("PORT_OVERRIDE"): @@ -98,6 +77,27 @@ class SerialRelay(Node): self.ser.write(b"can_relay_mode,on\n") atexit.register(self.cleanup) + # New pub/sub with VicCAN + self.fromvic_debug_pub_ = self.create_publisher(String, '/anchor/from_vic/debug', 20) + self.fromvic_core_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/core', 20) + self.fromvic_arm_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/arm', 20) + self.fromvic_bio_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/bio', 20) + + self.mock_mcu_sub_ = self.create_subscription(String, '/anchor/from_vic/mock_mcu', self.on_mock_fromvic, 20) + self.tovic_sub_ = self.create_subscription(VicCAN, '/anchor/to_vic/relay', self.on_relay_tovic_viccan, 20) + self.tovic_debug_sub_ = self.create_subscription(String, '/anchor/to_vic/relay_string', self.on_relay_tovic_string, 20) + + + # Create publishers + self.arm_pub = self.create_publisher(String, '/anchor/arm/feedback', 10) + self.core_pub = self.create_publisher(String, '/anchor/core/feedback', 10) + self.bio_pub = self.create_publisher(String, '/anchor/bio/feedback', 10) + + self.debug_pub = self.create_publisher(String, '/anchor/debug', 10) + + # Create a subscriber + self.relay_sub = self.create_subscription(String, '/anchor/relay', self.on_relay_tovic_string, 10) + def run(self): # This thread makes all the update processes run in the background diff --git a/rover_launch.py b/src/anchor_pkg/launch/rover.launch.py similarity index 100% rename from rover_launch.py rename to src/anchor_pkg/launch/rover.launch.py diff --git a/src/anchor_pkg/package.xml b/src/anchor_pkg/package.xml index 60964eb..4903787 100644 --- a/src/anchor_pkg/package.xml +++ b/src/anchor_pkg/package.xml @@ -11,6 +11,8 @@ common_interfaces python3-serial + black + ament_copyright ament_flake8 ament_pep257 diff --git a/src/anchor_pkg/setup.py b/src/anchor_pkg/setup.py index e2844e7..f29392e 100644 --- a/src/anchor_pkg/setup.py +++ b/src/anchor_pkg/setup.py @@ -1,4 +1,6 @@ from setuptools import find_packages, setup +from os import path +from glob import glob package_name = 'anchor_pkg' @@ -9,7 +11,8 @@ setup( data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), - ('share/' + package_name, ['package.xml']), + (path.join("share", package_name), ['package.xml']), + (path.join("share", package_name, "launch"), glob("launch/*")) ], install_requires=['setuptools'], zip_safe=True, diff --git a/src/core_pkg/core_pkg/core_node.py b/src/core_pkg/core_pkg/core_node.py index ae9b173..42c692d 100644 --- a/src/core_pkg/core_pkg/core_node.py +++ b/src/core_pkg/core_pkg/core_node.py @@ -426,6 +426,9 @@ class SerialRelay(Node): motor = self.feedback_new_state.fr_motor case 4: motor = self.feedback_new_state.br_motor + case _: + self.get_logger().warning(f"Ignoring REV motor feedback 53 with invalid motorId {motorId}") + return if motor: motor.temperature = temp @@ -471,6 +474,9 @@ class SerialRelay(Node): case 4: motor = self.feedback_new_state.br_motor joint_state_msg.name = ["br_motor_joint"] + case _: + self.get_logger().warning(f"Ignoring REV motor feedback 58 with invalid motorId {motorId}") + return joint_state_msg.header.stamp = msg.header.stamp self.joint_state_pub_.publish(joint_state_msg) diff --git a/src/headless_pkg/src/headless_node.py b/src/headless_pkg/src/headless_node.py index d8df59d..fa5e3ff 100755 --- a/src/headless_pkg/src/headless_node.py +++ b/src/headless_pkg/src/headless_node.py @@ -48,6 +48,14 @@ class Headless(Node): # Initialize pygame first pygame.init() pygame.joystick.init() + super().__init__("headless") + + # Wait for anchor to start + pub_info = self.get_publishers_info_by_topic('/anchor/from_vic/debug') + while len(pub_info) == 0: + self.get_logger().info("Waiting for anchor to start...") + time.sleep(1.0) + pub_info = self.get_publishers_info_by_topic('/anchor/from_vic/debug') # Wait for a gamepad to be connected print("Waiting for gamepad connection...") @@ -65,8 +73,6 @@ class Headless(Node): self.gamepad.init() print(f'Gamepad Found: {self.gamepad.get_name()}') - # Now initialize the ROS2 node - super().__init__("headless") self.create_timer(0.15, self.send_controls) self.core_publisher = self.create_publisher(CoreControl, '/core/control', 2)