从零搭建ROS移动抓取机器人:一个集成SLAM、导航与机械臂控制的项目实践

发布时间:2026/5/26 14:58:06

从零搭建ROS移动抓取机器人:一个集成SLAM、导航与机械臂控制的项目实践 1. 项目概述与准备工作搭建一个集成了移动底盘、激光雷达SLAM导航和机械臂抓取功能的ROS机器人听起来像是科幻电影里的场景但实际上用开源工具就能实现。这个项目适合有一定ROS基础想挑战综合应用的开发者。我去年帮学校实验室搭建过类似的系统从零开始到最终实现抓取功能花了三周时间期间踩了不少坑但也积累了很多实用经验。首先需要准备硬件环境。推荐使用Ubuntu 18.04 LTS系统搭配ROS Melodic版本这是目前最稳定的组合。我的工作目录结构是这样的~/ros_ws/ ├── src/ # 存放所有功能包 ├── build/ # 编译中间文件 └── devel/ # 生成的可执行文件创建基础工作空间的命令很简单mkdir -p ~/ros_ws/src cd ~/ros_ws/src catkin_init_workspace cd ~/ros_ws catkin_make安装必要依赖时有个小技巧先装核心组件再装周边工具。建议按这个顺序执行sudo apt-get install ros-melodic-desktop-full sudo apt-get install ros-melodic-arbotix ros-melodic-moveit sudo apt-get install ros-melodic-gmapping ros-melodic-hector-slam2. 机器人建模与仿真2.1 URDF/Xacro建模实战机器人建模就像搭积木每个部件都需要准确定义。我建议用Xacro代替URDF就像用高级语言替代汇编语言。举个例子定义底盘时可以这样写xacro:property namebase_width value0.4 / xacro:property namebase_length value0.5 / link namebase_link visual geometry box size${base_length} ${base_width} 0.1/ /geometry /visual /link机械臂建模时要注意关节限位。有次我忘记设置旋转范围结果仿真时机械臂直接扭成了麻花。正确的做法是joint namearm_joint1 typerevolute limit lower-1.57 upper1.57 effort30 velocity1.0/ axis xyz0 0 1/ /joint2.2 Gazebo与RViz集成把模型导入Gazebo需要添加物理属性和传感器插件。激光雷达的配置很关键gazebo referencelaser_link sensor typeray namerplidar pose0 0 0 0 0 0/pose visualizefalse/visualize update_rate5.5/update_rate ray scan horizontal samples360/samples resolution1/resolution min_angle-3.14/min_angle max_angle3.14/max_angle /horizontal /scan range min0.1/min max12.0/max resolution0.01/resolution /range /ray plugin namegazebo_ros_head_hokuyo_controller filenamelibgazebo_ros_laser.so topicName/scan/topicName frameNamelaser_link/frameName /plugin /sensor /gazebo在RViz中显示模型时我习惯用这个launch文件模板launch param namerobot_description command$(find xacro)/xacro $(find your_pkg)/urdf/robot.xacro / node namerobot_state_publisher pkgrobot_state_publisher typerobot_state_publisher / node namejoint_state_publisher pkgjoint_state_publisher typejoint_state_publisher / node namerviz pkgrviz typerviz args-d $(find your_pkg)/config/display.rviz / /launch3. 移动导航系统实现3.1 SLAM建图实战GMapping和HectorSLAM各有优劣。实测发现GMapping需要里程计信息但建图精度高HectorSLAM不需要里程计适合不平坦地面这是我调优过的GMapping参数node pkggmapping typeslam_gmapping nameslam_gmapping param namedelta value0.025/ param namexmin value-10/ param namexmax value10/ param nameymin value-10/ param nameymax value10/ param namemaxUrange value6.0/ param namemaxRange value8.0/ param namelinearUpdate value0.1/ param nameangularUpdate value0.1/ /node建图时有个常见问题机器人看到自己。解决方法是在URDF中为雷达添加遮挡属性link namelaser_mount visual geometry box size0.1 0.1 0.1/ /geometry material nameblack color rgba0 0 0 1/ /material /visual collision geometry box size0.1 0.1 0.1/ /geometry /collision /link3.2 自主导航配置导航栈需要正确配置costmap参数。这是我总结的经验值参数全局代价地图局部代价地图inflation_radius0.50.3cost_scaling_factor5.010.0transform_tolerance0.50.5update_frequency1.05.0调试导航时发现机器人经常卡住后来发现是加速度参数设置不合理。修改后TrajectoryPlannerROS: max_vel_x: 0.3 min_vel_x: 0.05 max_vel_theta: 1.0 min_vel_theta: -1.0 acc_lim_x: 0.5 acc_lim_theta: 1.04. 机械臂控制与抓取4.1 MoveIt!配置技巧使用Setup Assistant时要注意先规划好运动组如arm_group和gripper_group合理设置自碰撞检测参数测试各关节运动范围是否合理生成的config包中最需要关注的是limits.yamlarm_joint1: has_velocity_limits: true max_velocity: 1.0 has_acceleration_limits: true max_acceleration: 0.54.2 抓取逻辑实现抓取动作需要协调机械臂和夹爪。这是我写的Python示例def pick_and_place(): # 移动到预抓取位置 arm_group.set_named_target(pre_grasp) arm_group.go() # 打开夹爪 gripper_group.set_named_target(open) gripper_group.go() # 接近目标 pose_target arm_group.get_current_pose().pose pose_target.position.z - 0.05 arm_group.set_pose_target(pose_target) arm_group.go() # 闭合夹爪 gripper_group.set_named_target(closed) gripper_group.go() # 抬升物体 pose_target.position.z 0.1 arm_group.set_pose_target(pose_target) arm_group.go()调试时遇到的最棘手问题是碰撞检测误判。解决方法是在SRDF中添加禁用碰撞对disable_collisions link1arm_link2 link2base_link reasonNever/ disable_collisions link1gripper_left link2gripper_right reasonDefault/5. 系统集成与调试5.1 多节点协同控制使用launch文件整合所有功能时要注意节点启动顺序。我的标准结构launch !-- 基础系统 -- include file$(find robot_bringup)/launch/base.launch/ !-- 导航系统 -- include file$(find robot_navigation)/launch/navigation.launch/ !-- 机械臂控制 -- include file$(find robot_arm)/launch/arm_control.launch/ !-- 任务协调 -- node pkgrobot_coordinator typemain.py namecoordinator outputscreen/ /launch5.2 常见问题排查TF树断裂检查所有frame_id是否一致机械臂规划失败调整planner参数或更换规划算法导航路径震荡优化代价地图参数抓取位置偏移校准视觉系统或调整预抓取位姿最后分享一个实用技巧在RViz中保存所有配置后可以将其设为默认node namerviz pkgrviz typerviz args-d $(find your_pkg)/config/full_system.rviz /

相关新闻