Skip to content

机械臂轨迹指令movePlan

机械臂运动控制指令和透传控制指令。运动控制指令包含:关节空间运动、笛卡尔直线运动、样条曲线运动、圆弧运动等;透传控制指令包含角度透传和位姿透传。

关节空间运动rm_movej()

  • 方法原型:
C
int rm_movej(rm_robot_handle * handle,const float * joint,int v,int r,int trajectory_connect,int block)

可以跳转rm_robot_handle查阅结构体详细描述。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
joint输入参数目标关节1~7角度数组。
v输入参数速度比例1~100,即规划速度和加速度占关节最大线转速和加速度的百分比。
r输入参数交融半径百分比系数,0-100。
trajectory_connect输入参数轨迹连接标志:
0:立即规划并执行轨迹,不与后续轨迹连接;
1:将当前轨迹与下一条轨迹一起规划,但不立即执行,阻塞模式下,即使发送成功也会立即返回。
block输入参数阻塞设置:
多线程模式:0,非阻塞模式,发送指令后立即返回;1,阻塞模式,等待机械臂到达目标位置或规划失败后返回。
单线程模式:0,非阻塞模式;其他值,阻塞模式并设置超时时间,根据运动时间设置,单位为秒。

注意:使用单线程阻塞模式时,请设置超时时间确保轨迹在超时时间内运行结束返回。
注意:trajectory_connect参数为1交融半径才生效,如果为0则交融半径不生效。

  • 返回值:
参数类型说明
0int成功。
1int控制器返回false,传递参数错误或机械臂状态发生错误。
-1int数据发送失败,通信过程中出现问题。
-2int数据接收失败,通信过程中出现问题或者控制器超时没有返回。
-3int返回值解析失败,接收到的数据格式不正确或不完整。
-4int当前到位设备校验失败,即当前到位设备不为关节。
-5int单线程模式超时未接收到返回,请确保超时时间设置合理。
  • 使用示例
C
float joint[6] = {0.0, 0.0, 0.0, 0.0, 90.0, 0.0};

int v = 20; // 速度
int r = 0;  // 交融半径
int trajectory_connect = 0; // 立即规划并执行轨迹
int block = 1; // 阻塞模式(默认线程模式为多线程)

ret = rm_movej(robot_handle, joint, v, r, trajectory_connect, block);

笛卡尔空间直线运动rm_movel()

  • 方法原型:
C
int rm_movel(rm_robot_handle * handle,rm_pose_t pose,int v,int r,int trajectory_connect,int block)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose输入参数目标位姿,位置单位:米;姿态单位:弧度。
v输入参数速度比例1~100,即规划速度和加速度占关节最大线转速和加速度的百分比。
r输入参数交融半径百分比系数,0-100。
trajectory_connect输入参数轨迹连接标志:
0:立即规划并执行轨迹,不与后续轨迹连接;
1:将当前轨迹与下一条轨迹一起规划,但不立即执行,阻塞模式下,即使发送成功也会立即返回。
block输入参数阻塞设置:
多线程模式:0,非阻塞模式,发送指令后立即返回;1,阻塞模式,等待机械臂到达目标位置或规划失败后返回。
单线程模式:0,非阻塞模式;其他值,阻塞模式并设置超时时间,根据运动时间设置,单位为秒。

注意:使用单线程阻塞模式时,请设置超时时间确保轨迹在超时时间内运行结束返回。
注意:trajectory_connect参数为1交融半径才生效,如果为0则交融半径不生效。

  • 返回值:
参数类型说明
0int成功。
1int控制器返回false,传递参数错误或机械臂状态发生错误。
-1int数据发送失败,通信过程中出现问题。
-2int数据接收失败,通信过程中出现问题或者控制器超时没有返回。
-3int返回值解析失败,接收到的数据格式不正确或不完整。
-4int当前到位设备校验失败,即当前到位设备不为关节。
-5int单线程模式超时未接收到返回,请确保超时时间设置合理。
  • 使用示例
C
int v = 20; // 速度
int r = 0;  // 交融半径
int trajectory_connect = 0; // 立即规划并执行轨迹
int block = 1; // 阻塞模式(默认线程模式为多线程)
rm_pose_t pose = {
        .position = {0.5, 0.5, 0.5},
        .euler = {0.0, 0.0, 0.0}
};// 示例位姿
ret = rm_movel(robot_handle, pose, v, r, trajectory_connect, block);
printf("rm_movel result : %d\n", ret);

