Appearance
使用 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)