Skip to content

6.运动队列的曲线运动

1、封装设置伺服就绪函数

cpp
/*
 * 伺服就绪函数
 */
void servo_ready(int fd)
{
    int state = 0;
    get_servo_state(fd, state);
    switch (state)
    {
    case 0:
        set_servo_state(fd, 1); // 将伺服切换为就绪
        break;
    case 2:
        clear_error(fd);
        set_servo_state(fd, 1);
        break;
    }
    get_servo_state(fd, state);
    std::cout << "伺服状态: " << state << std::endl;
}

2、封装等待运动结束的函数

cpp
/*
 * 循环阻塞运动结束函数
 */
void wait_for_running_over(int fd)
{
    // 等待运动完成
    int running_state = 0;
    get_robot_running_state(fd, running_state);  // 查询机器人是否在运动 2-正在运动
    while (running_state == 2)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(500));  // 阻塞500ms
        get_robot_running_state(fd, running_state);   // 再次查询
    }
}

3.moves运动示例

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


//运动队列运行movs示例
void Test_multi_robot_motion_movs(SOCKETFD fd)
{
  queue_motion_set_status(fd, true); //开启运动队列模式
  sleep(1);
  // 设置期望位置
  std::vector<double> pos{431, 214, 149, 0, 0, 0};
  std::vector<double> pos1{378, 214, 149, 0, 0, 0};
  std::vector<double> pos2{340, 230, 149, 0, 0, 0};
  std::vector<double> pos3{280, 280, 149, 0, 0, 0};
  std::vector<double> pos4{262, 327, 149, 0, 0, 0};
  std::vector<double> pos5{299, 342, 149, 0, 0, 0};
  std::vector<double> pos6{378, 353, 149, 0, 0, 0};
  std::vector<double> pos7{429, 368, 149, 0, 0, 0};
  std::vector<double> pos8{471, 317, 149, 0, 0, 0};
  std::vector<double> pos9{448, 238, 149, 0, 0, 0};
  MoveCmd movecmd;
  movecmd.targetPosType = PosType::data;
  movecmd.targetPosValue = pos;
  movecmd.coord = 1;
  movecmd.velocity = 50;
  movecmd.acc = 50;
  movecmd.dec = 50;
  movecmd.pl = 5;
  std::cout << "queue_motion_push_back_moveJ return" << queue_motion_push_back_moveJ(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos1;
  movecmd.velocity = 200;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos2;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos3;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos4;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos5;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos6;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos7;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  movecmd.targetPosValue = pos8;
  std::cout << "queue_motion_push_back_moveS return" << queue_motion_push_back_moveS(fd, movecmd) << std::endl;
  std::cout << "queue_motion_send_to_controller return" << queue_motion_send_to_controller(fd, 9) << std::endl; //这里的9对应你插入了多少条指令
  std::cout << "star test moves" << std::endl;
  wait_for_running_over(fd);
  queue_motion_set_status(fd, 0); // 关闭队列
  set_current_mode(fd, 0); // 切换回示教模式
}


int main() {
  // 连接机器人
  std::string robot_ip = "192.168.1.13";
  std::string robot_port = "6001";
  int robot_num = 1;
  fd = connect_robot(robot_ip, robot_port);
  printf("fd = %d\n", fd);
  while (!(get_connection_status(fd) == SUCCESS)) {
    usleep(8000); // 等待连接成功
    std::cout << "waiting for connect......" << std::endl;
  }
  std::cout << "connect robot success!" << std::endl;
  clear_error(fd);
  int status;
  get_servo_state(fd, status);
  if(status != 1)
  {
    set_servo_state(fd, 1);
  }
  std::cout<< "star........" << std::endl;
  Test_multi_robot_motion_movs(fd);
  usleep(20000);
  while (true)
  {
    usleep(1000000);
    std::vector<double> pos;
    get_current_position(fd, 1, pos);
    print_vector_double(pos);
    int configuration;
    std::cout << "get_robot_configuration return is "<< 
    get_robot_configuration(fd, configuration) << std::endl;
    std::cout << "configuration is " << configuration << std::endl;
  }
  std::cout << "ending..........."  << std::endl;
  return 0;
}