Skip to content

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

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

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)