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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