赞
踩
学习ROS2前需要对ROS1有所了解,可以通过访问ROS1文档学习:
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.销毁节点并关闭接口
使用面向过程思想,以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接口
代码中有用到一些依赖包,在编译前写好依赖
在功能包目录下打开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>
添加入口点让系统知道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',
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命令仅包含两项,node info与node list
输出节点的信息,包括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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。