跳到主要内容
版本:最新版本

位置模式(高频控制)

模式原理与适用场景

位置模式没有内置的轨迹规划功能,当输入目标位置时,执行器会立即按照报文中的速度限制值旋快速转到目标位置。该模式支持高频控制,通常我们使用这个模式来跑轨迹,需要用户在上层做轨迹规划并高频传输轨迹数据。

参数配置

  • 影响到轨迹的参数有:电流环、速度环和位置环的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
}