样条曲线运动rm_moves()

  • 方法原型:
C
int rm_moves(rm_robot_handle * handle,rm_pose_t pose,int v,int r,int trajectory_connect,int block)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose输入参数目标位姿,位置单位:米;姿态单位:弧度。
v输入参数速度比例1~100,即规划速度和加速度占关节最大线转速和加速度的百分比。
r输入参数交融半径百分比系数,0-100。
trajectory_connect输入参数轨迹连接标志:
0:立即规划并执行轨迹,不与后续轨迹连接;
1:将当前轨迹与下一条轨迹一起规划,但不立即执行,阻塞模式下,即使发送成功也会立即返回。
block输入参数阻塞设置:
多线程模式:0,非阻塞模式,发送指令后立即返回;1,阻塞模式,等待机械臂到达目标位置或规划失败后返回。
单线程模式:0,非阻塞模式;其他值,阻塞模式并设置超时时间,根据运动时间设置,单位为秒。

注解:样条曲线运动需至少连续下发三个点位(trajectory_connect设置为1),否则运动轨迹为直线。
注意:使用单线程阻塞模式时,请设置超时时间确保轨迹在超时时间内运行结束返回。

  • 返回值:
参数类型说明
0int成功。
1int控制器返回false,传递参数错误或机械臂状态发生错误。
-1int数据发送失败,通信过程中出现问题。
-2int数据接收失败,通信过程中出现问题或者控制器超时没有返回。
-3int返回值解析失败,接收到的数据格式不正确或不完整。
-4int当前到位设备校验失败,即当前到位设备不为关节。
-5int单线程模式超时未接收到返回,请确保超时时间设置合理。
  • 使用示例
C
int v = 20; // 速度
int r = 0;  // 交融半径
int trajectory_connect = 1; // 与下一条轨迹一起规划
int block = 1; // 阻塞模式(默认线程模式为多线程)
rm_pose_t pose1 = {
        .position = {0.1, 0.2, 0.5},
        .euler = {0.0, 0.0, 0.0}
};// 示例位姿1
rm_pose_t pose2 = {
        .position = {0.3, 0.5, 0.5},
        .euler = {0.0, 0.0, 0.0}
};// 示例位姿2
rm_pose_t pose3 = {
        .position = {0.4, 0.5, 0.5},
        .euler = {0.0, 0.0, 0.0}
};// 示例位姿3

// 发出第一个点位,轨迹连接标志设为1以进行样条曲线连接
result = rm_moves(robot_handle, pose1, v, r, trajectory_connect, block);
if(result != 0) { 
    printf("rm_moves result : %d\n", result);
}

// 发出第二个点位,轨迹连接标志设为1以进行样条曲线连接
result = rm_moves(robot_handle, pose2, v, r, trajectory_connect, block);
if(result != 0) { 
    printf("rm_moves result : %d\n", result);
}

// 发出第三个点位,轨迹连接标志设为0立即规划
result = rm_moves(robot_handle, pose3, v, r, 0, block);
if(result != 0) { 
    printf("rm_moves result : %d\n", result);
}

笛卡尔空间圆弧运动rm_movec()

  • 方法原型:
C
int rm_movec(rm_robot_handle * handle,rm_pose_t pose_via,rm_pose_t pose_to,int v,int r,int loop,int trajectory_connect,int block)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose_via输入参数中间点位姿,位置单位:米,姿态单位:弧度。
pose_to输入参数终点位姿,位置单位:米,姿态单位:弧度。
v输入参数速度比例1~100,即规划速度和加速度占关节最大角速度和角加速度的百分比。
r输入参数交融半径百分比系数,0-100。
loop输入参数规划圈数。
trajectory_connect输入参数轨迹连接标志:
0:立即规划并执行轨迹,不与后续轨迹连接;
1:将当前轨迹与下一条轨迹一起规划,但不立即执行,阻塞模式下,即使发送成功也会立即返回。
block输入参数阻塞设置:
多线程模式:0,非阻塞模式,发送指令后立即返回;1,阻塞模式,等待机械臂到达目标位置或规划失败后返回。
单线程模式:0,非阻塞模式;其他值,阻塞模式并设置超时时间,根据运动时间设置,单位为秒。

