Skip to content

4.示教模式类型切换与轨迹回放功能

在使用上位机开启拖拽模式前,需要先在示教器上做好拖拽的辨识。

注意:切换到拖拽模式后需要调用set_servo_poweron接口让机器人上使能才能进行拖拽

1、切换示教模式类型函数

cpp
/*
 * 封装切换示教模式类型函数
 */
void Switching_teach_type(int fd)
{
  int type;
  get_teach_type(fd, type);
  switch (type)
  {
  case 0:   //当前示教模式类型为点动模式
    set_teach_type(fd, 1);   //切换当前示教模式类型为拖拽模式
    break;
  
  case 1:   //当前示教模式类型为拖拽模式
    set_teach_type(fd, 0);   //切换当前示教模式类型为点动模式
    break;
  }


}

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(100));  // 阻塞500ms
        get_robot_running_state(fd, running_state);   // 再次查询
    }
}

3,封装轨迹回放功能函数

cpp
/*
 * 封装轨迹回放功能函数
 */
void record_playback(int fd)
{
  int vel = 30;                                                     //轨迹回放的速度
  set_teach_type(fd, 0); 
  track_record_playback(fd, vel);                                   //回放记录的轨迹
  wait_for_running_over(fd);
}

4、封装拖拽轨迹记录函数

cpp
/*
 * 封装拖拽轨迹记录函数
 */
void track_record(int fd)
{
  set_teach_type(fd, 1);   //切换当前示教模式类型为拖拽模式
  double maxSamplingNum = 200;     //轨迹的采样间隔
  double samplingInterval = 0.05;  //最大的采样点数
  int vel = 30;                    //轨迹回放的速度
  track_record_delete(fd);         //记录新的轨迹前清除旧的轨迹
  track_record_start(fd, maxSamplingNum, samplingInterval);         //开启轨迹记录
  for(int i = 0; i < 50; i++)
  {
    sleep(0.2);     ////.....等待10s,等待拖拽结束
  }
  track_record_stop(fd);                                            //关闭轨迹记录
}

5、拖拽回放功能

cpp
#include <chrono>
#include <iostream>
#include <string>
#include <unistd.h>
#include <thread>


#include "cpp_interface/nrc_api.h"


using namespace std;


int main()
{
    SOCKETFD fd = connect_robot("192.168.1.15", "6001");  // 连接控制器
    if (fd <= 0)
    {
        std::cout << "连接失败" << std::endl;
        return 0;
    }
    std::cout << "连接成功: "<< fd << std::endl;
    clear_error(fd);     //清除错误
    track_record(fd);
    //record_playback(fd);   //需要回放刚才记录的轨迹就调用这个函数


}