打印

从一张图开始:逐步实现一个机器人框架

[复制链接]
947|5
手机看帖
扫描二维码
随时随地手机跟帖
沙发
keer_zu|  楼主 | 2025-6-19 10:22 | 只看该作者

以下是需要构建的核心ROS2节点列表(基于Ubuntu 24.04 + ROS2 Jazzy):


必须构建的ROS2节点

  1. vision_processor`节点(感知层)
    • 功能:处理相机图像数据
    • 订阅话题
      • /camera/image(原始图像输入)
    • 发布话题
      • /object/detections(物体检测结果 → 规划层)
      • /vision_processor(视觉处理中间结果,可选)
  2. navigation`节点(感知层)
    • 功能:融合传感器数据生成导航信息
    • 订阅话题
      • /sensor/pose(相机位姿)
      • /IMU/encoder(IMU和编码器数据)
    • 发布话题
      • /obstacle/map(障碍物地图)
      • /navigation_obstacle(导航障碍物信息 → 交互层)
  3. task_planner`节点(规划层)
    • 功能:任务规划与路径生成
    • 订阅话题
      • /system/status(系统状态)
      • 规划层内部状态反馈(来自 motion_controller
    • 发布话题
      • /point/planned(路径点序列 → 运动控制)
      • /task_planner(任务状态更新)
  4. motion_controller节点(规划层)
    • 功能:路径跟踪与运动控制
    • 订阅话题
      • /point/planned(路径点输入)
      • /object/detections(物体检测结果)
    • 发布话题
      • cmd_vel(速度指令 → 控制层)
  5. qt_ui节点(交互层)
    • 功能:用户交互与状态显示
    • 订阅话题
      • /scene(场景状态)
      • /navigation_obstacle(障碍物信息)
      • /system/status(系统状态)

其他需集成的节点/模块

  1. 传感器驱动节点(外部依赖):
    • 相机驱动:发布 /camera/image/sensor/pose
    • IMU/编码器驱动:发布 /IMU/encoder
  2. ROS2 Control 节点(控制层,官方框架):
    • 功能:执行底层运动控制
    • 订阅cmd_vel(速度指令)
    • 发布/joint_states(关节状态反馈)
  3. 伺服驱动器(硬件层,非ROS节点):
    • 通过 ROS2 Control 的硬件接**互

关键消息流总结

  1. 感知 → 规划
    • /object/detections(物体检测)→ motion_controller
    • /obstacle/map(地图)→ 路径规划(图中未明示订阅者,推测由 task_planner 使用)
  2. 规划 → 控制
    • /point/planned(路径点)→ motion_controllercmd_velROS2 Control
  3. 系统状态循环
    • /system/status(系统状态)→ task_plannerqt_ui

开发建议:

  1. 使用标准消息类型
    • 图像:sensor_msgs/Image
    • 路径:nav_msgs/Path
    • 速度:geometry_msgs/Twist
    • 关节状态:sensor_msgs/JointState
  2. 自定义消息需求
    • 物体检测vision_msgs/Detection2DArray
    • 障碍物地图nav_msgs/OccupancyGrid
    • 系统状态:自定义 SystemStatus.msg(包含电池、错误码等)
  3. 工具推荐
    • RVIZ:可视化 /obstacle/map/point/planned
    • rqt_graph:调试节点拓扑
    • ROS2 Control:配置硬件接口(YAML + URDF)

总结需主动开发的节点

节点名 层级 编程语言 主要依赖库
vision_processor 感知层 C++/Python OpenCV, ROS2 CV Bridge
navigation 感知层 C++ Nav2, TF2
task_planner 规划层 C++ ROS2 Action
motion_controller 规划层 C++ ROS2 Control
qt_ui 交互层 C++ Qt6, rclcpp

完整系统需通过 Launch文件 集成所有节点,并配置参数(如传感器帧率、控制频率等)。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2025-6-19 11:23 | 只看该作者

系统集成说明

  1. 完整节点列表

    • vision_processor: 物体检测
    • path_planner: 路径规划
    • task_planner: 任务规划
    • vision_control_ui: 用户界面
    • navigation: 导航控制
    • motion_controller: 运动执行
  2. 数据流

    vision_processor → (检测结果) → task_planner
    task_planner → (任务) → path_planner
    path_planner → (路径) → navigation
    navigation → (速度指令) → motion_controller
    motion_controller → (关节指令) → 机器人硬件
    vision_control_ui ↔ (UI交互) ↔ 所有节点
  3. 关键特性

    • 所有节点参数化配置,可通过launch文件调整
    • 使用标准ROS消息接口
    • 差速驱动模型支持多种轮式机器人
    • 导航算法包含简单的位置控制回路
  4. 使用流程

    1. 启动所有节点:

      ros2 launch vision_processor vision_processor.launch.py
      ros2 launch navigation navigation.launch.py
      ros2 launch motion_controller motion_controller.launch.py
    2. 通过UI或命令行发送任务

    3. 系统自动执行检测、规划、导航流程

这些实现提供了完整的ROS 2节点框架,您可以根据实际机器人平台和需求调整参数和控制算法。特别是导航控制算法和运动学模型部分,可能需要根据您的机器人具体特性进行优化。

使用特权

评论回复
地板
keer_zu|  楼主 | 2025-6-20 11:40 | 只看该作者
错误:

--- stderr: navigation                                                
In file included from /opt/ros/jazzy/include/rclcpp/rclcpp/logging.hpp:24,
                 from /opt/ros/jazzy/include/rclcpp/rclcpp/copy_all_parameter_values.hpp:27,
                 from /opt/ros/jazzy/include/rclcpp/rclcpp/rclcpp.hpp:171,
                 from /home/kevin/vision_control_ws/src/navigation/include/navigation/navigation.hpp:4,
                 from /home/kevin/vision_control_ws/src/navigation/src/navigation.cpp:1:
/home/kevin/vision_control_ws/src/navigation/src/navigation.cpp: In member function ‘void Navigation::path_callback(nav_msgs::msg::Path_<std::allocator<void> >::SharedPtr)’:
/home/kevin/vision_control_ws/src/navigation/src/navigation.cpp:42:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘std::vector<geometry_msgs::msg::PoseStamped_<std::allocator<void> >, std::allocator<geometry_msgs::msg::PoseStamped_<std::allocator<void> > > >::size_type’ {aka ‘long unsigned int’} [-Wformat=]
   42 |     RCLCPP_INFO(get_logger(), "Received new path with %d points", msg->poses.size());
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~
      |                                                                                  |
      |                                                                                  std::vector<geometry_msgs::msg::PoseStamped_<std::allocator<void> >, std::allocator<geometry_msgs::msg::PoseStamped_<std::allocator<void> > > >::size_type {aka long unsigned int}
/home/kevin/vision_control_ws/src/navigation/src/navigation.cpp:42:56: note: format string is defined here
   42 |     RCLCPP_INFO(get_logger(), "Received new path with %d points", msg->poses.size());
      |                                                       ~^
      |                                                        |
      |                                                        int
      |                                                       %ld
---



--- stderr: vision_processor                                                
/usr/bin/ld: warning: libopencv_imgcodecs.so.406, needed by /opt/ros/jazzy/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.410
/usr/bin/ld: warning: libopencv_core.so.406, needed by /opt/ros/jazzy/lib/libcv_bridge.so, may conflict with libopencv_core.so.410
---

使用特权

评论回复
5
keer_zu|  楼主 | 2025-6-20 11:40 | 只看该作者
已经实现的节点图:

使用特权

评论回复
6
keer_zu|  楼主 | 2025-6-20 23:45 | 只看该作者

要让ROS Jazzy与OpenCV 4.10兼容,需解决两个核心问题:ROS默认依赖旧版OpenCV,以及符号冲突/API差异。以下是完整解决方案:


步骤1:源码编译安装OpenCV 4.10

bash

# 安装编译依赖
sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev

# 下载源码
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.10.0

# 编译安装(关键:自定义安装路径)
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.10.0 \
      -D BUILD_opencv_cudacodec=OFF \  # 禁用CUDA避免冲突
      -D WITH_GTK=ON \
      -D BUILD_EXAMPLES=OFF ..
make -j$(nproc)
sudo make install

步骤2:从源码重新编译 cv_bridge

2.1 创建独立工作空间

bash

mkdir -p ~/cv_bridge_ws/src
cd ~/cv_bridge_ws/src
git clone -b ros2 https://github.com/ros-perception/vision_opencv.git

2.2 修改 cv_bridge配置

编辑 vision_opencv/cv_bridge/CMakeLists.txt

cmake

2.3 编译 cv_bridge

bash

cd ~/cv_bridge_ws
source /opt/ros/jazzy/setup.bash
colcon build --packages-select cv_bridge \
  --cmake-args -DCMAKE_BUILD_TYPE=Release \
  -DOpenCV_DIR=/usr/local/opencv-4.10.0/lib/cmake/opencv4

步骤3:解决符号冲突问题

若运行时出现 libopencv_*.so冲突,强制链接新版OpenCV:

bash

# 创建自定义环境变量脚本
echo 'export LD_LIBRARY_PATH=/usr/local/opencv-4.10.0/lib:$LD_LIBRARY_PATH' > ~/set_opencv_env.sh
source ~/set_opencv_env.sh  # 每次使用ROS前执行

步骤4:在ROS项目中使用兼容环境

bash

# 终端1:加载cv_bridge和OpenCV环境
source ~/cv_bridge_ws/install/setup.bash
source ~/set_opencv_env.sh

# 终端2:正常启动ROS节点
source /opt/ros/jazzy/setup.bash
ros2 run your_package your_node

关键注意事项

  1. 版本检查 在代码中验证OpenCV版本: cpp

    #include <opencv2/core/version.hpp>
    std::cout << "OpenCV version: " << CV_VERSION << std::endl;
  2. API适配 OpenCV 4.10中移除的API(如 CV_BGR2GRAY)需替换: cpp

    // 旧版 (<=3.x)
    cv::cvtColor(image, gray, CV_BGR2GRAY);
    // 新版 (4.x+)
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
  3. 隔离依赖package.xml中声明兼容性: xml

    <depend>cv_bridge</depend>
    <build_depend>opencv</build_depend>

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1466

主题

12873

帖子

54

粉丝