使用ros2 lifecycle --h
命令可以看到lifecycle
相关的命令有哪些。
获取LifecycleNode节点的状态
1 | ros2 lifecycle get /lifecycle_node_demo_node |
其中/lifecycle_node_demo_node
为节点名称
map
话题的类型是nav_msgs::msg::OccupancyGrid
。使用下面的命令可以查询该类型的数据结构。
1 | ros2 interface show nav_msgs/msg/OccupancyGrid |
nav_msgs::msg::OccupancyGrid
的数据结构:
1 | # This represents a 2-D grid map |
其中data
数据成员用于存储地图中的每个栅格值。nav_msgs::msg::OccupancyGrid
存储的栅格值范围在[0~100]。0表示栅格未被占用,100表示栅格被占用了,而0到100之间表示被占用的程度。-1表示未知区域。
info
成员变量中主要存储地图文件的一些参数。比如:地图大小,分辨率,原点等信息。
Costmap_2d 的插件都是继承于CostmapLayer
。具体的关系如下图所示:
StaticLayer
内主要是通过接收map_server
发布的地图话题来加载静态地图的。所以StaticLayer
内是可以在线更改静态地图的。
ObservationBuffer
是一个障碍物观察数据的buffer。观测到的障碍物数据都将转成sensor_msgs::msg::PointCloud2
格式,然后存储到ObservationBuffer
中。
在ObservationBuffer
里存储的历史障碍物数据可以根据想保持的时间来清空。期望保持的时间主要由变量observation_keep_time_
来决定。如果设置成rclcpp::Duration(0.0s)
则表示每次都只存储最新的,历史障碍物数据都会被清掉。
看到这里,有同学可能会想,既然可以以时间为依据来清除障碍物,是不是也可以以其他条件来清除障碍物呢?答案肯定是可以的。这个就需要根据应用场景来选择了。比如:使用机器人的移动距离来作为判断条件。当观测数据时的机器人位置与现在机器人的位置超过多远就把该数据清掉。
有顺序的的启动节点,暂停节点,关闭节点是ROS1的一个痛点。因为在ROS1中节点启动是无序的。ROS1系统设计时并没有考虑节点启动时可能存在的互相依赖。
但在实际生产使用环境中,某些节点能正常工作是需要其他一些节点已经启动了的。
比如:需要定位功能能正常运行,前提是map_server节点已经正常加载地图文件并且已经把地图话题发布出来。
又或者你想从建图功能切到导航功能。在ROS1中,需要先将建图功能的程序杀干净。然后再启动导航程序。在ROS2中,各个节点的状态是可管理的。
在这个场景里,大可让建图程序休眠,而不用杀掉。切换功能时只需要激活相应功能的节点即可。
废话不多说,我们直接开始。
为了避免花太多时间折腾环境问题。这里使用Docker
来跑测试的示例。
安装Docker
1 | # step 1: 安装必要的一些系统工具 |
查看Action 信息的常用命令
Action主要用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
查看action列表
1 | ros2 action list |
查看action列表和类型
1 | ros2 action list -t |
查看action信息
1 | ros2 action info <action_name> |
显示action
1 | ros2 interface show <action_name> |
action send goal
1 | ros2 action send_goal <action_name> <action_type> <values> |
下面的操作是基于galactic
代码下载
1 | #安装git和编译工具 |
注意:链接中的https://ghproxy.com/ 为使用代理下载github代码。
下面的操作是基于ROS2 galactic
安装git,编译工具和下载源代码
1 | sudo apt-get install git python3-vcstool build-essential python3-colcon-common-extensions |
注意:链接中的https://ghproxy.com/ 为使用代理下载github代码。
文本中用于说明的完整示例代码请在下面的仓库中查阅。
https://gitee.com/shoufei/ros2_galactic_turorials.git
https://github.com/shoufei403/ros2_galactic_tutorials.git
节点的参数通常维护到yaml
文件中。节点启动时通常可以加载参数文件,然后读取参数的内容。而且在ROS
中参数是可以动态配置的。
更多细节参考官方文档:
https://docs.ros.org/en/galactic/Tutorials/Parameters/Understanding-ROS2-Parameters.html
以命令行方式加载参数文件
1 | ros2 run <package_name> <executable_name> --ros-args --params-file <file_name> |
示例:
1 | ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml |