ros2 ——自我实验1

实验内容: 创建二个节点一个话题

一.工作空间

假设创建一个测试工作空间

mkdir -p ros2-test1/src

二.功能包创建

1.创建

依赖有以下选择

ros2 pkg create <功能包名> --build-type ament-pythopn --dependencies <依赖>

2.依赖有以下选择

(1) 核心通信依赖

rclpy:ROS2 Python 客户端库,是所有 Python 节点的核心依赖(必须),提供节点创建、话题 / 服务 / 动作通信、参数管理等基础功能。

rclpy_action:rclpy 的动作通信扩展,用于开发动作服务器 / 客户端(Action)。

rclpy_service:服务通信的核心支持(已包含在 rclpy 中,无需单独声明,但服务相关消息包需额外依赖)。

rclpy_parameter:参数管理模块(已包含在 rclpy 中)。

(2) 消息 / 服务 / 动作类型依赖

不同功能场景需要对应的消息 / 服务 / 动作定义包,常见的有:

std_msgs:基础数据类型(String、Int32、Float64 等)。

sensor_msgs:传感器数据类型(Image、LaserScan、Imu 等)。

geometry_msgs:几何数据类型(Point、Twist、Pose 等,用于机器人运动控制)。

nav_msgs:导航相关数据类型(Odometry、Path 等)。

action_msgs:动作通信的基础消息类型。

tf2_msgs:坐标变换相关消息。

custom_interfaces:自定义消息 / 服务 / 动作包(需自己创建或依赖他人开发的包)。

(3) 功能模块依赖

针对特定功能的 ROS2 模块 Python 绑定:

tf2_ros_py:TF2 坐标变换的 Python 接口,用于处理机器人坐标系转换。

rviz2_py:RViz 可视化的 Python 交互接口(较少用,一般直接用 RViz 工具)。

rosbag2_py:ROS2 录包 / 回放的 Python API,用于读写 rosbag 文件。

ament_index_python:获取 ROS2 包索引信息(如查找包路径)。

launch_ros:Python 编写 launch 文件的核心依赖(用于启动多个节点)。

(4)开发与测试依赖

用于代码检查、测试、构建的辅助依赖:

ament_pytest:ROS2 集成的 pytest 测试框架,用于单元测试 / 集成测试。

ament_lint:代码规范检查工具(包含ament_flake8、ament_pep257等,检查 Python 代码风格)。

pytest:Python 标准测试库(ROS2 中常用ament_pytest封装版)。

colcon-core:构建工具依赖(无需手动声明,colcon 自动处理)。

(5) Python 标准库依赖

Python 自带的标准库,无需额外安装,可直接使用:

sys:系统参数与路径操作。

os:文件 / 目录操作。

time/datetime:时间处理。

json/yaml:数据序列化(读取配置文件等)。

threading/asyncio:多线程 / 异步编程(ROS2 节点本身是单线程 spin,复杂场景可结合)。

(6)常用第三方 Python 库依赖

根据功能需求引入,需在setup.py中声明install_requires:

numpy:数值计算(处理传感器数据、矩阵运算等)。

matplotlib:数据可视化(绘制传感器数据曲线、机器人轨迹等)。

opencv-python:图像处理(结合sensor_msgs/Image做图像识别、滤波等)。

pyserial:串口通信(机器人与外设如雷达、单片机通信)。

requests:HTTP 请求(与 Web 服务交互)。

pyyaml:YAML 文件解析(读取自定义配置)。

scipy:科学计算(信号处理、路径规划算法等)。

3.创建python脚本

编写一个订阅者(publisher)和一个发布者(subscriber)进行通讯。

import rclpy
from rclpy.node import   Node
from std_msgs.msg import  String


class publisher(Node):
    def __init__ (self):
        super()._init_("ros2-publisher")
        self.publisher =self.create_publisher(String,"bby",10) #创建发布者并且创建话题
        self.time =self.create_timer(2.0,self.callback1) #回调函数
        self.count = 0  #统计
        self.subscriber=self.create_subscriber(String,"bby",self.callback2,10)
    def callback1(self):
        msg=String()
        msg.data=f"holle!:{self.count}"
        self.publisher.publish(msg)
        self.get_logger().info(f"{msg.data}")
        self.count += 1
    def callback2(self,msg):
        self.get_logger().info(f"收到{msg.data}")

def main(args=None):
    rclpy.init(args=args)
    node = publisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

4.配置构建

(1).配置package.xml(添加依赖)

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>ros2-sy1</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="ztb@todo.todo">ztb</maintainer>
  <license>TODO: License declaration</license>

  **<depend>rclpy</depend>
  <depend>std_msgs</depend>**

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>

(2).配置setup.py(添加可执行入口)

找到entry_points部分,修改为:

entry_points={
    'console_scripts': [
        # 格式:可执行命令名 = 包名.脚本文件名:main函数
        'pub_sub_node = my_pubsub.pub_sub_node:main',
    ],
},

(3).编译功能包

回到你的 ROS2 工作空间根目录(比如~/ros2_ws),执行编译命令:

colcon build --packages-select <包名>

(4).激活空间

source ~/ros2/test11/install/setup.bash

5.查询启动

(1)启动

ros2 run ros2_syl pub_cs

(2)查询

ros2 node list
ros2 topic list
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值