跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

睿抗机器人大赛魔力元宝仿真环境搭建与任务控制实战

睿抗机器人大赛魔力元宝项目涉及 ROS Noetic 环境配置、Gazebo 仿真搭建及 Python 主控逻辑开发。核心步骤包括创建工作空间、安装依赖包、配置 AR 视觉插件、自定义物料模型,以及编写底盘导航与机械臂抓取的控制脚本。通过一键启动脚本整合所有节点,实现从环境初始化到任务自动执行的完整流程,重点解决了多终端服务协同与视觉定位泊车问题。

MqEngine发布于 2026/4/9更新于 2026/7/2443 浏览

1. 搭建基础环境

以 ROS Noetic 为例,首先需要规划好工作空间结构。建议统一使用 ~/robot_ws 作为根目录,避免后续路径混淆。

创建工作空间

mkdir -p ~/robot_ws/src
cd ~/robot_ws/src

将源码包中的核心功能包复制到此目录下,主要包括以下四个:

  • ar_pose
  • oryxbot_description
  • relative_move
  • pid_lib

注意不要直接把整个上游仓库文件夹塞进去,只需剥离出这 5 个核心功能包即可。

安装仿真依赖

这一步很关键,主要是为了处理 AR 二维码识别和控制器缺失的问题。

  1. 下载 ar_track_alvar 源码(涉及二维码识别):
cd ~/robot_ws/src
git clone https://gitee.com/reinovo/ar_track_alvar.git
  1. 安装 ROS Noetic 常用控制与仿真依赖,防止出现 controller 或 moveit 报错:
sudo apt update
sudo apt install ros-noetic-moveit \
        ros-noetic-ros-control \
        ros-noetic-ros-controllers \
        ros-noetic-gazebo-ros-control \
        ros-noetic-joint-state-controller \
        ros-noetic-effort-controllers \
        ros-noetic-position-controllers \
        ros-noetic-driver-base \
        ros-noetic-ackermann-msgs

以上命令建议直接复制多行执行,单行可能会因换行符问题报错。

配置仿真模型与插件

  1. 配置模型文件:将压缩包里的 models 内容复制到 ~/.gazebo/models/ 目录下(.gazebo 是隐藏文件,按 Ctrl+H 可显示)。

  2. 配置插件:源码包中的 gazebo_plugins 包含两个版本文件夹,分别对应 Ubuntu 18.04 和 20.04。由于使用的是 ROS Noetic (Ubuntu 20.04),必须使用 contact_plugin_20-04_g11。

编辑 ~/.bashrc 文件,添加插件路径:

export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:/你的实际路径/gazebo_plugins/contact_plugin_20-04_g11

保存后记得 source ~/.bashrc 生效。

2. 编译与设置环境

进入工作空间根目录进行清理和编译:

cd ~/robot_ws
rm -rf build/ devel/
catkin_make

编译完成后需要设置环境变量。每次打开新终端都要手动刷新,或者写入配置文件自动生效:

# 临时生效
cd ~/robot_ws
source devel/setup.bash

# 永久生效(写入 .bashrc)
echo "source ~/robot_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

3. 加载 Gazebo 仿真与测试

启动环境

在第一个终端执行:

roslaunch oryxbot_description gazebo.launch

等待 Gazebo 界面弹出。首次启动可能需要几分钟下载模型,请耐心等待。

检查场景:应能看到机器人(Oryxbot)、场地围栏、加工台以及贴有 AR 码的二维码图片。

启动底盘导航与对接功能

打开第二个终端,执行:

source ~/robot_ws/devel/setup.bash
roslaunch oryxbot_description ar_base_gazebo.launch

该 Launch 文件会启动 relative_move(直线移动)和 base_pose_adjust(AR 码精准泊车)。执行后终端可能无输出并卡住,这是正常的,说明后台服务已就绪。

启动机械臂抓取功能

打开第三个终端,执行:

source ~/robot_ws/devel/setup.bash
roslaunch oryxbot_description pick_ar_gazebo.launch

这会启动 hand_ar(手部视觉识别)和 pick_ar_gazebo(抓取服务接口)。只要不报红色 Error 即为成功。

测试识别能力

在 Gazebo 中拖动机器人到 5 号加工中心正前方约 0.5 米处,让摄像头对准 AR 码。在第四个终端执行:

rostopic echo /ar_pose_marker

如果看到数据疯狂刷屏(显示 ID 和 position),说明视觉识别正常。

4. 添加二维码物料

针对抽取到的任务(如将 ID-3 放置到 5 号台,从 1 号台取回 ID-9),需要自定义物料模型。

参考 ~/robot_ws/src/models/small_marker_charge_pile 的结构来编写。以创建 ID-3 为例:

  1. 在 ~/.gazebo/models/ 下创建文件夹 marker_id3。
  2. 创建 materials 文件夹,内部结构如下:
materials/
├── scripts
│   └── reinovo.material
└── textures
    ├── id3.png
    └── id9.png

