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