Skip to content

使用 servo_move() 来进行跟踪运动

servo_move(SOCKETFD socketFd,ServoMovePara servoMove) 可以接收一组点,然后将接收到的点位根据 timeStamp 做平滑处理后下发到伺服运动。

⚠️ 安全警告

以下代码会导致机器人实际运动。执行前必须确认:

  • 人员安全: 机器人工作空间内无人员或障碍物
  • 急停可用: 急停按钮在可触及范围内
  • 伺服使能: 确认伺服已正确使能
  • 速度限制: 首次运行将速度设置为较低值(建议 ≤ 最大速度的 20%)
  • 运行模式: servo_move 需在运行模式下,配合含有外部点指令的作业文件使用

建议先在仿真环境或空载低速条件下测试,确认无误后再用于实际生产。

ServoMovePara 参数说明

参数类型说明
robotNumint控制第几个机器人
clearBufferbool是否清除之前发送的、未开始插补计算的点位
targetModeint0-独立点;1-连续轨迹
sendModeint0-一次传输完全部轨迹;1-一次传输部分点位
runModeint0-接收完再运动;1-边接收边运动
sumint总传输次数
countint当前第几次传输
coordint0-关节坐标系;1-直角坐标系
sizeint本次传输的点位数
posvector<vector<double>>二维数组,一维为点位数,二维为 7 个关节角度或笛卡尔坐标
axisvelvector<vector<double>>每个轴的速度
axisaccvector<vector<double>>每个轴的加速度
timeStampvector<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)