ROS moveit 代码

本文介绍了如何使用ROS MoveIt!库进行轨迹规划,包括将上一个运动目标点设置为下一个运动的起点,无论是从Pose还是Joint角度。同时,详细讲解了如何调整轨迹点的速度和加速度,并展示如何将多个轨迹平滑地连接在一起,确保轨迹的首尾相连。

将之前一次运动的目标点设置成下一次运动的起点:

如果上一次的点是Pose:

robot_state::RobotState start_state(*group.getCurrentState());

const robot_state::JointModelGroup *joint_model_group =

                start_state.getJointModelGroup(group.getName());

 start_state.setFromIK(joint_model_group, target_pose); //target_pose就是上次运动的目标点

如果上一次的点是Joint:

joint_model_group = start_state->getJointModelGroup(group.getName());

start_state->setJointGroupPositions(joint_model_group,group_variable_values);

group.setStartState(*start_state); //group_variable_values 就是上次运动的目标点

 

 修改规划好的点位的速度和加速度:

   void scale_trajectory_speed(moveit::planning_interface::MoveGroupInterface::Plan &plan,double scale) {

      int n_joints = plan.trajectory_.joint_trajectory.joint_names.size();

      for(int i=0;i<plan.trajectory_.joint_trajectory.points.size();i++) {

          plan.trajectory_.joint_trajectory.points[i].time_from_start *= 1/scale;

          for(int j=0;j<n_joints;j++){

               plan.trajectory_.joint_trajectory.points[i].velocities[j] *=scale;

               plan.trajectory_.joint_trajectory.points[i].accelerations[j] *=scale*scale;

          }

      }

   }

 

将多条轨迹联合成一条轨迹,但轨迹应该首尾相连,即下一条的起始点是上一条的终点:

   

     #include <moveit/robot_trajectory/robot_trajectory.h>

         #include <moveit/trajectory_processing/iterative_time_parameterization.h>

         //假设有三条,分别是plan1,plan2,plan3



         //连接三条轨迹

         moveit_msgs::RobotTrajectory trajectory;

        

         trajectory.joint_trajectory.joint_names = plan1.trajectory_.joint_trajectory.joint_names;

         trajectory.joint_trajectory.points = plan1.trajectory_.joint_trajectory.points;

        

         //连接第二条

         for(size_t i=1;i<plan2.trajectory_.joint_trajectory.points.size();i++)

         {

             trajectory.joint_trajectory.points.push_back(plan2.trajectory_.joint_trajectory.points[i]);

         }

        

         //连接第三条

         for(size_t s=1;s<plan3.trajectory_.joint_trajectory.points.size();s++)

         {

             trajectory.joint_trajectory.points.push_back(plan3.trajectory_.joint_trajectory.points[s]);

         }

         //重新规划

         robot_trajectory::RobotTrajectory rt(group->getCurrentState()->getRobotModel(),"arm");

         rt.setRobotTrajectoryMsg(*group->getCurrentState(),trajectory);

         trajectory_processing::IterativeParabolicTimeParameterization iptp;

         iptp.computeTimeStamps(rt,1,1);//后面两个参数分别是,速度的比例和加速度的比例,设为1即不变

        

         rt.getRobotTrajectoryMsg(trajectory);

         moveit::planning_interface::MoveGroupInterface::Plan joinedPlan.trajectory_=trajectory;   //生成新的规划joinedPlan

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值