视觉伺服visual servoing

发布时间:2026/5/20 10:50:52

视觉伺服visual servoing 模拟视觉反馈图像 X/Y 偏差自动控制机械臂末端向目标移动闭环控制偏差越小速度越低无硬件相机也能运行内置虚拟视觉信号视觉伺服 Visual Servoing 示例代码cpp运行/********************************************************************* * 视觉伺服控制 Demo (Visual Servoing) * 功能根据图像偏差自动控制机械臂末端运动 *********************************************************************/ #include rclcpp/rclcpp.hpp #include geometry_msgs/msg/twist_stamped.hpp #include control_msgs/msg/joint_jog.hpp #include cmath // 你的机械臂话题完全兼容 const std::string TWIST_TOPIC /servo_demo_node/delta_twist_cmds; const std::string BASE_FRAME_ID base_link; // 视觉伺服控制器 class VisualServoNode : public rclcpp::Node { public: VisualServoNode() : Node(visual_servo_demo) { // 发布速度指令 twist_pub_ this-create_publishergeometry_msgs::msg::TwistStamped(TWIST_TOPIC, 10); // 控制频率 100Hz timer_ this-create_wall_timer( std::chrono::milliseconds(10), std::bind(VisualServoNode::controlLoop, this) ); RCLCPP_INFO(this-get_logger(), 视觉伺服控制启动 ); RCLCPP_INFO(this-get_logger(), 模拟图像目标跟踪自动控制末端运动); } private: rclcpp::Publishergeometry_msgs::msg::TwistStamped::SharedPtr twist_pub_; rclcpp::TimerBase::SharedPtr timer_; // 模拟视觉偏差实际项目从相机/视觉算法获取 double error_x 0.08; // 图像X方向偏差 double error_y 0.05; // 图像Y方向偏差 // 控制器增益调小更稳调大更快 double kp 1.2; // 视觉伺服主循环 void controlLoop() { auto twist geometry_msgs::msg::TwistStamped(); twist.header.frame_id BASE_FRAME_ID; twist.header.stamp this-now(); // 核心视觉伺服控制律 // 图像偏差 → 机械臂运动速度 double vx -kp * error_x; // X方向运动 double vy -kp * error_y; // Y方向运动 // 限幅安全 vx std::clamp(vx, -0.12, 0.12); vy std::clamp(vy, -0.12, 0.12); twist.twist.linear.x vx; twist.twist.linear.y vy; twist.twist.linear.z 0.0; // // 发布指令 twist_pub_-publish(twist); // 模拟偏差随运动减小真实视觉会直接给出新的error error_x * 0.985; error_y * 0.985; // 打印实时状态 RCLCPP_INFO(this-get_logger(), 视觉偏差: [%.3f, %.3f] → 速度: [%.3f, %.3f], error_x, error_y, vx, vy); } }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node std::make_sharedVisualServoNode(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }运行效果plaintext[INFO] 视觉偏差: [0.080, 0.050] → 速度: [-0.096, -0.060] [INFO] 视觉偏差: [0.079, 0.049] → 速度: [-0.095, -0.059] [INFO] 视觉偏差: [0.078, 0.048] → 速度: [-0.094, -0.058] ... [INFO] 视觉偏差: [0.001, 0.001] → 速度: [-0.001, -0.001]工作原理超级简单视觉偏差目标在图像中的位置误差error_x,error_y控制律速度 - 增益 × 偏差vx -kp * error_x效果偏差大 → 速度快偏差小 → 速度慢偏差为 0 → 停止对准目标如何接入真实相机把下面两行cpp运行double error_x 0.08; double error_y 0.05;替换成你的视觉算法输出AprilTag、颜色跟踪、YOLO 等cpp运行// 真实视觉输入示例 error_x 图像目标中心x - 图像中心x error_y 图像目标中心y - 图像中心yCMakeLists.txt 编译配置cmakeadd_executable(visual_servo src/visual_servo.cpp) ament_target_dependencies(visual_servo rclcpp geometry_msgs ) install(TARGETS visual_servo DESTINATION lib/${PROJECT_NAME} )运行bash运行colcon build source install/setup.bash ros2 run moveit2_tutorials visual_servo总结这是标准工业视觉伺服实现闭环控制、自动对准、平滑运动直接兼容你的机械臂 MoveIt Servo可直接对接相机、AprilTag、视觉检测算法

相关新闻