Loading

ROS_integration

开源项目

AR4

dummy

gcode控制

相关概念

  • 工作空间(Workspace),开发过程的大本营
  • 功能包(Package):功能源码的聚集地
  • 节点(Node):机器人的工作细胞
  • 话题(Topic):节点间传递数据的桥梁
  • 服务(Service):节点间的你问我答
  • 通信接口(Interface):数据传递的标准结构
  • 参数(Parameter):机器人系统的全局字典
  • 动作(Action):完整行为的流程管理,ROS2
  • 分布式通信(DistributedCommunication):多计算平台的任务分配
  • DDS(DataDistributionService):机器人的神经网络

节点node

节点通常对应于一个操作系统层面的进程。在一种常见的设置中,一个节点会被编译为一个可执行文件(例如 .cpp 或 .py 文件),当启动该节点时,会在操作系统中创建一个新的进程。多个节点可以同时运行,相互之间通过ROS的消息传递机制进行通信

每个节点通常执行一个特定的功能,例如:

  • 传感器数据的读取和处理
  • 控制算法的实现
  • 数据的发布与订阅
  • 任务的调度

启动与管理:节点通常通过roscore启动,管理节点的生命周期,处理节点的注册与网络配置。用户可以通过rosrun命令或者在ROS启动文件(launch file)中定义多个节点的启动

ROS2 生命周期节点

ROS2生命周期节点是利用状态机构成的,状态直接的转换依靠ROS2的通信机制完成。

生命周期节点主要有以下几个状态

  • 未配置状态(Unconfigured) ,节点开始时的第一个状态,并在出现错误后结束。没有执行,其主要目的是错误恢复。
  • 非活跃状态(Inactivate),节点持有资源(发布者、监听者等)和配置(参数、内部变量),但什么也不做。 没有执行,没有传输,传入的数据可以保存在缓冲区中,但不能读取, 主要目的是允许重新配置。
  • 活跃状态(Activate), 正常执行。
  • 已完成状态(Finalized),节点已被销毁。

通信机制

  • 数据交换通过以下方式:话题通信 (发布订阅模式)、服务通信 (请求响应模式)、参数服务器 (参数共享模式)

    • 话题和服务:不同节点之间数据传递
    • 参数服务器:不同节点之间数据共享
  • 流程控制通过以下方式:动作通信

    • 请求/响应增强,反馈与进度跟踪
    • 实施复杂,网络开销大;路径规划、运动控制等
topic service
通信模式 发布/订阅 请求/响应
同步性 异步 同步
底层协议 ROSTCP/ROSUDP ROSTCP/ROSUDP
缓冲区
实时性
节点关系 多对多 一对多(1个server)
通信数据 msg srv
使用场景 连续高频:雷达,里程计 偶尔调用:拍照,语音识别

话题

话题:接收到消息后进入回调函数,在回调函数中完成消息处理;

流式传输数据以远程控制机器人,发布机器人里程计信息,从相机发布视频流等

  • 异步通信
  • 多对多

服务

服务:回调函数中完成服务功能处理,并反馈应答数据

保存传感器的标定参数,保存机器人在导航过程中生成的地图或加载参数配置文件等

  • 同步通信
  • 一对多

参数

参数服务器

参数(Parameter)是ROS 2中节点的一种配置机制,它可以用于对节点进行设置。参数可以存储整数、浮点数、布尔值、字符串等基本类型数据,也可以存储ROS消息类型。参数的读写操作可以通过服务实现。在节点启动时,可以通过ROS参数服务器将参数传递给节点,也可以在运行时动态修改参数。常见的使用参数的场景包括节点的配置、调试等。原理基于服务。

  • 参数共享

动作

动作库是ROS服务的一种变化形式,可以在需要时取消在服务器上运行的进程

动作:特点就是需要维持一段时间且有及时的反馈并可以随时取消这个通信

某个目的地导航时,或进行路径规划时

  • 同步通信

ros2 interface list

命令功能:分类显示系统内所有的接口,包括消息(Messages)、服务(Services)、动作(Actions)

命令格式:ros2 interface list

ROS开发流程

在 ROS(Robot Operating System)中进行机器人仿真是一个常见的开发流程,通常涉及多个步骤。以下是进行 ROS 机器人仿真的一般流程:

1. 环境准备

安装 ROS

  • 根据您的操作系统选择合适的 ROS 版本(如 ROS Noetic, ROS Melodic 等)。
  • 按照 ROS 官方文档 进行安装。

安装依赖

  • 在进行仿真之前,您可能需要安装一些特定的依赖软件包:
    sudo apt-get update
    sudo apt-get install ros-<distro>-gazebo-ros-pkgs
    sudo apt-get install ros-<distro>-gazebo-ros-control
    

2. 创建 ROS 工作区

# 创建工作区目录
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

# 初始化工作区
catkin_init_workspace

# 编译工作区
cd ..
catkin_make

3. 创建机器人模型

