从零到玩转Moveit机械臂控制(三)
随着机器人技术的快速发展,机械臂的智能控制成为工业自动化和服务机器人领域的重要课题。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机械臂控制(三)
更多推荐



所有评论(0)