注意:使用单线程阻塞模式时,请设置超时时间确保轨迹在超时时间内运行结束返回。
注意:trajectory_connect参数为1交融半径才生效,如果为0则交融半径不生效。

  • 返回值:
参数类型说明
0int成功。
1int控制器返回false,传递参数错误或机械臂状态发生错误。
-1int数据发送失败,通信过程中出现问题。
-2int数据接收失败,通信过程中出现问题或者控制器超时没有返回。
-3int返回值解析失败,接收到的数据格式不正确或不完整。
-4int当前到位设备校验失败,即当前到位设备不为关节。
-5int单线程模式超时未接收到返回,请确保超时时间设置合理。
  • 使用示例
C
// 圆弧运动
rm_pose_t povia;                                                        
povia.position.x=-0.300;                                                   
povia.position.y=-0.03;                                                   
povia.position.z=0.215;                                                    
povia.euler.rx=3.0;                                                      
povia.euler.ry=0.1;                                                      
povia.euler.rz=0.1;                                                      
rm_pose_t poto;                                                         
poto.position.x=-0.4;                                                      
poto.position.y=-0.030;                                                    
poto.position.z=0.215;                                                     
poto.rx=3.0;                                                       
poto.ry=0.1;                                                       
poto.rz=0.1;                                                       
ret = rm_movec(robot_handle,povia,poto,20,0,0,0,1);

以关节空间运动到目标位姿rm_movej_p()

  • 方法原型:
C
int rm_movej_p(rm_robot_handle * handle,rm_pose_t pose,int v,int r,int trajectory_connect,int block)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose输入参数目标位姿,位置单位:米,姿态单位:弧度。
v输入参数速度比例1~100,即规划速度和加速度占关节最大角速度和角加速度的百分比。
r输入参数交融半径百分比系数,0-100。
trajectory_connect输入参数轨迹连接标志:
0:立即规划并执行轨迹,不与后续轨迹连接;
1:将当前轨迹与下一条轨迹一起规划,但不立即执行,阻塞模式下,即使发送成功也会立即返回。
block输入参数阻塞设置:
多线程模式:0,非阻塞模式,发送指令后立即返回;1,阻塞模式,等待机械臂到达目标位置或规划失败后返回。
单线程模式:0,非阻塞模式;其他值,阻塞模式并设置超时时间,根据运动时间设置,单位为秒。

注意:使用单线程阻塞模式时,请设置超时时间确保轨迹在超时时间内运行结束返回。
注意:trajectory_connect参数为1交融半径才生效,如果为0则交融半径不生效。

  • 返回值:
参数类型说明
0int成功。
1int控制器返回false,传递参数错误或机械臂状态发生错误。
-1int数据发送失败,通信过程中出现问题。
-2int数据接收失败,通信过程中出现问题或者控制器超时没有返回。
-3int返回值解析失败,接收到的数据格式不正确或不完整。
-4int当前到位设备校验失败,即当前到位设备不为关节。
-5int单线程模式超时未接收到返回,请确保超时时间设置合理。
  • 使用示例
C
// 关节空间运动到目标位姿,阻塞模式(默认线程模式为多线程模式)
// 目标位置:x:0.1m,y:0.2m,z:0.03m;姿态:rx:0.4rad,ry:0.5rad,rz:0.6rad;
// 速度系数20%,不交融,立即规划执行
rm_pose_t pose;                                                            
pose.position.x=-0.1;                                                       
pose.position.y=-0.2;                                                       
pose.position.z=0.3;                                                        
pose.euler.rx=0.4;                                                          
pose.euler.ry=0.5;                                                          
pose.euler.rz=0.6;                                                          
ret = rm_movej_p(robot_handle,pose, 20,0,0,1);

角度透传rm_movej_canfd()

角度通过CANFD透传给机械臂,不需控制器规划。若指令正确,机械臂立即执行。

  • 方法原型:
C
int rm_movej_canfd(rm_robot_handle * handle,float * joint,bool follow,float expand)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述

