From 2d9336772663b63f52a6097d1f444bce2f06d933 Mon Sep 17 00:00:00 2001 From: Jayden Date: Tue, 27 Jan 2026 11:01:46 -0500 Subject: [PATCH 1/3] end effector with placeholder values --- .../joystick_control/include/arm.hpp | 2 ++ src/Teleop-Control/joystick_control/src/arm.cpp | 12 ++++++++++-- .../rover_urdf/urdf/arm_urdf.ros2_control.xacro | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Teleop-Control/joystick_control/include/arm.hpp b/src/Teleop-Control/joystick_control/include/arm.hpp index ae5a9cf6..7e633b4f 100644 --- a/src/Teleop-Control/joystick_control/include/arm.hpp +++ b/src/Teleop-Control/joystick_control/include/arm.hpp @@ -35,6 +35,8 @@ class arm : public rclcpp::Node { int kAct1Axis; int kAct2Axis; int kElbowYaw; + int kClawOpen; + int kClawClose; }; #endif \ No newline at end of file diff --git a/src/Teleop-Control/joystick_control/src/arm.cpp b/src/Teleop-Control/joystick_control/src/arm.cpp index 3a0c6137..0557fc66 100644 --- a/src/Teleop-Control/joystick_control/src/arm.cpp +++ b/src/Teleop-Control/joystick_control/src/arm.cpp @@ -11,7 +11,8 @@ arm::arm() : Node("arm_node") { "/servo_node/delta_joint_cmds", 10); joint_msg_ = control_msgs::msg::JointJog(); joint_msg_.joint_names = {"Joint_1", "Joint_2", "Joint_3", - "Joint_4", "Joint_5", "Joint_6"}; + "Joint_4", "Joint_5", "Joint_6", + "Joint_7"}; RCLCPP_INFO(this->get_logger(), "Arm controller started"); } @@ -24,6 +25,7 @@ void arm::arm_control(std::shared_ptr joystickMsg) { joint_msg_.header = joystickMsg->header; + joint_msg_.velocities = {axes[kBaseAxis] * kMaxBaseSpeed, axes[kAct1Axis] * kMaxAct1Speed, axes[kAct2Axis] * kMaxAct2Speed, @@ -31,7 +33,8 @@ void arm::arm_control(std::shared_ptr joystickMsg) { axes[kElbowYaw] * kMaxElbowYawSpeed, buttons[kWristYaw_positive] - buttons[kWristYaw_negative] * kMaxWristSpeed * - axes[kThrottleAxis]}; + axes[kThrottleAxis], + buttons[kClawOpen] - buttons[kClawClose]}; joint_pub_->publish(joint_msg_); } @@ -51,6 +54,9 @@ void arm::declareParameters() { this->declare_parameter("max_act1_speed", 1.0); this->declare_parameter("max_act2_speed", 1.0); this->declare_parameter("max_elbow_yaw_speed", 1.0); + this->declare_parameter("claw_open", 1); + this->declare_parameter("claw_close", 0); + } void arm::loadParameters() { this->get_parameter("throttle.axis", kThrottleAxis); @@ -67,6 +73,8 @@ void arm::loadParameters() { this->get_parameter("max_act1_speed", kMaxAct1Speed); this->get_parameter("max_act2_speed", kMaxAct2Speed); this->get_parameter("max_elbow_yaw_speed", kMaxElbowYawSpeed); + this->get_parameter("claw_open", kClawOpen); + this->get_parameter("claw_close", kClawClose); } int main(int argc, char **argv) { diff --git a/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro b/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro index 01d60b56..d6fad539 100644 --- a/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro +++ b/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro @@ -109,6 +109,23 @@ + + TalonSRX + 25 + 0.012 + 0.0 + 0.0 + 0.005 + quadrature + 2163000 + 0.0 + true + true + true + + + + From a0a16e1dee0d74e4a8d03f671f4127cb2f510b6b Mon Sep 17 00:00:00 2001 From: Jayden Date: Wed, 11 Feb 2026 20:00:25 -0500 Subject: [PATCH 2/3] end effector launch and phoenix --- .../arm_control/launch/end_effector.launch.py | 32 +++++++++++++++ .../joystick_control/include/arm.hpp | 3 ++ .../joystick_control/src/arm.cpp | 40 ++++++++++++------- .../urdf/arm_urdf.ros2_control.xacro | 17 -------- 4 files changed, 60 insertions(+), 32 deletions(-) create mode 100644 src/Arm/arm_control/launch/end_effector.launch.py diff --git a/src/Arm/arm_control/launch/end_effector.launch.py b/src/Arm/arm_control/launch/end_effector.launch.py new file mode 100644 index 00000000..4c4aa14f --- /dev/null +++ b/src/Arm/arm_control/launch/end_effector.launch.py @@ -0,0 +1,32 @@ +import launch +from launch_ros.actions import ComposableNodeContainer +from launch_ros.descriptions import ComposableNode + + +def generate_launch_description(): + """Generate launch description with multiple components.""" + container = ComposableNodeContainer( + name="PhoenixContainerScience", + namespace="", + package="ros_phoenix", + executable="phoenix_container", + parameters=[{"interface": "can0"}], + composable_node_descriptions=[ + ComposableNode( + package="ros_phoenix", + plugin="ros_phoenix::TalonSRX", + name="platform", + parameters=[ + {"id": 7}, # change to correct talon ID + {"max_voltage": 24.0}, + {"brake_mode": True}, + ], + ), + ], + ) + + return launch.LaunchDescription( + [ + container, + ] + ) diff --git a/src/Teleop-Control/joystick_control/include/arm.hpp b/src/Teleop-Control/joystick_control/include/arm.hpp index 7e633b4f..770d0f92 100644 --- a/src/Teleop-Control/joystick_control/include/arm.hpp +++ b/src/Teleop-Control/joystick_control/include/arm.hpp @@ -5,6 +5,8 @@ #include "geometry_msgs/msg/twist.hpp" #include "interfaces/srv/move_servo.hpp" #include "rclcpp/rclcpp.hpp" +#include "ros_phoenix/msg/motor_control.hpp" +#include "ros_phoenix/msg/motor_status.hpp" #include "sensor_msgs/msg/joy.hpp" #include "std_msgs/msg/float32.hpp" @@ -16,6 +18,7 @@ class arm : public rclcpp::Node { private: rclcpp::Subscription::SharedPtr joy_sub_; rclcpp::Publisher::SharedPtr joint_pub_; + rclcpp::Publisher::SharedPtr eef_pub_; control_msgs::msg::JointJog joint_msg_; void declareParameters(); diff --git a/src/Teleop-Control/joystick_control/src/arm.cpp b/src/Teleop-Control/joystick_control/src/arm.cpp index 0557fc66..c1ad24e6 100644 --- a/src/Teleop-Control/joystick_control/src/arm.cpp +++ b/src/Teleop-Control/joystick_control/src/arm.cpp @@ -9,10 +9,11 @@ arm::arm() : Node("arm_node") { "/joy", 10, std::bind(&arm::arm_control, this, std::placeholders::_1)); joint_pub_ = this->create_publisher( "/servo_node/delta_joint_cmds", 10); + eef_pub_ = this->create_publisher( + "/platform/set", 10); joint_msg_ = control_msgs::msg::JointJog(); joint_msg_.joint_names = {"Joint_1", "Joint_2", "Joint_3", - "Joint_4", "Joint_5", "Joint_6", - "Joint_7"}; + "Joint_4", "Joint_5", "Joint_6"}; RCLCPP_INFO(this->get_logger(), "Arm controller started"); } @@ -22,20 +23,30 @@ void arm::arm_control(std::shared_ptr joystickMsg) { auto axes = joystickMsg->axes; auto buttons = joystickMsg->buttons; - + ros_phoenix::msg::MotorControl eef_control_msg; + eef_control_msg.mode = ros_phoenix::msg::MotorControl::PERCENT_OUTPUT; + // set the value - close is negative + double value; + if (buttons[kClawOpen] && buttons[kClawClose]) { + value = -0.6; + } else { + value = 0.5 * buttons[kClawOpen] - 0.6 * buttons[kClawClose]; + } + eef_control_msg.value = value; joint_msg_.header = joystickMsg->header; - - joint_msg_.velocities = {axes[kBaseAxis] * kMaxBaseSpeed, - axes[kAct1Axis] * kMaxAct1Speed, - axes[kAct2Axis] * kMaxAct2Speed, - axes[kWristRoll] * kMaxWristRollSpeed, - axes[kElbowYaw] * kMaxElbowYawSpeed, - buttons[kWristYaw_positive] - - buttons[kWristYaw_negative] * kMaxWristSpeed * - axes[kThrottleAxis], - buttons[kClawOpen] - buttons[kClawClose]}; - + joint_msg_.velocities = { + axes[kBaseAxis] * kMaxBaseSpeed, + axes[kAct1Axis] * kMaxAct1Speed, + axes[kAct2Axis] * kMaxAct2Speed, + axes[kWristRoll] * kMaxWristRollSpeed, + axes[kElbowYaw] * kMaxElbowYawSpeed, + buttons[kWristYaw_positive] - + buttons[kWristYaw_negative] * kMaxWristSpeed * axes[kThrottleAxis], + }; // need to adjust claw speed + RCLCPP_INFO(this->get_logger(), "mode: %d, value: %f", eef_control_msg.mode, + eef_control_msg.value); + eef_pub_->publish(eef_control_msg); joint_pub_->publish(joint_msg_); } @@ -56,7 +67,6 @@ void arm::declareParameters() { this->declare_parameter("max_elbow_yaw_speed", 1.0); this->declare_parameter("claw_open", 1); this->declare_parameter("claw_close", 0); - } void arm::loadParameters() { this->get_parameter("throttle.axis", kThrottleAxis); diff --git a/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro b/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro index d6fad539..01d60b56 100644 --- a/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro +++ b/src/URDF/rover_urdf/urdf/arm_urdf.ros2_control.xacro @@ -109,23 +109,6 @@ - - TalonSRX - 25 - 0.012 - 0.0 - 0.0 - 0.005 - quadrature - 2163000 - 0.0 - true - true - true - - - - From 3df2ce7546c9121152f194daaae41f1b3103349a Mon Sep 17 00:00:00 2001 From: Jayden Date: Thu, 12 Feb 2026 13:45:17 -0500 Subject: [PATCH 3/3] Fix eef naming and cleanup logic Remove unnecessary comment --- src/Arm/arm_control/launch/end_effector.launch.py | 6 +++--- src/Teleop-Control/joystick_control/src/arm.cpp | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Arm/arm_control/launch/end_effector.launch.py b/src/Arm/arm_control/launch/end_effector.launch.py index 4c4aa14f..ce2e01ad 100644 --- a/src/Arm/arm_control/launch/end_effector.launch.py +++ b/src/Arm/arm_control/launch/end_effector.launch.py @@ -6,7 +6,7 @@ def generate_launch_description(): """Generate launch description with multiple components.""" container = ComposableNodeContainer( - name="PhoenixContainerScience", + name="PhoenixContainerEEF", namespace="", package="ros_phoenix", executable="phoenix_container", @@ -15,9 +15,9 @@ def generate_launch_description(): ComposableNode( package="ros_phoenix", plugin="ros_phoenix::TalonSRX", - name="platform", + name="end_effector", parameters=[ - {"id": 7}, # change to correct talon ID + {"id": 13}, {"max_voltage": 24.0}, {"brake_mode": True}, ], diff --git a/src/Teleop-Control/joystick_control/src/arm.cpp b/src/Teleop-Control/joystick_control/src/arm.cpp index c1ad24e6..ffad0972 100644 --- a/src/Teleop-Control/joystick_control/src/arm.cpp +++ b/src/Teleop-Control/joystick_control/src/arm.cpp @@ -10,7 +10,7 @@ arm::arm() : Node("arm_node") { joint_pub_ = this->create_publisher( "/servo_node/delta_joint_cmds", 10); eef_pub_ = this->create_publisher( - "/platform/set", 10); + "/end_effector/set", 10); joint_msg_ = control_msgs::msg::JointJog(); joint_msg_.joint_names = {"Joint_1", "Joint_2", "Joint_3", "Joint_4", "Joint_5", "Joint_6"}; @@ -26,11 +26,11 @@ void arm::arm_control(std::shared_ptr joystickMsg) { ros_phoenix::msg::MotorControl eef_control_msg; eef_control_msg.mode = ros_phoenix::msg::MotorControl::PERCENT_OUTPUT; // set the value - close is negative - double value; - if (buttons[kClawOpen] && buttons[kClawClose]) { + double value = 0.0; + if (buttons[kClawClose]) { value = -0.6; - } else { - value = 0.5 * buttons[kClawOpen] - 0.6 * buttons[kClawClose]; + } else if (buttons[kClawOpen]) { + value = 0.5; } eef_control_msg.value = value; joint_msg_.header = joystickMsg->header;