Skip to content

使用 star_servo_point_position_motion_control() 来进行伺服控制运动

伺服控制运动模式是每个通讯周期将点位直接下发给伺服进行运动

cpp
struct ServoPointMovePara
{
	bool end;                       ///< 是否清除之前发送的,未开始插补计算的点位
	int sum;                         ///< 总共要发的帧数
	int count;                           ///< 当前为第几帧
	std::vector<std::vector<double>> pos;   ///< 二维数组,一维表示本次传输的点位数,二维长度为12,各个关节角度或笛卡尔坐标  坐标:机器人(前7个)+ 外部轴(后5个)
};

注意:发送的数据只有当总帧数sum = count的时候机器人才会运行,所以当sum≠1的时候,count就需要从1开始发送,一直累加到sum的值后,机器人才会开始按照对应下发的点位进行运动(具体可以看示例二,示例二就是sum = 10的情况,count = 1开始传到接口servo_point_position_motion_control中,count = 2传给servo_point_position_motion_control, count = 3 ..........一直到count = 10传给接口servo_point_position_motion_control后,下发的全部点位才会开始执行

示例1:封装servo_point_position_motion_control()接口,将目标点位发送给伺服进行运动,每次只发送一个点给伺服

cpp
void test_servo_point_position_motion_control()
{
  
  ServoPointMovePara servoMove;
  servoMove.end = 0;
  servoMove.sum = 1;
  servoMove.count = 1;
  std::vector<double> pos = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  //前7位为机器人本体,后5位为外部轴
  for (int i = 0; i < 100000; i++)
  {
    servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]
    , pos[7], pos[8], pos[9], pos[10], pos[11]});
    std::cout << "servo_point_position_motion_control return  " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl;
    servoMove.pos.clear();
    pos[0] += 0.001;
    pos[8] += 0.001;
    printf("pos : %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f", pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]
    , pos[7], pos[8], pos[9], pos[10], pos[11]);
  }
}

示例2:封装servo_point_position_motion_control()接口,将目标点位发送给伺服进行运动,每次最大可发送600个点位

cpp
void test_servo_point_position_motion_control()
{
  
  ServoPointMovePara servoMove;
  servoMove.end = 0;
  servoMove.sum = 10;
  servoMove.count = 1;
  std::vector<double> tar_pos;
  std::vector<double> pos_sync;
  get_current_position(fd, 0, tar_pos);
  get_current_extra_position(fd, pos_sync);
  std::vector<double> pos = {tar_pos[0], tar_pos[1], tar_pos[2], tar_pos[3], tar_pos[4], tar_pos[5], tar_pos[6], 
  pos_sync[0], pos_sync[1], pos_sync[2], pos_sync[3], pos_sync[4]};  //前7位为机器人本体,后5位为外部轴
  for (int i = 0; i < 10; i++)
  {
    for (int j = 0; j < 600; j++)        //存最大600个点位
    {
      servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]
      , pos[7], pos[8], pos[9], pos[10], pos[11]});
      if (i < 100) {
        pos[0] += 0.008;
        pos[8] += 0.008;
      } else if ( i >= 200 && i < 300) {
        pos[0] -= 0.008;
        pos[8] -= 0.008;
      } else if ( i >= 300 && i < 400) {
        pos[0] += 0.008;
        pos[8] += 0.008;
      } else {
        pos[0] -= 0.008;
        pos[8] -= 0.008;
      }
    }
    std::cout << "servo_point_position_motion_control return  " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl;
    servoMove.pos.clear();
    if (servoMove.count == 10)
    {
      servoMove.count = 0;
    }
    servoMove.count ++;
  }
}

示例3:封装servo_point_position_motion_control()接口,当出现发送点位不运动,或者缓存区已经满的情况下,发送

cpp
void test_clean_motion()
{
  ServoPointMovePara servoMove;
  servoMove.end = 1;
  servoMove.sum = 1;
  servoMove.count = 1;
  std::vector<double> pos = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  //前7位为机器人本体,后5位为外部轴
    servoMove.pos.push_back({pos[0], pos[1], pos[2], pos[3], pos[4], pos[5], pos[6]
    , pos[7], pos[8], pos[9], pos[10], pos[11]});
    std::cout << "servo_point_position_motion_control return  " << servo_point_position_motion_control(fd_7000, servoMove) << std::endl;
}

示例:当出现发送点位不运动,或者缓存区已经满的情况下,发送下面的代码

cpp
#include <iostream>
#include <vector>
#include <chrono>
#include "cpp_interface/nrc_interface.h"


int main()
{
  int fd_7000;
  connect(fd_7000, "192.168.1.13");
  enable_servo_position_motion_control(fd_7000, 1);     //开启伺服控制模式
  test_servo_point_position_motion_control();
  //当需要清除点位的时候再调用下面的接口
  // test_clean_motion();
}