透传效果受通信周期和轨迹平滑度影响,因此要求通信周期稳定,避免大幅波动。
用户在使用此功能时,建议进行良好的轨迹规划,以确保机械臂的稳定运行。
第三代控制器有线网口周期最快可达2ms,提供了更高的实时性。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
joint输入参数关节1~7目标角度数组,单位:°,精度0.0001°。
follow输入参数true-高跟随,false-低跟随。若使用高跟随,透传周期要求不超过10ms。
expand输入参数如果存在通用扩展轴,并需要进行透传,可使用该参数进行透传发送。
  • 返回值:
参数类型说明
0int成功。
-1int数据发送失败,通信过程中出现问题。
  • 使用示例
C
//角度透传到CANFD,目标关节角度:[1°,0°,20°,30°,0°,20°]
float joint[6] = { 1, 0, 20, 30, 0, 20};
rm_movej_canfd(robot_handle,joint,true,0);

位姿透传rm_movep_canfd()

位姿通过CANFD透传给机械臂,不需控制器规划。
当目标位姿被透传到机械臂控制器时,控制器首先尝试进行逆解计算。若逆解成功且计算出的各关节角度与当前角度差异不大,则直接下发至关节执行,跳过额外的轨迹规划步骤。
这一特性适用于需要周期性调整位姿的场景,如视觉伺服等应用。

  • 方法原型:
C
int rm_movep_canfd(rm_robot_handle * handle,rm_pose_t pose,bool follow)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述

透传效果受通信周期和轨迹平滑度影响,因此要求通信周期稳定,避免大幅波动。 用户在使用此功能时,建议进行良好的轨迹规划,以确保机械臂的稳定运行。 第三代控制器有线网口周期最快可达2ms,提供了更高的实时性。

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose输入参数位姿 (优先采用四元数表达)。
follow输入参数true-高跟随,false-低跟随。若使用高跟随,透传周期要求不超过10ms。
  • 返回值:
参数类型说明
0int成功。
-1int数据发送失败,通信过程中出现问题。
  • 使用示例
C
/*pose:目标位姿,位置精度:0.001mm,姿态精度:0.001rad
目标位置:x:0m,y:0m,z:0.85049m
目标姿态:rx:0rad,ry:0rad,rz:3.142rad
目标位姿为当前工具在当前工作坐标系下的数值。*/
rm_pose_t pose;                                                           
pose.position.x=0;                                                           
pose.position.y=0;                                                           
pose.position.z=0.85049;                                                         
pose.euler.rx=0;                                                           
pose.euler.ry=0;
pose.euler.rz=3.142;                       
rm_movep_canfd(robot_handle,pose,true);

关节空间跟随运动rm_movej_follow()

  • 方法原型:
C
int rm_movej_follow(rm_robot_handle * handle,float * joint)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
joint输入参数关节1~7目标角度数组,单位:°。
  • 返回值:
参数类型说明
0int成功。
-1int数据发送失败,通信过程中出现问题。
  • 使用示例
C
//关节跟随运动到目标关节角度:[1°,0°,20°,30°,0°,20°]
float joint[6] = { 1, 0, 20, 30, 0, 20};
rm_movej_follow(robot_handle,joint);

笛卡尔空间跟随运动rm_movep_follow()

  • 方法原型:
C
int rm_movep_follow(rm_robot_handle * handle,rm_pose_t pose)

可以跳转rm_robot_handlerm_pose_t和查阅结构体详细描述

  • 参数说明:
参数类型说明
handle输入参数机械臂句柄。
pose输入参数位姿 (优先采用四元数表达)。
  • 返回值:
参数类型说明
0int成功。
-1int数据发送失败,通信过程中出现问题。
  • 使用示例
C
/*pose:目标位姿,位置精度:0.001mm,姿态精度:0.001rad
目标位置:x:0m,y:0m,z:0.85049m
目标姿态:rx:0rad,ry:0rad,rz:3.142rad
目标位姿为当前工具在当前工作坐标系下的数值。*/
rm_pose_t pose;                                                           
pose.position.x=0;                                                           
pose.position.y=0;                                                           
pose.position.z=0.85049;                                                         
pose.euler.rx=0;                                                           
pose.euler.ry=0;
pose.euler.rz=3.142;                       
rm_movep_follow(robot_handle,pose);