实验内容: 创建二个节点一个话题
一.工作空间
假设创建一个测试工作空间
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
1535

被折叠的 条评论
为什么被折叠?



