- added raw logging
- better calibration output - added calibration plotter
This commit is contained in:
parent
7d41d30757
commit
3be961eecf
6 changed files with 53 additions and 4 deletions
|
|
@ -23,8 +23,8 @@
|
||||||
|
|
||||||
[env:pico]
|
[env:pico]
|
||||||
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
|
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
|
||||||
board = rpipico2 # RP2530
|
board = rpipico2 # use this for RP2530
|
||||||
# board = rpipico # RP2040
|
# board = rpipico # use this for RP2040
|
||||||
board_build.filesystem_size = 0.5m
|
board_build.filesystem_size = 0.5m
|
||||||
|
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ bool measure_calibration_data(
|
||||||
// TODO: read motor_pos from precise reference encoder
|
// TODO: read motor_pos from precise reference encoder
|
||||||
|
|
||||||
if(print_measurements)
|
if(print_measurements)
|
||||||
LOG_INFO("%f, %15.10f, %15.10f", encoder_angle_raw, field_angle, motor_pos);
|
LOG_RAW("%15.10f, %15.10f, %f", motor_pos, field_angle, encoder_angle_raw);
|
||||||
|
|
||||||
encoder_angle_and_motor_pos.push_back({encoder_angle_raw, motor_pos});
|
encoder_angle_and_motor_pos.push_back({encoder_angle_raw, motor_pos});
|
||||||
motor_pos_and_field_angle.push_back({motor_pos, field_angle});
|
motor_pos_and_field_angle.push_back({motor_pos, field_angle});
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,13 @@ void Logger::error(const char* fmt, ...) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Logger::raw(const char* fmt, ...) {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
log(ELogLevel::NONE, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
void Logger::log(ELogLevel level, const char* fmt, va_list args) {
|
void Logger::log(ELogLevel level, const char* fmt, va_list args) {
|
||||||
char buf[128]; // Adjust size as needed
|
char buf[128]; // Adjust size as needed
|
||||||
vsnprintf(buf, sizeof(buf), fmt, args);
|
vsnprintf(buf, sizeof(buf), fmt, args);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
#define LOG_INFO(...) Logger::instance().info(__VA_ARGS__)
|
#define LOG_INFO(...) Logger::instance().info(__VA_ARGS__)
|
||||||
#define LOG_WARNING(...) Logger::instance().warn(__VA_ARGS__)
|
#define LOG_WARNING(...) Logger::instance().warn(__VA_ARGS__)
|
||||||
#define LOG_ERROR(...) Logger::instance().error(__VA_ARGS__)
|
#define LOG_ERROR(...) Logger::instance().error(__VA_ARGS__)
|
||||||
|
#define LOG_RAW(...) Logger::instance().raw(__VA_ARGS__)
|
||||||
|
|
||||||
//*** ENUM ******************************************************************************
|
//*** ENUM ******************************************************************************
|
||||||
|
|
||||||
|
|
@ -39,6 +40,7 @@ class Logger {
|
||||||
void info(const char* fmt, ...);
|
void info(const char* fmt, ...);
|
||||||
void warn(const char* fmt, ...);
|
void warn(const char* fmt, ...);
|
||||||
void error(const char* fmt, ...);
|
void error(const char* fmt, ...);
|
||||||
|
void raw(const char* fmt, ...);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Logger() = default;
|
Logger() = default;
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
static const char* FIRMWARE_VERSION = "v1.0.1";
|
static const char* FIRMWARE_VERSION = "v1.0.2";
|
||||||
|
|
|
||||||
40
software/PythonAPI/calibration_plotter.py
Normal file
40
software/PythonAPI/calibration_plotter.py
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
from open_micro_stage_api import OpenMicroStageInterface
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
plt.rcParams['figure.dpi'] = 200
|
||||||
|
|
||||||
|
def plot_calibration_data(ax_encoder_counts, ax_field_angel, label, data):
|
||||||
|
# Plot on the provided Axes object
|
||||||
|
if ax_encoder_counts is not None:
|
||||||
|
ax_encoder_counts.plot(data[0], data[2], label=label)
|
||||||
|
ax_encoder_counts.set_xlabel('Motor Angle [rad]')
|
||||||
|
ax_encoder_counts.set_ylabel('Encoder Counts Raw')
|
||||||
|
ax_encoder_counts.set_title('Encoder Count Plot')
|
||||||
|
ax_encoder_counts.legend()
|
||||||
|
ax_encoder_counts.grid(True)
|
||||||
|
|
||||||
|
# Plot on the provided Axes object
|
||||||
|
if ax_field_angel is not None:
|
||||||
|
ax_field_angel.plot(data[0], data[1], label=label)
|
||||||
|
ax_field_angel.set_xlabel('Motor Angle [rad]')
|
||||||
|
ax_field_angel.set_ylabel('Motor Field Angle [rad]')
|
||||||
|
ax_field_angel.set_title('Field Angle Plot')
|
||||||
|
ax_field_angel.legend()
|
||||||
|
ax_field_angel.grid(True)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# create interface and connect
|
||||||
|
oms = OpenMicroStageInterface(show_communication=True, show_log_messages=True)
|
||||||
|
oms.connect('/dev/ttyACM0')
|
||||||
|
|
||||||
|
# Create subplots
|
||||||
|
fig, ax = plt.subplots(1, 1, figsize=(10, 7), sharex='all')
|
||||||
|
|
||||||
|
for i in range(3):
|
||||||
|
res, data = oms.calibrate_joint(i, save_result=False)
|
||||||
|
plot_calibration_data(ax, None, f'Actuator {i}', data)
|
||||||
|
|
||||||
|
# Adjust layout and show
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue