学习ROS2前需要对ROS1有所了解,可以通过访问ROS1文档学习:
ROS1相关文档
一、ROS2运行示意图
二、与ros1的区别
以下是ros1的node命令包含的内容,可以明显发现两者的不同,如果只学习ros2,则可以不用了解
rosnode ping test connectivity to node
rosnode list 获取列表 list active nodes
rosnode info 获取节点信息 print information about node
rosnode machine list nodes running on a particular machine or list machines
rosnode kill kill a running node
rosnode cleanup purge registration information of unreachable nodes
三、节点
节点是独立的可执行文件,像细胞一样,可以执行机器人系统中的具体任务,不同的节点可以执行不同的功能,比如A节点负责视觉 B节点负责运动控制 C节点负责导航
节点可以分布在不同的硬件载体上,节点之间可以进行通信
不同节点可以用不同的编程语言来写
① 编写节点的思想
编写节点的思想和编程类似,可以面向过程,也可以面向对象
对于复杂的机器人,通常使用面向对象的思想,做到模块化
② 编写节点的基本流程
1.编程接口初始化
2.创建节点并初始化
3.实现节点功能
4.销毁节点并关闭接口
③ 尝试编写简单节点的内容
1.编写节点
使用面向过程思想,以python语言编写一个简单的节点,发布HelloWorld日志信息
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node
import time #引入time库
# 下面的部分是ROS2节点主入口main函数
def main(args=None): # 主函数
rclpy.init(args=args) # 初始化 rclpy ROS2的python接口
nodename = Node("node_print_hello_world")# 创建ROS2节点对象并进行初始化
while rclpy.ok():# 当系统正常运行
nodename.get_logger().info("Hello World!") # 日志输出
time.sleep(1) # time休眠循环
nodename.destroy_node()
rclpy.shutdown() #关闭ROS2的Python接口
2.为节点代码的编译添加依赖
代码中有用到一些依赖包,在编译前写好依赖
在功能包目录下打开package.xml,修改以下内容
必须添加的内容
当功能包里的代码被执行时,这些语句声明了功能包的依赖
<exec_depend>rclpy</exec_depend>
可以额外添加的内容
例子:
<description>Print log “Hello World! ”per second</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>
3.添加入口点
添加入口点让系统知道Python程序的入口在哪儿
必须添加的内容
打开setup.py,添加入口点
在entry_points下的这个位置添加以下命令
'node_hello_world= herman_ROS_learning.node_print_hello_world:main',
案例形式:
entry_points={
'console_scripts': [
'node_print_hello_world= herman_ROS_learning.node_print_hello_world:main',
],
},
可以额外添加的内容
maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='Print log “Hello World! ”per second',
license='Apache License 2.0',
4.检查setup.cfg【可选】
setup.cfg是自动填写的,它将功能包的可执行文件放入lib中,ros2 run将会在lib中查找这些执行性文件是否存在并调用
[develop]
script_dir=$base/lib/herman_ROS_learning
[install]
install_scripts=$base/lib/herman_ROS_learning
同理,可以观察一下面向对象的编程方法,这样方便移植以及模块化
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node
"""
面向对象
"""
class HelloWorldNode(Node): # Node为这个类的父类
def __init__(self,nodename):
super().__init__(nodename) # 调用父类中Node的构造函数,赋名根据提供的参数nodename来
while rclpy.ok():# 当系统正常运行
self.get_logger().info("Hello World!") # 日志输出
time.sleep(1) # time休眠循环
def main(args=None): # 主函数
rclpy.init(args=args) # 初始化 rclpy
node= HelloWorldNode("node_hello_world_class") # 创建ROS2节点对象并初始化
rclpy.spin(node) # 循环等候着销毁的到来
node.destroy_node() #销毁节点对象
rclpy.shutdown() #关闭接口
if __name__ == '__main__': # 该条下的所有代码仅当本脚本直接执行时会触发,如果在其他文件引用本文件,则不会触发以下的代码
main()
四、ros2中的node相关命令
ros2的node命令仅包含两项,node info与node list
① ros2 node info
输出节点的信息,包括Subscriber, Publisher, Service Servers, Service Clients, Action Servers, Action Clients
ros2 node info /turtlesim
OUTPUT:
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
② ros2 node list
查看当前存在的节点
ros2 node list
OUTPUT:
/turtlesim
五、对节点名进行重映射
当需要为节点单次重新起名时,在启动节点命令后补充如下命令,该节点这次将以重映射后的名字运行并存在node list中,该节点可以作为和原名一样的对象和其他节点进行交互,比如turtle_teleop_key也可以操纵重命名后的turtle
可以通过重映射命令创建多个不同名称的同类型对象。
--ros-args --remap __node:=new_name
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=renamed_turtle
INPUI:
ros2 node list
OUTPUT:
/renamed_turtle
/turtlesim