使用 URDF 或 SDF 创建模型

  • URDF(Unified Robot Description Format)用于描述机器人硬件信息。
  • 可以使用工具如 urdfxacro 来创建 URDF 模型。
<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.1" radius="0.05"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0 1 1"/>
      </material>
    </visual>
  </link>
</robot>

包含传感器和控制器

  • 在 URDF 中可以定义传感器(如相机、激光雷达)和控制器。

4. 准备 Gazebo 环境

  • 在 ROS 中使用 Gazebo 进行物理仿真。确保安装了 Gazebo。
  • 创建一个 Gazebo 世界文件,以便于机器人进行仿真。
<world>
  <include>
    <uri>model://ground_plane</uri>
  </include>
  <include>
    <uri>model://sun</uri>
  </include>
</world>

5. 创建启动文件

为您的机器人和 Gazebo 创建启动文件,以便自动加载模型和环境。

<launch>
  <arg name="model" default="$(find your_package)/urdf/your_robot.urdf" />
  <param name="robot_description" command="cat $(arg model)" />
  <node pkg="gazebo_ros" type="gzserver" name="gazebo" output="screen" args="-u $(arg world)" />
  <node pkg="gazebo_ros" type="gzclient" name="gzclient" output="screen" />
</launch>

6. 运行仿真

  • 使用 roslaunch 命令启动您的仿真环境。
roslaunch your_package your_launch_file.launch

7. 控制机器人

  • 编写 ROS 节点,以控制机器人。例如,可以使用 rostopic 发布速度命令到机器人。
rostopic pub /cmd_vel geometry_msgs/Twist -- once

8. 视觉和感知

  • 可以添加传感器数据的模拟,比如通过 Gazebo 的插件获得 LIDAR 或相机数据,并在 ROS 中进行处理。

9. 记录和调试

  • 使用 rosbag 记录仿真数据,方便后期分析与调试。
  • 在 Gazebo 中可以通过可视化工具观察变量和数据流。

10. 开发和迭代

  • 根据需要不断调整仿真环境、机器人模型和控制逻辑,逐步完善。

注意事项

C++头文件和源文件

在ROS(Robot Operating System)或一般的C++项目中,头文件和源文件是两种不同类型的文件,它们在代码的组织和结构上扮演着重要的角色。以下是它们的区别和应用:

头文件(Header Files)

扩展名:通常为 .h.hpp

定义
头文件主要用于声明类、函数、变量和常量等。在C++中,头文件不包含实现,只包含接口的定义。

含义

  1. 声明:在头文件中声明函数和类,使得其他源文件可以使用这些函数和类而不需要知道它们的具体实现。
  2. 接口:提供对外的接口,帮助组织代码,增加模块化。
  3. 避免重复定义:通常使用预处理指令(如 #ifndef, #define, #endif)来避免头文件被多次包含,从而防止重定义的问题。

应用

  • 当你设计一个类时,通常会在头文件中定义类的接口和相关的成员函数。
  • 提供给其他模块或文件以便调用。

源文件(Source Files)

扩展名:通常为 .cpp

定义
源文件是包含具体实现的文件,也就是包含函数的定义和类的具体实现。

含义

  1. 定义:在源文件中实现头文件中声明的函数和类的具体功能。
  2. 逻辑:编写程序的逻辑和算法。

应用

  • 将头文件的实现写在相应的源文件中。
  • 提供具体的功能和行为,比如数据处理、逻辑控制等。

在ROS中的应用

在ROS中,头文件和源文件的使用相似,但还可以结合ROS的特性:

  1. 节点和消息定义:通常会有专门的头文件定义ROS节点的类和消息的结构,然后在源文件中实现这些节点和消息的逻辑。

  2. 模块化:通过使用头文件定义接口,可以将ROS节点模块化,便于维护和扩展。

  3. 库的使用:在ROS中,头文件常用于定义库的接口,源文件则实现库的功能,便于将功能代码重用。

总结

  • 头文件:声明(interface),用于代码组织和模块化。
  • 源文件:实现(implementation),包含具体的逻辑和功能。

在编写ROS程序时,合理使用头文件和源文件可以帮助更好地组织代码,促进代码重用和维护。

  1. 设置头文件,可执行文件作为源文件;
  2. 分别设置头文件,源文件与可执行文件

python模块导入

与C++类似的,在Python中导入其他模块时,也需要相关处理

需求:首先新建一个Python文件A,再创建Python文件UseA,在UseA中导入A并调用A的实现。

import 自定义包时,rosrun找到是整个ros工作空间下的包名,而python默认为当前目录下查找自定义包

解决方法:在导入包之前设置临时环境变量,再添加可执行权限,编辑配置文件并执行

文件A

#! /usr/bin/env python
num = 1000

文件B

import os
import sys

path = os.path.abspath(".")
# 核心
sys.path.insert(0,path + "/src/plumbing_pub_sub/scripts")

import tools

....
....
    rospy.loginfo("num = %d",tools.num)
posted @ 2026-08-05 19:58  Invo1  阅读(8)  评论(0)    收藏  举报