使用 servo_move() 来进行跟踪运动
servo_move(SOCKETFD socketFd,ServoMovePara servoMove) 可以接收一组点,然后将接收到的点位根据 timeStamp 做平滑处理后下发到伺服运动。
⚠️ 安全警告
以下代码会导致机器人实际运动。执行前必须确认:
- 人员安全: 机器人工作空间内无人员或障碍物
- 急停可用: 急停按钮在可触及范围内
- 伺服使能: 确认伺服已正确使能
- 速度限制: 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%)
- 运行模式: servo_move 需在运行模式下,配合含有外部点指令的作业文件使用
建议先在仿真环境或空载低速条件下测试,确认无误后再用于实际生产。
ServoMovePara 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| robotNum | int | 控制第几个机器人 |
| clearBuffer | bool | 是否清除之前发送的、未开始插补计算的点位 |
| targetMode | int | 0-独立点;1-连续轨迹 |
| sendMode | int | 0-一次传输完全部轨迹;1-一次传输部分点位 |
| runMode | int | 0-接收完再运动;1-边接收边运动 |
| sum | int | 总传输次数 |
| count | int | 当前第几次传输 |
| coord | int | 0-关节坐标系;1-直角坐标系 |
| size | int | 本次传输的点位数 |
| pos | vector<vector<double>> | 二维数组,一维为点位数,二维为 7 个关节角度或笛卡尔坐标 |
| axisvel | vector<vector<double>> | 每个轴的速度 |
| axisacc | vector<vector<double>> | 每个轴的加速度 |
| timeStamp | vector<double> | 到达该点位的时间(单位 ms) |
使用前提
运行模式下,需要在控制器上运行包含外部点指令的作业文件(外部点指令负责接收 servo_move 传输的数据)。
ServoMovePara 结构体说明:
cpp
struct ServoMovePara {
///< 传输参数
int robotNum; ///< 控制第几个机器人
bool clearBuffer; ///< 是否清除之前发送的,未开始插补计算的点位
int targetMode; ///< 0-独立点 1-连续轨迹
int sendMode; ///< 0-一次传输完全部轨迹 1-一次传输部分点位
int runMode; ///< 0-接收完再运动 1-边接受边运动
int sum; ///< 总传输次数
int count; ///< 当前是第几次传输
///< 运动参数
int coord; ///< 0-关节 1-直角
int size; ///< 本次传输的点位数
std::vector<std::vector<double>> pos; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个关节角度或笛卡尔坐标
std::vector<std::vector<double>> axisvel; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的速度
std::vector<std::vector<double>> axisacc; ///< 二维数组,一维表示本次传输的点位数,二维长度为7,各个轴的加速度
std::vector<double> timeStamp; ///< 长度为本次传输的点位数,表示到达该点位的时间,单位ms
};示例:使用连续点位轨迹,一次性传输完全部轨迹点位
PS:在使用 servo_move 接口时,需要在运行模式下运行包含有外部点指令的作业文件(外部点指令是接收 servo_move 传输数据的)
py
def test_7000(socketFd):
print('开启测试7000.....')
socket_7000 = aa.connect_robot("192.168.1.13", "7000")
servomovepara = aa.ServoMovePara()
pos = aa.VectorVectorDouble()
time = aa.VectorDouble()
time_pos = [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550] #到达目标点位的时间戳
for value in time_pos:
time.append(value)
axis_pos = [[0,0,0,0,0,0,0],
[0,0,0,0,0,1,0],
[0,0,0,0,0,2,0],
[0,0,0,0,0,3,0],
[0,0,0,0,0,4,0],
[0,0,0,0,0,5,0],
[0,0,0,0,0,6,0],
[0,0,0,0,0,7,0],
[0,0,0,0,0,8,0],
[0,0,0,0,0,9,0],
[0,0,0,0,0,10,0]] #目标点位
for value in axis_pos:
pos.append(value)
for k in range(11):
servomovepara.pos = pos
for j in range(11):
servomovepara.timeStamp = time
servomovepara.runMode = 0 #默认固定传输0
servomovepara.clearBuffer = True #使用连续运动时,clearBuffer,targetMode,sendMode,runMode需要按照这个固定格式赋值
servomovepara.targetMode = 1 #连续轨迹
servomovepara.coord = 0 # 0-关节坐标 1-直角坐标
servomovepara.size = 11 #传输的目标点位长度
result = aa.servo_move(socket_7000, servomovepara)
print("return " , result)