ROS2 humble .launch.py启动文件编写
.launch.py启动文件编写
- 启动节点
- 最终一个完整的模版
多个节点要启动的时候,ros2 run的效率太低,所以使用了launch来启动。如果我都是只用Python脚本写的代码去控制机器人,好像也不需要去运行功能包的节点,也就不需要launch了。
启动节点
.launch文件中的运行节点的基础写法
<launch>
<node pkg='xxx' type='xxx' name='xxx'>
<node pkg='xxx' type='xxx' name='xxx'>
</launch>
.launch.py也一样有这样的,终端中运行功能包是这样的:
ros2 run pkg_name executable
# 比如启动rviz2是ros2 run rviz2 rviz2
启动时包括功能包名和可执行文件的名字,这样.launch.py中的Node就是按照这种形式写了功能包的名和可执行文件的名就能运行节点了。
generate_launch_description()是固定写法,LaunchDescription返回的是节点
from launch_ros.actions import Node
def generate_launch_description():
robot_description_value=xxx
default_rviz_config_path=xxx
# 因为已经引入Node了,直接写actions_pkg1_node = Node()这样就行
actions_pkg1_node = launch_ros.actions.Node(
package='pkg1',
executable='xxx',
name='pkg1'
)
actions_robot_state_publisher = launch_ros.actions.Node(
package='robot_state_publisher',
executable='robot_state_publisher'
parameters=[{'robot_description':robot_description_value}],
name='robot_state_publisher'
# 相当于下面这条命令
# ros2 run robot_state_publisher robot_state_publisher --ros-args -p xx:=xxxvalue
)
actions_rviz_node = launch_ros.actions.Node(
package='rviz2',
executable='rviz2'
arguments=['-d', default_rviz_config_path]
name='rviz2'
# ros2 run rviz2 rviz2 -d xxx
)
return LaunchDescription([
actions_pkg1_node,
actions_pkg2_node,
actions_rviz2_node
])
最终一个完整的模版
from launch import LaunchDescription
from launch_ros.actions import Node
# 封装终端指令相关类
from launch.actions import ExecuteProcess
from launch.substitutions import FindExecutable
# 参数的声明与获取
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
# 文件包含相关
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
# 分组相关
from launch_ros.actions import PushRosNamespace
from launch.actions import GroupAction
# 事件相关
from launch.event_handlers import OnProcessStart, OnProcessExit
from launch.actions import ExecuteProcess, RegisterEventHandler, LogInfo
# 获取功能包下的shared目录路径
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
return launch.LaunchDescription([
])