在使用source ∼/bookros_ws/install/setup.bash
后,可以让ROS2
找到这个工作空间,进而可以调用相关的命令
ros2
这是ROS2与系统交互的方式
在终端输入ros2
,即可查看相关指令,如action\bag\node\launch
等操作
我们可以通过ros2 pkg list
来查看系统中有哪些安装包,我们可以看到通过鱼香ROS安装后的ROS系统内,包安装的是非常全的。我们可以pkg
命令来查看某个包内的可执行文件。
ros2的终端操作也支持"tab"补全
当连续按下两次"tab"时,可以看到后续可能会用到的内容
譬如当我们输入ros2
后,按下两次tab,会出现如下列表对我们进行提示
当需要执行ros2中的文件时,我们使用run
命令。它需要两个参数:
在运行程序时,可以启动日志,获得更详细的调试信息
日志分为四个等级,一次提高:DEBUG
INFO
WARN
ERROR
FATAL
ros2 run br2_basics logger --ros-args --log-level debug
一个终端只能执行一个节点,因此需要我们打开多个终端来观测程序的运行状况。因此计算图的重要性得以体现,它可以帮助我们梳理各节点的运行状况。
使用node list
命令,可以查看当前运行的节点,可以看出,当前只有一个节点在运行
$ ros2 node list
/talker
节点/talker
不仅仅是在屏幕上打印信息,它还通过话题通讯的方式将信息上传。我们可以使用命令行查看当前运行的话题。
$ ros2 topic list
/chatter
/parameter_events
/rosout
可以通过node
的info
属性查看该节点的具体信息
$ ros2 node info /talker
talker
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/chatter: std_msgs/msg/String
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
Service Servers:
/talker/describe_parameters: rcl_interfaces/srv/DescribeParameters
/talker/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/talker/get_parameters: rcl_interfaces/srv/GetParameters
/talker/list_parameters: rcl_interfaces/srv/ListParameters
/talker/set_parameters: rcl_interfaces/srv/SetParameters
/talker/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
需要注意的是,刚刚我们run的程序名字叫talker,而node叫/talker
每一个话题只能传输一种类型信息,如数值、字符串等,我们可以看/chatter
话题能传输的数据类型
$ ros2 topic info /chatter
Type: std_msgs/msg/String
Publisher count: 1
Subscription count: 0
接下来我们查看std msgs/msg/String
可以发送的类型
我们也可以打开/listener
节点,通过话题/chatter
接受/talker
发出的信息
即使程序的类型不同(一个是cpp,一个是py),也可以正常运行
打开计算图
ros2 run rqt_graph rqt_graph
使用 colcon
进行编译,可以通过 --packages-select
来达到只编译某个包的效果
cd ~/bookros2_ws #进入到工作空间
colcon build --symlink-install --packages-select br2_basics #最后为包的名称
RCLCPP_INFO和RCLCPP_INFO_STREAM都是用来输出ROS2节点信息日志的函数,它们的区别在于输出方式上:
RCLCPP_INFO:可以接收多个字符串,通过使用格式化符号(例如%ld、%d、%s等)来生成最终的日志信息。 示例:
int count = 10; RCLCPP_INFO(this->get_logger(), "Count: %d", count);
运行结果为:
[INFO] [node_name]: Count: 10
RCLCPP_INFO_STREAM:使用流操作符将字符串和日志对象拼接起来,输出到日志中。它可以使得输出的信息更加灵活和易读,适用于一般的信息输出。示例:
RCLCPP_INFO_STREAM(this->get_logger() << "Hello World!");
运行结果为:
[INFO] [node_name]: Hello World!
因此,在使用哪一种输出方式时,需要根据具体的情况和需求来进行选择和使用。