datetime:2024/01/10 18:18
author:nzb
导航
https://github.com/ros-planning/navigation2.git
分支:humble
节点:3ed4c2d

通用插件系统管理
nav2_bringup| 启动入口nav2_common| 公共功能包nav2_msgs| 通信相关消息定义nav2_util| 常用工具nav2_lifecycle_manager|节点生命周期管理器nav2_rviz_plugins| RVIZ插件
nav2_bringup
- 包含
launch、maps、params、rviz、urdf、world等配置文件
nav2_common
HasNodeParams:检查配置参数是否有某个节点的参数配置ParseMultiRobotPose:解析多个机器人位置ReplaceString:修改配置文件里面的某些字符串RewrittenYaml:重写配置文件里面的某些参数
nav2_util
simple_action_server.hpp- ServiceClient:ROS2服务的简单包装器模板类
invoke:调用,返回结果智能指针invoke:调用,返回成功与否,布尔类型结果wait_for_service:等待服务可达getServiceName:获取服务名
- ServiceClient:ROS2服务的简单包装器模板类
service_client.hpp- SimpleActionServer:ROS2动作的简单包装器模板类
SimpleActionServer:构造函数重要属性execute_callback:执行回调completion_callback:完成回调
handle_goal:处理请求,永远接受,除非服务未启handle_cancel:处理取消handle_accepted:处理接受,调用workwork:函数内调用execute_callback、completion_callback、accept_pending_goalactivate:激活deactivate:取消激活is_running:是否运行中is_server_active:服务是否激活is_preempt_requested:是否抢占式请求accept_pending_goal:接受新任务terminate_pending_goal:终止待定任务get_current_goal:获取当前任务get_current_goal_id:获取当前任务IDget_pending_goal:获取待定任务is_cancel_requested:是否有取消命令到来terminate_all:终止所有任务terminate_current:终止当前任务succeeded_current:设置当前任务完成publish_feedback:发布反馈信息
- SimpleActionServer:ROS2动作的简单包装器模板类
string_utils.hppstrip_leading_slash:去掉前导斜线,用于topic名称切割split:字符串分割
robot_utils.hppgetCurrentPose:获取当前位姿transformPoseInTargetFrame:获取目标帧位姿getTransform:获取从源坐标系到目标坐标系的变换,仅适用于在源坐标系和目标坐标系之间进行变换,不考虑时间戳信息getTransform:获取从源坐标系到目标坐标系的变换。该函数提供了源坐标系的时间戳和目标坐标系的时间戳,会考虑源坐标系和目标坐标系之间的时间偏差,并在给定的容忍度范围内查找最近的变换。validateTwist:校验速度指令数据是否合法
odometry_utils.hpp:里程计平滑器,订阅odom话题,使用简单的移动平均值做的平滑器- OdomSmoother:构造函数
getTwist:获取twistgetTwistStamped:获取待时间戳的twistodomCallback:话题回调,调用updateStateupdateState:当获取到新数据的时候,使用移动平均值更新数据
occ_grid_values.hpp:占用网格,数据常量OCC_GRID_UNKNOWN:占用未知OCC_GRID_FREE:未占用OCC_GRID_OCCUPIED:占用
node_utils.hppsanitize_node_name:替换潜在节点名称中的无效字符,把不是字母数字的字符替换成_add_namespaces:添加命名空间generate_internal_node_name:生成内部节点名称time_to_string:生成伪随机数字字符串generate_internal_node:生成节点declare_parameter_if_not_declared:声明静态 ROS2 参数并将其设置为给定值(如果尚未声明)declare_parameter_if_not_declared:如果尚未声明,则声明具有给定类型的静态 ROS2 参数get_plugin_type_param:获取所选节点的插件类型及其插件copy_all_parameters:将所有参数从一个节点(父节点)复制到另一个节点(子节点)的方法
node_thread.hpp:用于处理节点回调构造函数的后台线程NodeThread(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base):用于处理节点回调构造函数的后台线程NodeThread(rclcpp::executors::SingleThreadedExecutor::SharedPtr executor):处理执行器回调构造函数的后台线程
line_iterator.hpp:实现 Bresenham 算法的光线追踪的迭代器LineIterator(int x0, int y0, int x1, int y1):构造函数,接收起点和终点的坐标作为参数。isValid():检查迭代器是否有效,即是否仍然有点可迭代。advance():将迭代器前进到下一个点。getX():获取当前点的 X 坐标。getY():获取当前点的 Y 坐标。getX0():获取起点的 X0 坐标。getY0():获取起点的 Y0 坐标。getX1():获取终点的 X1 坐标。getY1():获取终点的 Y1 坐标。
lifecycle_node.hpp:生命周期节点包装器(继承于rclcpp_lifecycle::LifecycleNode),可满足常见的 Nav2 需求,例如操作参数- LifecycleNode:构造函数,调用
printLifecycleNodeNotification、register_rcl_preshutdown_callback ~LifecycleNode:析构函数,调用runCleanups,移除预关闭回调add_parameter:添加参数,声明没有整数或浮点范围限制的参数add_parameter:添加参数,声明有浮点范围限制的参数add_parameter:添加参数,声明有整数范围限制的参数shared_from_this:获取当前实例的共享指针on_error:错误回调on_rcl_preshutdown:在我们的上下文关闭之前执行预关闭活动。请注意,这与我们的 Context 的关闭顺序有关,而不是生命周期节点状态机。 调用runCleanups、destroyBondcreateBond:创建与生命周期管理器的绑定连接destroyBond:销毁与生命周期管理器的绑定连接printLifecycleNodeNotification:打印生命周期节点的通知register_rcl_preshutdown_callback:为该节点的 rcl 上下文注册我们的预关闭回调- 回调在该节点的上下文关闭之前触发。
- 请注意,这与生命周期状态机没有直接关系。
- 添加绑定回调
on_rcl_preshutdown
runCleanups:清理- 如果节点激活状态,调用节点的
deactivate方法 - 如果节点未激活状态,调用节点的
cleanup方法
- 如果节点激活状态,调用节点的
- LifecycleNode:构造函数,调用
lifecycle_service_client.hpp:生命周期服务客户端,使用nav2_util::service_client.hpp::SimpleActionServer创建- LifecycleServiceClient:构造函数,如果提供了节点指针,直接初始化一个节点,否则使用
nav2_util::node_utils.hpp::generate_internal_node自动生成一个节点change_state:更改状态,可以设置超时时间change_state:更改状态,不可以设置超时时间get_state:获取状态
- LifecycleServiceClient:构造函数,如果提供了节点指针,直接初始化一个节点,否则使用
lifecycle_utils.hpp:生命周期工具startup_lifecycle_nodes:按顺序将给定生命周期节点转换为ACTIVATED状态,接收节点名称列表startup_lifecycle_nodes:按顺序将给定生命周期节点转换为ACTIVATED状态,接收以:拼接的字符串,分割后调用上面startup_lifecycle_nodes函数reset_lifecycle_nodes:按顺序将给定生命周期节点转换为UNCONFIGURED状态,接收节点名称列表reset_lifecycle_nodes:按顺序将给定生命周期节点转换为UNCONFIGURED状态,接收以:拼接的字符串,分割后调用上面reset_lifecycle_nodes函数lifecycle_utils.cpp#define RETRY(fn, retries):重试startupLifecycleNode:使用nav2_util::lifecycle_service_client.hpp::LifecycleServiceClient.change_state方法,状态由TRANSITION_CONFIGURE->TRANSITION_ACTIVATEresetLifecycleNode:使用nav2_util::lifecycle_service_client.hpp::LifecycleServiceClient.change_state方法,状态由TRANSITION_DEACTIVATE->TRANSITION_CLEANUP
lifecycle_bringup_commandline.cpp:nav2_util入口文件geometry_utils.hpp:几何工具orientationAroundZAxis:绕Z轴的四元数转换euclidean_distance:欧氏距离(2d、3d)min_by:在迭代器中查找计算值最小的元素,比如:一组点到目标点最短距离first_after_integrated_distance:查找迭代器中积分距离大于比较值的第一个元素calculate_path_length:从提供的索引开始计算提供的路径的剩余长度
execution_timer.hpp:执行时间- ExecutionTimer:执行时间类,测量调用 start 和 end 之间代码的执行时间
start:开始时间end:结束时间elapsed_time:花费时间,返回纳秒elapsed_time_in_seconds:花费时间,返回秒
- ExecutionTimer:执行时间类,测量调用 start 和 end 之间代码的执行时间
costmap.hpp:代价地图- Costmap:代价地图类
set_static_map:设置静态代价地图set_test_costmap:设置测试代价地图get_costmap:获取代价地图get_properties:获取代价地图配置参数is_free:获取某些坐标是否没有障碍物is_free:获取代价地图中某个索引是否没有障碍物
- Costmap:代价地图类
nav2_lifecycle_manager
lifecycle_manager.hpp- LifecycleManager:生命周期管理类
LifecycleManager:构造函数- 声明和获取相关参数
- 调用
registerRclPreshutdownCallback - 创建
节点名称/manage_nodes服务,处理函数为managerCallback - 创建
节点名称/is_active服务,处理函数为isActiveCallback - 创建
init_timer_定时器- 调用
createLifecycleServiceClients,遍历和创建管理的所有节点的生命周期服务客户端nav2_util::LifecycleServiceClient - 如果配置了
autostart_,重新创建init_timer_定时器,调用startup - 实例化
rclcpp::executors::SingleThreadedExecutor,启动线程nav2_util::NodeThread,运行执行器
- 调用
managerCallback:管理服务回调request->command==STARTUP:调用startuprequest->command==RESET:调用resetrequest->command==SHUTDOWN:调用shutdownrequest->command==PAUSE:调用pauserequest->command==RESUME:调用resume
isActiveCallback:如果管理的所有节点都激活了,激活服务回调,返回system_active_的值startup:启动所有管理节点- 调用
changeStateForAllNodes,修改节点状态TRANSITION_CONFIGURE、TRANSITION_ACTIVATE - 调用
createBondTimer
- 调用
shutdown:取消激活,清理和关闭所有管理节点- 调用
destroyBondTimer、shutdownAllNodes、destroyLifecycleServiceClients
- 调用
reset:重置所有管理节点- 调用
changeStateForAllNodes,修改节点状态TRANSITION_DEACTIVATE、TRANSITION_CLEANUP - 注意是逆序更改节点状态,跟激活相反
- 调用
pause:暂停所有管理节点- 调用
destroyBondTimer - 调用
changeStateForAllNodes,修改节点状态TRANSITION_DEACTIVATE
- 调用
resume:恢复所有管理节点- 调用
changeStateForAllNodes,修改节点状态TRANSITION_ACTIVATE - 调用
createBondTimer
- 调用
onRclPreshutdown:上下文关闭回调,调用destroyBondTimer,属性重置createLifecycleServiceClients:创建所有管理的节点的生命周期服务客户端shutdownAllNodes:关闭所有管理节点- 调用
changeStateForAllNodes,依次修改节点状态TRANSITION_DEACTIVATE、TRANSITION_CLEANUP、TRANSITION_UNCONFIGURED_SHUTDOWN
- 调用
destroyLifecycleServiceClients:销毁所有管理的节点的生命周期服务客户端,遍历节点,调用nav2_util::LifecycleServiceClient的reset方法createBondTimer:创建连接定时器,创建连接检测定时器,绑定checkBondConnectionscreateBondConnection:连接定时器,初始化bond::BonddestroyBondTimer:销毁连接定时器,调用定时器cancel和resetcheckBondConnections:支持检查连接的功能,如果出现无响应的情况,将关闭系统- 遍历管理节点,调用
nav2_util::LifecycleServiceClient的isBroken方法,如果有一个节点宕掉,调用reset关闭所有节点 - 如果配置了恢复,创建一个定时器,绑定
checkBondRespawnConnection
- 遍历管理节点,调用
checkBondRespawnConnection:支持检查键连接的功能,如果出现无响应的情况,将恢复系统- 调用
nav2_util::LifecycleServiceClient的get_state方法,查看存活的节点和管理的节点数 - 一致的话,调用
startup - 不一致,查看是否恢复超时,重置超时和定时器
- 调用
changeStateForNode:修改一个节点的状态- 调用
nav2_util::LifecycleServiceClient的change_state和get_state方法 - 如果是激活状态,调用
createBondConnection
- 调用
changeStateForAllNodes:一次性修改所有节点的状态- 遍历管理节点,依次调用
changeStateForNode hard_change参数,如果为True,如果一个节点失败了,跳过,否则为False,一个节点转变失败,就返回失败
- 遍历管理节点,依次调用
message:日志输出CreateActiveDiagnostic:生成活动状态的诊断信息registerRclPreshutdownCallback:注册上下文关闭回调,获取上下文,绑定onRclPreshutdown
- LifecycleManager:生命周期管理类
lifecycle_manager_client.hpp- LifecycleManagerClient:生命周期管理客户端,用来向
LifecycleManager发送请求控制导航模块的生命周期状态。 注意区分nav2_util::LifecycleServiceClientLifecycleManagerClient:构造函数- 实例化
节点名称/manage_nodes的nav2_util::ServiceClient客户端 - 实例化
节点名称/is_active的nav2_util::ServiceClient客户端
- 实例化
startup:启动,调用callServiceshutdown:关闭,调用callServicepause:暂停,调用callServiceresume:恢复,调用callServicereset:重置,调用callServiceis_active:生命周期管理服务是否激活状态,调用nav2_util::ServiceClient的invokecallService:调用startup、shutdown等等服务,调用nav2_util::ServiceClient的invoke
- LifecycleManagerClient:生命周期管理客户端,用来向
nav2_rviz_plugins
rviz插件工具包