reinovo.material 内容示例:

material reinovo/id3_marker { receive_shadows on technique { pass { ambient 1.0 1.0 1.0 1.0 diffuse 1.0 1.0 1.0 1.0 specular 0.5 0.5 0.5 1.0 lighting on texture_unit { texture id3.png } } } }

这里同时声明了 ID-3 和 ID-9 的材质,不影响使用。

  1. 创建模型文件 model.sdf 和 model.config。

model.config:

<?xml version="1.0" ?>
<model>
  <name>id3_marker</name>
  <version>1.0</version>
  <sdf version="1.7">model.sdf</sdf>
  <author><name></name><email></email></author>
  <description></description>
</model>

model.sdf(简化版,包含物理属性与视觉纹理):

<?xml version='1.0'?>
<sdf version='1.7'>
  <model name='marker_id3'>
    <link name='link_0'>
      <inertial>
        <mass>0.1</mass>
        <inertia><ixx>0.0001</ixx><iyy>0.0001</iyy><izz>0.0001</izz></inertia>
        <pose>0 0 0 0 0 0</pose>
      </inertial>
      <pose>0 0 0.015 0 0 0</pose>
      <gravity>1</gravity>
      <visual name='visual'>
        <geometry><box><size>0.03 0.03 0.03</size></box></geometry>
        <material><script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/White</name></script></material>
      </visual>
      <collision name='collision'>
        <geometry><box><size>0.03 0.03 0.03</size></box></geometry>
        <surface><friction><ode><mu>100</mu><mu2>100</mu2></ode></friction></surface>
      </collision>
    </link>
    <!-- 其他链接与关节定义略 -->
  </model>
</sdf>

5. 添加到 Gazebo 并创建新世界模型

  1. 打开 Gazebo 世界文件,点击左下角暂停按钮取消物理效果,便于调整模型位置。
  2. 左侧 Insert 菜单中选择模型,确保路径已在 .bashrc 中导出。
  3. 选中模型,按 T 调整位置,按 R 调整位姿,Esc 退出。
  4. 点击运行查看效果,确认无误后保存世界文件(File -> Save As)。若另存为新 .world 文件,需修改 gazebo.launch 中的参数指向新路径。

6. 控制测试

键盘控制小车

安装控制包并测试运动:

sudo apt install ros-noetic-teleop-twist-keyboard
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

测试后可关闭,将小车移回初始位置。

编写主控脚本

在 ~/robot_ws/src/oryxbot_description/src/ 下创建 mission_controller.py。

核心逻辑包括坐标配置、服务连接、底盘移动、视觉对准及机械臂动作。以下是关键代码片段:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
import time
from geometry_msgs.msg import Pose, Pose2D
from std_srvs.srv import Empty
from arm_controller.srv import PickPlace, move
from relative_move.srv import SetRelativeMove
from ar_pose.srv import Track

class MissionCommander:
    def __init__(self):
        rospy.init_node('mission_commander', anonymous=True)
        rospy.loginfo(">>> 正在连接机器人底层服务...")
        try:
            rospy.wait_for_service('/relative_move', timeout=10)
            rospy.wait_for_service('/ar_track', timeout=10)
            rospy.wait_for_service('/pick_ar', timeout=10)
            rospy.wait_for_service('/goto_position', timeout=10)
            rospy.wait_for_service('/swiftpro/on', timeout=10)
        except rospy.ROSException:
            rospy.logerr("连接超时!请检查节点是否启动。")
            exit(1)

        self.srv_move_base = rospy.ServiceProxy('/relative_move', SetRelativeMove)
        self.srv_align = rospy.ServiceProxy('/ar_track', Track)
        self.srv_pick_ar = rospy.ServiceProxy('/pick_ar', PickPlace)
        self.srv_arm_move = rospy.ServiceProxy('/goto_position', move)
        self.srv_pump_on = rospy.ServiceProxy('/swiftpro/on', Empty)
        self.srv_pump_off = rospy.ServiceProxy('/swiftpro/off', Empty)
        rospy.loginfo(">>> 系统就绪。")

    def move_chassis(self, target_x, target_y):
        dx = target_x - 0.034
        dy = target_y - (-0.001)
        rospy.loginfo(f"🚗 导航启动 -> 目标:({target_x:.2f}, {target_y:.2f})")
        try:
            goal_pose = Pose2D()
            goal_pose.x = dx
            goal_pose.y = dy
            goal_pose.theta = 0.0
            self.srv_move_base(goal_pose, "odom", True, False)
            time.sleep(1)
        except Exception as e:
            rospy.logerr(f"底盘移动失败:{e}")

    def align_tag(self, tag_id):
        rospy.loginfo(f"👀 视觉对准 -> ID-{tag_id}")
        try:
            self.srv_align(ar_id=tag_id, goal_dist=0.3)
            time.sleep(1)
        except Exception as e:
            rospy.logwarn(f"对准失败:{e}")

    def run_task_1(self):
        rospy.loginfo("\n========== [任务一] 上料 (ID-3 -> 5 号台) ==========")
        self.move_chassis(0.755, 1.162)
        self.align_tag(5)
        # 机械臂动作序列略...
        rospy.loginfo(" >>> 返回起点...")
        self.move_chassis(0.034, -0.001)

