随着机器人技术的快速发展,机械臂的智能控制成为工业自动化和服务机器人领域的重要课题。MoveIt作为ROS生态中功能强大的运动规划框架,为机械臂的路径规划和运动控制提供了便捷的接口和丰富的功能。

本教程将带领大家从零开始,学习如何使用MoveIt的C++接口MoveGroupInterface,实现机械臂关节的精准控制。通过实际代码示例,帮助读者快速掌握MoveIt的基本用法,为后续复杂运动规划和任务执行打下坚实基础。

摘要

Moveit API使用

标签

ROS1、moveit、机械臂、Piper

仓库

  • 导航仓库: https://github.com/agilexrobotics/Agilex-College
  • 项目仓库: https://github.com/agilexrobotics/piper/piper_moveit.git

使用环境

系统:ubuntu 20.04

ROS版本:noetic

Moveit——控制机械臂关节

在使用 MoveIt 进行机械臂控制时,MoveGroupInterface 是最常用、也是最简单高效的接口之一;使用C++调用Moveit API实现控制机械臂关节功能

创建一个名为piper_learnnig的功能包

cd ~/piper_ws/src
catkin_create_pkg piper_learnning roscpp rospy std_msgs moveit_ros_planning_interface

在piper_learnnig/src下创建一个名为moveit_joint的cpp文件;将以下代码填入moveit_joint.cpp中

// 导入ROS头文件
#include <ros/ros.h>
// 导入move_group_interface头文件
#include <moveit/move_group_interface/move_group_interface.h>

// 主函数
int main(int argc, char** argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "moveit_joint");

    // 异步消息处理器,设置线程数为1
    ros::AsyncSpinner spinner(1);
    
    // 启动异步消息处理器
    spinner.start();

    // move_group接口,选择机械臂为"arm"
	moveit::planning_interface::MoveGroupInterface move_group("arm");
    //获取终端link的名称
    std::string end_effector_link = move_group.getEndEffectorLink();
   //设置目标位置所使用的参考坐标系
    geometry_msgs::Pose start_pose = move_group.getCurrentPose(end_effector_link).pose;
    //当运动规划失败后,允许重新规划
    move_group.allowReplanning(true);

    //设置位置(单位:米)和姿态(单位:弧度)的允许误差
    move_group.setGoalPositionTolerance(0.001);
    move_group.setGoalOrientationTolerance(0.01);

    //设置允许的最大速度和加速度
    move_group.setMaxAccelerationScalingFactor(0.2);
    move_group.setMaxVelocityScalingFactor(0.2);

    // 控制机械臂先回到初始化位置
    move_group.setNamedTarget("zero");
    move_group.move();
    sleep(1);

    // 声明一个double 型元素的vector容器 
    std::vector<double> joint_values(6);

    // 把关节运动位置填入vector容器 
    // joint_values[0]=-0.39441719709048184;
    // joint_values[1]= 0.4228564717254736;
    // joint_values[2]= 0.5897185686390605;
    // joint_values[3]= 0.5897185686390605;
    // joint_values[4]= 0.5897185686390605;
    joint_values[5]= 0.5897185686390605;

    // 设置运动目标
    move_group.setJointValueTarget(joint_values); 

    ROS_INFO("move");
    // 执行运动
    move_group.move(); 

    // 停止异步消息处理器
    spinner.stop();

    // 关闭ROS节点
    ros::shutdown();
    
    // 返回0,程序结束
    return 0;
}

编辑CMakeLists文件,在末尾添加上以下代码

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)


add_executable(moveit_joint src/moveit_joint.cpp)
target_link_libraries(moveit_joint ${catkin_LIBRARIES})
add_dependencies(moveit_joint ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

在这里插入图片描述

编译代码

cd ~/piper_ws/
catkin_make

编译通过后,就可以启动moveit,尝试控制机械臂了

roslaunch piper_x_moveit_config demo.launch
rosrun piper_learnning moveit_joint

本教程介绍了基于MoveIt的机械臂关节控制方法,重点讲解了MoveGroupInterface的使用流程,包括节点初始化、异步消息处理、目标位置和姿态设置、运动规划及执行等关键步骤。通过示例代码,读者可以理解如何配置和控制机械臂的关节运动,实现从初始位置到指定关节角度的平滑移动。掌握这些基础内容后,读者可以进一步探索MoveIt的高级功能,如路径规划优化、碰撞检测和多机械臂协作等,提升机械臂的智能化水平和应用能力。

往期推荐

第一弹:机械臂固定点位录制与播放功能实现
第二弹:机械臂连续轨迹录制与播放功能实现
第三弹:用颜色说话,机械臂如何“看懂”方块与曲线并自动执行?
第四弹:如何用一部手机就能做到!不用遥控器也能控机械臂
第五弹:松灵PIPER机械臂手势识别与位置映射
第六弹:PiPER移植lerobot运动控制优化
第七弹:松灵PIPER机械臂实现Eigen线代库解算正逆运动学
第八弹:松灵Pika数采夹爪遥操任意机械臂的方法
第九弹:从零入门遥操作(UR篇)
第十弹:手柄遥操机械臂直观的机械臂控制新体验
第十一弹:松灵LIMO PRO的实例分割与点云提取实现
第十二弹:基于yolo算法识别的物体抓取
第十三弹:教你使用PiPER RL训练一个简单的任务
第十四弹:手把手教你完成 PiPER 机械臂的手眼标定(附完整命令)
第十五弹:在genesis上完成松灵PIPER单臂仿真与控制
第十六弹:Isaac_Sim 导入松灵PiPER URDF
第十七弹:用LIMO复现一篇IEEE论文
从零到玩转Moveit机械臂控制(一)
从零到玩转Moveit机械臂控制(三)

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