Skip to content

camrbuss/aplotter_ros2

Repository files navigation

aplotter_ros2

Pen Plotter using ODrive motor control and ROS2

This repository is dependend on a ROS2 CAN ODrive package found at https://github.com/camrbuss/ros2_odrive_can

CAD

OnShape CAD Models

Inverse Kinematics

Implement in C++ with a(t) and b(t) coming in as discrete measurements, x'(t) and y'(t) being set by the user, and a'(t) and b'(t) being sent to the motor controllers.

  float j = -L3 * (std::pow(L1, 2) - std::pow(L2, 2) - std::pow(a, 2) + 2.0 * a * b - std::pow(b, 2));
  float k = A1 + std::acos((1.0 / 2.0) * (std::pow(L1, 2) - std::pow(L2, 2) + std::pow(a - b, 2)) / (L1 * (-a + b)));
  float l = 2.0 * L1 * sqrt(1 - 1.0 / 4.0 * std::pow(std::pow(L1, 2) - std::pow(L2, 2) + std::pow(a - b, 2), 2) / (std::pow(L1, 2) * std::pow(a - b, 2))) * std::pow(a - b, 2);
  float f = j * std::sin(k) / l;
  float g = j * std::cos(k) / l;

  this->a_vel_setpoint_ = x_vel_ - ((-1.0f + f) * y_vel_ / g);
  this->b_vel_setpoint_ = x_vel_ - ((f * y_vel_) / g);

Microsoft Xbox 360 Wired Controller for Linux Interface

The controls needed to achieve velocity control are sequential. The left bumper correspond to axis 1 and the right bumber to axis 0.

ID Button Combination Function
1 <Left/Right> Bumper + X E-Stop
2 <Left/Right> Bumper + Y Calibrate Axis
3 <Left/Right> Bumper + A Request Closed Loop Control
4 <Left/Right> Bumper + B Home Axis
5 <Left/Right> Bumper + Back Clear Axis Error
6 Menu Start Command Loop
7 <Left/Right> Bumper + D-Pad Left Set Velocity Control Mode
8 D-Pad Up Increment Max Velocity
9 D-Pad Down Decrement Max Velocity
10 Left Joystick X, Y Velocity Control
11 Left Joystick Button Toggle Pen

Typical Sequence

  1. ID2
  2. ID3
  3. ID4
  4. ID4
  5. ID7
  6. ID6
  7. ID10