位置模式(高频控制)
模式原理与适用场景
位置模式没有内置的轨迹规划功能,当输入目标位置时,执行器会立即按照报文中的速度限制值旋快速转到目标位置。该模式支持高频控制,通常我们使用这个模式来跑轨迹,需要用户在上层做轨迹规划并高频传输轨迹数据。
参数配置
- 影响到轨迹的参数有:电流环、速度环和位置环的pid参数值,这些值都支持实时更改,即使用报文高频更改,pid参数修改请参考PID参数设置
- 影响到执行器执行结果的参数有:限制电流值,限制速度值,目标位置值,这些值允许高频发送
- 有关设置以上参数的报文,请参考CAN2.0B 通信协议
示例代码
from motor_control import *
# port_name: Windows: "COM*" Linux: "/dev/ttyUSB*"
# id: Executor ID
# Baudrate: The baud rate can only be 921600
port_name = "COM6"
id = [0x00]
Baudrate = 921600
motor = MotorControl(port_name, id, Baudrate)
# Feedback_cycle1(ms): Feedback period of the first status packet,
# Including voltage, pwm, current, speed
# Feedback_cycle2(ms):Feedback period of the second status packet,
# Including the position of the motor and the position of the actuator
# Feedback_cycle3(ms):Feedback period of the third status packet,
# Including MOS tube, motor temperature, chip temperature and warning information,
# error information, operation mode
# cur: current(mA)
Feedback_cycle1 = 10
Feedback_cycle2 = 10
Feedback_cycle3 = 10
# POSITION_MODE
reset(motor)
time.sleep(0.6)
mode_selection(motor, POSITION_MODE, Feedback_cycle1, Feedback_cycle2, Feedback_cycle3)
time.sleep(1)
# current_pid_set(motor, {0.006}, {0.001})
# velocity_pid_set(motor, {50}, {1.2})
# position_pid_set(motor, {0.008}, {0})
pi = 3.1415926536
d = 0.002
cycle = 20
num = 1
i = 0
while 1:
t = i * d
ang = pi * math.sin(2 * pi / cycle * t)
pos = ang / pi / 2 * 65536;
motor.write_position({10000}, {3000}, {pos});
i= i + 1
time.sleep(d)
if t >= cycle * num:
break
write_position(motor, limit_cur, limit_vel, {0})
time.sleep(3)
c++:
#include <motor_control.h>
#include <multi_motor_control.h>
#include <iostream>
#include <thread>
#include <chrono>
#ifdef _WIN32
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#endif
#define delay(s) std::this_thread::sleep_for(std::chrono::milliseconds((int32_t)(s*1000)))
int main()
{
#ifdef _WIN32
timeBeginPeriod(1);
#endif
#define status_packet1 0xb1
#define status_packet2 0xb2
#define status_packet3 0xb3
// port_name: Windows: "COM*" Linux: "/dev/ttyUSB*"
// id: Executor ID
// Baudrate: The baud rate can only be 921600
string port_name = "COM6";
uint32_t Baudrate = 921600;
uint8_t id = 0x00;
MotorControl motor(port_name, Baudrate, id);
// Feedback_cycle1(ms): Feedback period of the first status packet,
// Including voltage, pwm, current, speed
// Feedback_cycle2(ms):Feedback period of the second status packet,
// Including the position of the motor and the position of the actuator
// Feedback_cycle3(ms):Feedback period of the third status packet,
// Including MOS tube, motor, chip temperature and warning information,
// error information, current operation mode
// cur: current(mA)
uint8_t Feedback_cycle1 = 10;
uint8_t Feedback_cycle2 = 10;
uint8_t Feedback_cycle3 = 10;
// POSITION_MODE
cout << endl << "position mode" << endl;
motor.reset();
motor.mode_selection(Mode::POSITION_MODE, Feedback_cycle1, Feedback_cycle2, Feedback_cycle3);
// motor.write_current_pid(0.006, 0.001); // Params: KP, KI
// motor.write_velocity_pid(50, 1.2); // Params: KP, KI
// motor.write_position_pid(0.008, 0); // Params: KP, KD
#define pi 3.1415926536
double d = 0.002; // unit time
double cycle = 10; // Track cycle
size_t num = 1;
while (1)
{
static size_t i = 0;
double t = i * d;
double ang = pi * sinl(2 * pi / cycle * t);
int pos = ang / pi / 2 * 65536;
motor.write_position(10000, 3000, pos);
i++;
delay(d);
if (t >= cycle * num)
{
break;
}
}
motor.write_position(10000, 1515, 0);
delay(3);
#ifdef _WIN32
timeEndPeriod(1);
#endif
}