if __name__ == "__main__":
    cmdr = MissionCommander()
    cmdr.run_task_1()

启动 IK 节点

机械臂控制核心需要手动启动逆运动学节点:

source ~/robot_ws/devel/setup.bash
rosrun oryxbot_description ik_swiftpro

执行后终端可能无输出,这是正常的,它在后台等待计算请求。

7. 一键脚本启动

为了方便调试,可以编写一个 Bash 脚本整合所有启动步骤。脚本会自动清理旧进程、加载环境、依次启动 Gazebo、导航服务、机械臂服务及 Python 主控脚本。

#!/bin/bash
cleanup() {
    echo "正在关闭所有进程..."
    kill $(jobs -p) 2>/dev/null
    killall -9 gzserver gzclient rosmaster rosout nodelet 2>/dev/null
    echo ">>> 环境已清理完毕。"
}
trap cleanup EXIT

echo "=========================================="
echo " 课程设计任务一键启动脚本"
echo "=========================================="

# 1. 清理旧环境
echo "[1/4] 清理旧环境..."
killall -9 gzserver gzclient rosmaster 2>/dev/null
sleep 2

# 2. 加载环境变量
source ~/robot_ws/devel/setup.bash

# 3. 启动仿真环境
echo "[2/4] 正在启动仿真环境 (Gazebo)..."
roslaunch oryxbot_description gazebo.launch > /dev/null 2>&1 &
sleep 15

# 4. 启动控制节点
echo "[3/4] 正在启动控制节点 (IK & Pick)..."
roslaunch oryxbot_description ar_base_gazebo.launch > /dev/null 2>&1 &
sleep 5
roslaunch oryxbot_description pick_ar_gazebo.launch > /dev/null 2>&1 &
sleep 5
rosrun oryxbot_description ik_swiftpro > /dev/null 2>&1 &
sleep 3

# 5. 运行 Python 主控脚本
echo "[4/4] 启动任务控制脚本..."
cd ~/robot_ws/src/oryxbot_description/src/
python3 mission_controller.py

echo "任务脚本已结束。"
echo "按 Enter 键关闭仿真并退出..."
read dummy

运行前请确保已在 Gazebo 中将物料方块手动拖拽到小车 Buffer 上,否则抓取逻辑无法执行。

目录

  1. 1. 搭建基础环境
  2. 创建工作空间
  3. 安装仿真依赖
  4. 配置仿真模型与插件
  5. 2. 编译与设置环境
  6. 临时生效
  7. 永久生效(写入 .bashrc)
  8. 3. 加载 Gazebo 仿真与测试
  9. 启动环境
  10. 启动底盘导航与对接功能
  11. 启动机械臂抓取功能
  12. 测试识别能力
  13. 4. 添加二维码物料
  14. 5. 添加到 Gazebo 并创建新世界模型
  15. 6. 控制测试
  16. 键盘控制小车
  17. 编写主控脚本
  18. -- coding: utf-8 --
  19. 启动 IK 节点
  20. 7. 一键脚本启动
  21. 1. 清理旧环境
  22. 2. 加载环境变量
  23. 3. 启动仿真环境
  24. 4. 启动控制节点
  25. 5. 运行 Python 主控脚本
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • SpringBoot 使用 YAML 配置实现数据脱敏方案
  • AIGC 内容去 AI 味:Prompt 设计原理与实战指南
  • Python 爬虫入门基础与 Requests 库使用指南
  • HTML5 结合 AI 实现智能场景渲染与交互
  • 告别 Electron:纯 C# 自研轻量 UI 引擎 XchyUI,内核<200KB
  • AI 实践:工具函数调用详解
  • DeepSeek 各版本演进与优缺点深度解析
  • 从 3D 打印到步态学习:宇树 Qmini 双足机器人开源实战
  • Spring AI 实战:从零开发 IDEA 插件版 AI 代码助手
  • 无水印保存豆包 AI 视频及图片的方法
  • 通用大模型企业落地难点与精调优化实践
  • Git 撤销上一次提交实战:reset、revert 与 amend 用法详解
  • 网络安全应急响应流程与方法论
  • MCP AI Copilot 智能化运维提效实战
  • 单链表核心操作实现与详解
  • CSS 实现毛玻璃模糊背景效果实战指南
  • 相干伊辛机在医疗与医疗 AI 领域的应用前景
  • 基于 AI 工具快速生成计算机课题技术路线图
  • EgoPoseFormer v2:AR/VR 第一视角人体动作捕捉技术解析
  • 从零开始训练大型语言模型(LLM)的完整指南

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online