Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8327f47
Drive Changes
ethanhchoi May 5, 2026
f8e4a4f
More changes
ethanhchoi May 5, 2026
b4a0048
forgot interface_name
ethanhchoi May 5, 2026
52fe487
More Changes to zed_servo_node
ethanhchoi May 5, 2026
629b25e
Changes to make zed_servo_node work
ethanhchoi May 8, 2026
0bd7000
Minor tweaks
ethanhchoi May 8, 2026
6a3367e
Final comments made about this node
ethanhchoi May 16, 2026
cccb364
Fix ackermann controller velocity and turn radius (#96)
mdurrani808 Apr 14, 2026
1567a1f
Framework cyclonedds config
a-cires Apr 15, 2026
342e594
add mag_heading package (#97)
mdurrani808 Apr 24, 2026
6cc08d3
Converted C++ aruco node/package to python (#95)
MidnightRaider06 Apr 24, 2026
306f1d6
Updated odrive configs (#98)
IshanDutta11 Apr 26, 2026
33cf588
fix gps goal sending (#101)
mdurrani808 Apr 26, 2026
bee4191
Integrated proper structured object detection bt (#90)
AbuWabu3697 Apr 26, 2026
127c654
Added nav2 config for easy param configuration (#102)
Rishav-N Apr 27, 2026
5fd48e5
Ojas joint-by-joint xbox (#105)
OjasPunje Apr 28, 2026
5588420
New 3 dof setup (#108)
IshanDutta11 May 2, 2026
d9dbe52
Added parameters to aruco detector (#114)
MidnightRaider06 May 4, 2026
4bdd846
fixing yolo bt athena planner (#113)
AbuWabu3697 May 4, 2026
81055e7
Joint by joint comp direction adjust (#115)
IshanDutta11 May 5, 2026
1715634
removed bad heading publsiher (#117)
mdurrani808 May 9, 2026
391614d
added rover updates to latest (#118)
mdurrani808 May 10, 2026
03c098f
added led indicator node (#119)
mdurrani808 May 10, 2026
9965279
updated nav bringup to be a little easier (#120)
mdurrani808 May 10, 2026
1231a37
latest fixes from drive
umdloop-admin May 9, 2026
b08f205
HWI Upgrades (#110)
IshanDutta11 May 11, 2026
3e4c864
On rover 05 0 (#121)
umdloop-admin May 12, 2026
046d17e
add mission launch files (#116)
mdurrani808 May 12, 2026
a16bcc2
Centralize CAN Interface (#123)
IshanDutta11 May 13, 2026
7636d5f
Drive Changes
ethanhchoi May 5, 2026
9235f8a
forgot interface_name
ethanhchoi May 5, 2026
d19276c
More Changes to zed_servo_node
ethanhchoi May 5, 2026
dce7277
Changes to make zed_servo_node work
ethanhchoi May 8, 2026
bef5928
Merge branch 'main' into local-changes
IshanDutta11 May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions nav2_config
Submodule nav2_config added at 890800
28 changes: 28 additions & 0 deletions src/description/ros2_control/drive/drive.servo.ros2_control.xacro
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:macro name="servo_ros2_control" params="name">
<ros2_control name="${name}" type="system">
<hardware>
<plugin>servo_ros2_control/SERVOHardwareInterface</plugin>
<param name="update_rate">20</param> <!-- Hz -->
<param name="logger_rate">5</param> <!-- Hz -->
<param name="logger_state">1</param> <!-- 0 for off, 1 for on -->
<param name="can_interface">can0</param>
<param name="can_id">0x80</param>
</hardware>

<joint name="zed_servo_joint">
<param name="node_id">0x1</param>
<param name="gear_ratio">1</param>
<param name="max_pos">235</param> <!-- degrees -->
<param name ="meters_per_deg">0.00016666666</param> <!-- (TODO) convert motor position in degrees to displacement in meters -->
<param name="servo_type">standard</param> <!-- standard or continuous -->
<param name="joint_type">revolute</param> <!-- revolute or prismatic -->
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position"/>
<state_interface name="velocity"/>
</joint>
</ros2_control>
</xacro:macro>
</robot>
7 changes: 7 additions & 0 deletions src/description/urdf/athena_drive.urdf.xacro
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

<xacro:include filename="$(find description)/urdf/athena_drive/athena_drive_macro.xacro"/>
<xacro:include filename="$(find description)/urdf/athena_drive/athena_drive_macro.ros2_control.xacro"/>

<xacro:include filename="imu.xacro"/>
<xacro:include filename="gps.xacro"/>
<xacro:include filename="ground_truth_odom.xacro"/>
Expand Down Expand Up @@ -42,6 +43,9 @@

<!-- Import power_module ros2_control description -->
<xacro:include filename="$(find description)/ros2_control/drive/drive.power_module.ros2_control.xacro" />

<!-- Added servo_drive here -->
<xacro:include filename="$(find description)/ros2_control/drive/drive.servo.ros2_control.xacro"/>

<!-- Contains description of drive -->
<xacro:description/>
Expand Down Expand Up @@ -83,6 +87,9 @@

<!-- PowerModule (CAN-based) -->
<xacro:power_module_ros2_control name="drive_power_module" can_interface="$(arg can_interface)"/>

<!-- Servo control for Zed camera -->
<xacro:servo_ros2_control name="zed_servo_control"/>
</xacro:unless>


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,15 @@ controller_manager:

rear_ackermann_controller:
type: athena_drive_controllers/RearAckermannController


#Generic Position Controller that exists in ros2 humble workspace
zed_servo_controller:
type: position_controllers/JointGroupPositionController
#Generic Position Controller that exists in ros2 humble workspace
zed_servo_controller:
type: position_controllers/JointGroupPositionController
#zed_servo_controller:
#type:athena_drive_controllers/ZedServoController
ackermann_steering_controller:
# unsure why but ackermann controller only goes about half of scale_linear.x in teleop_twist
# ackermann controller turns to at max scale_angular.yaw*pi. Seems to ignore how much you input, relies more on how fast rover is going
Expand Down Expand Up @@ -196,3 +204,9 @@ rear_ackermann_controller:
wheel_radius: 0.125
max_speed: 0.59
max_steer_angle: 0.785398

#Added this controller
zed_servo_controller:
ros__parameters:
joints:
- zed_servo_joint
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,12 @@ def launch_setup(context, *args, **kwargs):
arguments=["motor_status_controller", "-c", "/controller_manager"],
)

zed_servo_spawner = Node(
package="controller_manager",
executable="spawner",
arguments=["zed_servo_contoller", "-c", "/controller_manager"],
)

robot_controller_names = [robot_controller]
robot_controller_spawners = []
for controller in robot_controller_names:
Expand Down Expand Up @@ -303,7 +309,6 @@ def launch_setup(context, *args, **kwargs):
)
)
]

controller_switcher_node = RegisterEventHandler(
event_handler=OnProcessExit(
target_action=inactive_robot_controller_spawners[-1],
Expand Down Expand Up @@ -378,6 +383,7 @@ def launch_setup(context, *args, **kwargs):

jetson_actions = [
control_node,
zed_servo_spawner,
robot_state_pub_node,
delay_joint_state_broadcaster_spawner_after_ros2_control_node,
delay_motor_status_controller_after_joint_state_broadcaster,
Expand All @@ -391,7 +397,6 @@ def launch_setup(context, *args, **kwargs):
joystick_publisher,
teleop_twist_joy,
]

if mode == "jetson":
return jetson_actions
elif mode == "base_station":
Expand Down
10 changes: 10 additions & 0 deletions src/subsystems/drive/drive_controllers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ set(THIS_PACKAGE_INCLUDE_DEPENDS
hardware_interface
nav_msgs
pluginlib
position_controllers
rclcpp
rclcpp_lifecycle
realtime_tools
std_srvs
tf2_msgs
std_msgs
)

find_package(ament_cmake REQUIRED)
Expand Down Expand Up @@ -55,6 +57,12 @@ generate_parameter_library(front_ackermann_controller_parameters
generate_parameter_library(rear_ackermann_controller_parameters
config/rear_ackermann_controller.yaml
)
##.yaml or .hpp? Added the hpp if needed
##included controller_parameters
# generate_parameter_library(zed_servo_controller_parameters
# config/zed_servo_controller.yaml
# include/athena_drive_controllers/validate_drive_controller_parameters.hpp
# ) taken out for testing since we dont need to generate a library for this

add_library(
drive_controllers
Expand All @@ -63,10 +71,12 @@ add_library(
src/double_ackermann_controller.cpp
src/front_ackermann_controller.cpp
src/rear_ackermann_controller.cpp
# src/zed_servo_controller.cpp
)
target_include_directories(drive_controllers PUBLIC
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:include/${PROJECT_NAME}>")
#zed_servo_controller_parameters
target_link_libraries(drive_controllers swerve_drive_controller_parameters double_ackermann_controller_parameters crab_steering_controller_parameters front_ackermann_controller_parameters rear_ackermann_controller_parameters umdloop_can_library::umdloop_can_library)
ament_target_dependencies(drive_controllers ${THIS_PACKAGE_INCLUDE_DEPENDS})
target_compile_definitions(drive_controllers PRIVATE "SWERVE_DRIVE_CONTROLLER_BUILDING_DLL")
Expand Down
2 changes: 2 additions & 0 deletions src/subsystems/drive/drive_controllers/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
<depend>realtime_tools</depend>
<depend>std_srvs</depend>
<depend>tf2_msgs</depend>
<depend>std_msgs</depend>
<depend>position_controllers</depend>

<export>
<build_type>ament_cmake</build_type>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ def generate_launch_description():
localizer_launch_file = os.path.join(localizer_share, 'launch', 'localizer.launch.py')
zed_tf_publisher_launch_file = os.path.join(localizer_share, 'launch', 'zed_tf_publisher.launch.py')

gps_goal_share = get_package_share_directory('gps_goal')
gps_goal_launch_file = os.path.join(gps_goal_share, 'launch', 'gps_goal_server.launch.py')
# gps_goal_share = get_package_share_directory('gps_goal')
# gps_goal_launch_file = os.path.join(gps_goal_share, 'launch', 'gps_goal_server.launch.py')

sensors_share = get_package_share_directory('athena_sensors')
sensors_launch_file = os.path.join(sensors_share, 'launch', 'sensors.launch.py')

aruco_bt_share = get_package_share_directory('aruco_bt')
aruco_launch_file = os.path.join(aruco_bt_share, 'launch', 'aruco.launch.py')
# aruco_bt_share = get_package_share_directory('aruco_bt')
# aruco_launch_file = os.path.join(aruco_bt_share, 'launch', 'aruco.launch.py')

waypoint_share = get_package_share_directory('waypoint_manager')
waypoint_launch_file = os.path.join(waypoint_share, 'launch', 'waypoint_manager.launch.py')
Expand Down Expand Up @@ -102,10 +102,10 @@ def generate_launch_description():
}.items(),
)

aruco_launch = IncludeLaunchDescription(
PythonLaunchDescriptionSource(aruco_launch_file),
launch_arguments={'use_sim_time': sim, 'marker_size': '0.20'}.items()
)
# aruco_launch = IncludeLaunchDescription(
# PythonLaunchDescriptionSource(aruco_launch_file),
# launch_arguments={'use_sim_time': sim, 'marker_size': '0.20'}.items()
# )

waypoint_launch = IncludeLaunchDescription(
PythonLaunchDescriptionSource(waypoint_launch_file),
Expand Down Expand Up @@ -197,7 +197,7 @@ def generate_launch_description():
yolo_ros_launch,
point_cloud_filterer_sim,
point_cloud_relay,
gps_goal_launch,
# gps_goal_launch,

IncludeLaunchDescription(
PythonLaunchDescriptionSource(nav2_nav),
Expand Down
29 changes: 25 additions & 4 deletions src/subsystems/science/science_bringup/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,39 @@ endif()

# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

find_package(rosidl_default_generators REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_runtime REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
"srv/SetController.srv"
"srv/TakePanorama.srv"
DEPENDENCIES builtin_interfaces
)

rosidl_generate_interfaces(${PROJECT_NAME}
"srv/SetController.srv"
"srv/TakePanorama.srv"
DEPENDENCIES builtin_interfaces
)


install(
DIRECTORY config launch
DESTINATION share/${PROJECT_NAME}
)
install(PROGRAMS
<<<<<<< HEAD
scripts/zed_servo_node.py
=======
scripts/zed_arduino_node.py
>>>>>>> e6025d0 (Drive Changes)
DESTINATION lib/${PROJECT_NAME}
)
install(PROGRAMS
scripts/zed_arduino_node.py
DESTINATION lib/${PROJECT_NAME}
)


if(BUILD_TESTING)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,32 @@ def generate_launch_description():
output="both",
parameters=[robot_description, robot_controllers],
)
#controller in drive
#node in science
#can launch drive
#package sciecne_bringup
zed_servo_node = RegisterEventHandler(
event_handler=OnProcessStart(
target_action=control_node,
on_start=[TimerAction(
period=8.0, # enough time for everything to settle
actions=[
Node(
package="science_bringup",
executable="zed_servo_node.py",
name="zed_servo_node",
output="screen"
),
Node(
package="science_bringup",
executable="zed_arduino_node.py",
name="zed_arduino_node",
output="screen"
)
]
)]
)
)
robot_state_pub_node = Node(
package="robot_state_publisher",
executable="robot_state_publisher",
Expand All @@ -206,7 +232,6 @@ def generate_launch_description():
executable="spawner",
arguments=["motor_status_controller", "-c", "/controller_manager"],
)

# CONTROLLER MANAGERS

'''robot_controller_spawner = Node(
Expand Down Expand Up @@ -359,6 +384,7 @@ def generate_launch_description():
delay_joint_state_broadcaster_spawner_after_ros2_control_node,
delay_motor_status_controller_after_joint_state_broadcaster,
# umdloop_can_node,
zed_servo_node,
controller_switcher_node,
joystick_publisher,
]
Expand Down
44 changes: 44 additions & 0 deletions src/subsystems/science/science_bringup/scripts/zed_arduino_node.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
#from std_msgs.msg import String,Int32, Float64MultiArray

from std_msgs.msg import Int32,Float32
import pyzed.sl as sl
import cv2 as cv
import math
import numpy as np
from pyfirmata import Arduino, util
import time

class Zed_Servo_Subscriber(Node):
#angle: 0.0 - 360.0 | frames = 100 - 2000
# ros2 run node 360, 2000 0 0
def __init__(self):
super().__init__(node_name='zed_servo_subscriber')
self.get_logger().info("Called Zed Servo Subscriber")
self.board = Arduino("COM4")#Whichever port it is, can edit
self.servo = self.board.get_pin('d:9:s') #Servo on pin 9 Also can edit
time.sleep(2) # Wait for board to initialize
self.board.samplingOn()
self.subscriber = self.create_subscription(
Float32,
'zed_servo_data',
self.servo_callback,
10
)
def servo_callback(self,msg):
angle = msg.data
try:
self.servo.write(angle)#[0]
except Exception as e:
self.get_logger().info(f"Failed to rotate servo:{e}")
def main(args=None):
rclpy.init(args=args) # Initializes the ros2 communication
node = Zed_Servo_Subscriber()
rclpy.spin(node=node) # Node spin = Keep this Node alive until we kill it
#Maybe spin it up once then kill the subscription to get the location
rclpy.shutdown() #Shutsdown a Node

if __name__ == "__main__":
main()
Loading
Loading