ros2+moveit+yolo8 四轴机械臂物体抓取仿真

1 简介

QYU Arm Executor 是一个基于ROS2 Jazzy和MoveIt 2的四轴机械臂仿真与控制项目,实现了从物体检测到抓取放置的完整流程,物体检测采用YOLO8算法。

源码地址:

GitHub - HulinCal/qyu_arm_executor: simple ros2 arm of grasping object based on yolo8 · GitHub

结果演示:

2 整体架构

3 文件结构

qyu_arm_executor/

├── qyu_ros2_simple_arm/ # 机械臂核心包

│ ├── config/ # 控制器和桥接配置

│ ├── launch/ # 启动文件

│ ├── meshes/ # 3D模型文件

│ ├── rviz/ # RViz配置

│ ├── urdf/ # URDF模型

│ └── worlds/ # Gazebo世界文件

├── qyu_ros2_simple_arm_moveit_config/ # MoveIt 2配置

│ ├── config/ # MoveIt配置文件

│ └── launch/ # MoveIt启动文件

├── pose_control_cpp_pkg/ # 姿态控制包

│ ├── models/ # YOLOv8模型

│ ├── src/ # C++节点源码

│ └── CMakeLists.txt

└── qyu_ros2_simple_arm_py/ # Python工具包

4 功能模块

4.1 物体检测与定位 (YOLOv8)

节点名称: object_detect_locate_node

核心功能:

  • 使用 YOLOv8 ONNX 模型进行实时物体检测

  • 结合深度相机实现3D定位

  • 红色物体过滤(通过HSV颜色空间)

  • 发布检测到的物体位置

关键代码解析:

复制代码
// YOLO推理核心流程

std::vector<YoloDetection> runYoloInference(const cv::Mat& input) {

// 1. 图像预处理(正方形填充)

cv::Mat modelInput = formatToSquare(input, &pad_x, &pad_y, &scale);

// 2. 构建blob并输入网络

cv::dnn::blobFromImage(modelInput, blob, 1.0/255.0, modelShape, ...);

yolo_net_.setInput(blob);

// 3. 前向推理

yolo_net_.forward(outputs, yolo_net_.getUnconnectedOutLayersNames());

// 4. NMS非极大值抑制

cv::dnn::NMSBoxes(boxes, confidences, confidence_threshold_, nms_threshold_, nms_result);

}


//3D坐标计算:

void compute3DPosition(geometry_msgs::msg::PointStamped& point, int u, int v, double depth) {

// 相机坐标系 -> 世界坐标系转换

double cam_x = (u - cx_) * depth / fx_;

double cam_y = (v - cy_) * depth / fy_;

double cam_z = depth;

// 坐标变换

point.point.x = cam_z + depth_offset_;

point.point.y = -cam_x + x_offset_;

point.point.z = -cam_y + y_offset_;

}

4.2 机械臂姿态控制 (MoveIt 2)

节点名称: pose_control_node

核心功能:

  • 夹爪张开/闭合控制

  • 机械臂目标姿态控制

  • MoveIt 2 运动规划执行

    //MoveGroupInterface 使用示例:

    // 初始化机械臂规划组

    MoveGroupInterface move_arm(node, "arm");

    move_arm.setPlanningTime(5.0);

    move_arm.setMaxVelocityScalingFactor(0.6);

    move_arm.setMaxAccelerationScalingFactor(0.6);

    move_arm.setGoalPositionTolerance(0.005);

    // 设置目标姿态

    geometry_msgs::msg::PoseStamped target_pose;

    target_pose.header.frame_id = "base_link";

    target_pose.pose.position.x = 0.5854;

    target_pose.pose.position.y = 0.0012;

    target_pose.pose.position.z = 0.005;

    target_pose.pose.orientation.w = 0.6459; // 四元数

    // 规划并执行

    move_arm.setPoseTarget(target_pose, "end_effector_link");

    MoveGroupInterface::Plan arm_plan;

    if (move_arm.plan(arm_plan)) {

    move_arm.execute(arm_plan);

    }

4.3 目标点移动与抓取

节点名称: move_to_pose_node

执行流程:

关键代码:

target_pose.pose.position.z = detected_pose.point.z;

复制代码
// 订阅检测位置

auto pose_listener = std::make_shared<ObjectPoseListener>();

// 等待检测到物体

while (!pose_listener->isPoseReceived() && rclcpp::ok()) {

rclcpp::spin_some(pose_listener);

loop_rate.sleep();

}


// 获取检测位置并移动

auto detected_pose = pose_listener->getPose();

target_pose.pose.position.x = detected_pose.point.x;

target_pose.pose.position.y = detected_pose.point.y;

5 环境配置

基础依赖

复制代码
sudo apt install ros-jazzy-controller-manager

sudo apt install ros-jazzy-gz-ros2-control

sudo apt install ros-jazzy-joint-trajectory-controller

MoveIt 2 依赖

复制代码
sudo apt install ros-jazzy-moveit

sudo apt install ros-jazzy-moveit-ros-move-group

sudo apt install ros-jazzy-moveit-simple-controller-manager

OpenCV

复制代码
sudo apt install ros-jazzy-cv-bridge

sudo apt install libopencv-dev

6 运行指南

启动机械臂和MoveIt(不启动RViz)

ros2 launch qyu_arm_executor spawn_robot.launch.py rviz:=false

启动检测和抓取流程

ros2 run pose_control_cpp_pkg object_detect_locate_node \

--ros-args -p confidence_threshold:=0.51 -p min_red_ratio:=0.05

ros2 run pose_control_cpp_pkg move_to_pose_node