实验二 轨迹规划

本文介绍了如何使用五次多项式插值方法生成机械臂的轨迹,并通过速度控制实现机械臂从起始点到指定终点的平滑运动,重点关注两点之间的连续控制。实验中给出了具体的空间路径点位姿,并展示了如何设置速度和加速度参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没有给轨迹时间,自己随便给了个

实验二 轨迹生成实验
一、实验目的
1、巩固机械臂轨迹的五次多项式插值方法
2、掌握通过速度控制使机械臂按预期的轨迹去运动到指定位置
二、实验内容
1、对机械臂轨迹进行插值
2、通过插值的多项式以速度控制的方式实现机械臂末端路径控制
三、实验步骤
1、给定四个机械臂坐标系中的空间路径点位姿:
第一个点:[0.2289, 0, 0.454, 1.57, 0, 0](初始门位置)
第二个点:[0.3, 0.25, 0.322, 1.57, -1.57, 0]
第三个点:[0.3, 0.1, 0.172, 1.57, -1.57, 0]
第四个点:[0.3, -0.1, 0.122, 1.57, -1.57, 0]
(第一个点为起点、第四个点为终点,第二和第三个点为必须经过的中间点)。
2、编写轨迹生成代码,通过速度控制使机械臂末端依次经过第二和第三路径点到达第四路径点停止。经过第二和第三点时不可停顿,末端经过这两点时的速度和加速度可以自行设定。
四、评定标准
1、是否按照要求带速度经过了第二和第三点
2、能否到四个路径点准确停止,相对误差的大小。

#include <string>
#include <ros/ros.h>
#include <iostream>
#include <time.h>
#include "vector"
#include "std_msgs/Float32.h"
#include "std_msgs/Float64MultiArray.h"
#include "controller_manager_msgs/SwitchController.h"
#include "controller_manager_msgs/ListControllers.h"
#include "ikfast.h"
#include "probot_anno_manipulator_ikfast_moveit_plugin.cpp"
#include "time.h"
#include <cmath>
#include <unistd.h>

using namespace ikfast_kinematics_plugin;

int main(int argc, char * argv[])
{
	bool ret;
	ros::init(argc, argv, "path_planning");
    	ros::NodeHandle node_handle;
    	ros::AsyncSpinner spinner(1);
    	ROS_INFO_STREAM("start");

	ros::Publisher vel_pub = node_handle.advertise<std_msgs::Float64MultiArray>("/probot_anno/arm_vel_controller/command", 100);
	ikfast_kinematics_plugin::IKFastKinematicsPlugin ik;
	ret = ik.IKFastKinematicsPlugin::initialize("robot_description","manipulator","base_link","link_6",0.001);

	const double theta[4][6]={0,0,0,0,0,0,
							0.795586,-0.772686,0.205056,1.08734,2.51046,-0.842853,
							0.387524,-1.07534,-0.199874,0.404374,2.86768,-0.114923,
							-0.387371,-1.29256,-0.0658126,2.74695,0.197329,-3.06044};
	double vel[4][6] = {0};
	double acc[4][6] = {0};
	double aver_vel[3][6] = {0};
	double aver_acc[3][6] = {0};	
	double xishu[3][6][6] = {0};
	double t[3] = {5,5,5};
	double ti = 0;
	std_msgs::Float64MultiArray init_vel;	
	
	for(int i = 0;i<3;i++)
		for(int j=0;j<6;j++)
			aver_vel[i][j] = (theta[i+1][j] - theta[i][j])/t[i];		

	for(int i = 0;i<4;i++){
		for(int j =0;j<6;j++){
			if(i == 0||i==3)vel[i][j] = 0;
			else
				vel[i][j] = (aver_vel[i-1][j]+aver_vel[i][j])/2;
		}
	} 

	for(int i = 0; i < 3 ; i++)
		for(int j = 0; j<6;j++)
			aver_acc[i][j] = (vel[i+1][j] - vel[i][j])/t[i];		
		
	for(int i = 0;i<4;i++){
		for(int j =0;j<6;j++){
			if(i==0||i==3)acc[i][j]=0;
			else
				acc[i][j] = (aver_acc[i-1][j]+aver_acc[i][j])/2;			
		}	
	}

	for(int i =0;i<3;i++){
		for(int j =0;j<6;j++){
			xishu[i][j][0] = theta[i][j];
			xishu[i][j][1] = vel[i][j];
			xishu[i][j][2] = acc[i][j]/2;
			xishu[i][j][3] = (20*(theta[i+1][j]-theta[i][j]) - (8*vel[i+1][j]+12*vel[i][j])*t[i] - (3*acc[i][j] - acc[i+1][j])*pow(t[i],2))/(2*pow(t[i],3));
			xishu[i][j][4] = (-30*(theta[i+1][j]-theta[i][j]) +(14*vel[i+1][j] +16*vel[i][j])*t[i] +(3*acc[i][j] - 2*acc[i+1][j])*pow(t[i],2))/(2*pow(t[i],4));
			xishu[i][j][5] = (12*(theta[i+1][j]-theta[i][j]) - 6*(vel[i+1][j]+vel[i][j])*t[i] -(acc[i][j]-acc[i+1][j])*pow(t[i],2))/(2*pow(t[i],5));
		}	
	}

	ros::Rate r(1000);
	std_msgs::Float64MultiArray init_vel;	
	for(int i = 0;i<6;i++)init_vel.data.push_back(0);
	for(int j = 0;j<3;j++){
		while(ros::ok()){
			if(ti < t[j])
				for(int i=0;i<6;i++)
					init_vel.data.at(i ) = 5*xishu[j][i][5]*pow(ti,4)+4*xishu[j][i][4]*pow(ti,3)+3*xishu[j][i][3]*pow(ti,2)+2*xishu[j][i][2]*ti+xishu[j][i][1];
			else break;
			vel_pub.publish(init_vel);
			ti+=0.001;
			bool met = r.sleep();
		}
		ti = 0;
		vel_pub.publish(init_vel);
		//getchar();
	}
	ROS_INFO_STREAM("published");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值