2025-06-16 00:31:26 +03:00
|
|
|
from launch import LaunchDescription
|
|
|
|
from launch.actions import DeclareLaunchArgument, RegisterEventHandler, OpaqueFunction
|
|
|
|
from launch.conditions import IfCondition
|
|
|
|
from launch.event_handlers import OnProcessExit
|
|
|
|
from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution
|
|
|
|
|
|
|
|
from launch_ros.actions import Node, node
|
|
|
|
from launch_ros.substitutions import FindPackageShare
|
|
|
|
|
|
|
|
|
|
|
|
def launch_setup(context, *args, **kwargs):
|
|
|
|
# Initialize Arguments
|
|
|
|
robot_controller = LaunchConfiguration("robot_controller")
|
|
|
|
gui = LaunchConfiguration("gui")
|
|
|
|
filepath = PathJoinSubstitution(
|
|
|
|
[
|
|
|
|
FindPackageShare("rbs_servo_test"),
|
|
|
|
"urdf",
|
|
|
|
"simple_robot.urdf"
|
|
|
|
]
|
|
|
|
).perform(context)
|
|
|
|
|
|
|
|
with open(filepath, "r") as file:
|
|
|
|
robot_description_content = file.read()
|
|
|
|
|
|
|
|
robot_description = {"robot_description": robot_description_content}
|
|
|
|
|
|
|
|
robot_controllers = PathJoinSubstitution(
|
|
|
|
[
|
|
|
|
FindPackageShare("rbs_servo_test"),
|
|
|
|
"config",
|
|
|
|
"ros2_controllers.yaml",
|
|
|
|
]
|
|
|
|
)
|
|
|
|
rviz_config_file = PathJoinSubstitution(
|
|
|
|
[FindPackageShare("rbs_servo_test"), "config", "driver.rviz"]
|
|
|
|
)
|
|
|
|
|
|
|
|
control_node = Node(
|
|
|
|
package="controller_manager",
|
|
|
|
# prefix=['gdbserver localhost:1234'],
|
|
|
|
executable="ros2_control_node",
|
|
|
|
parameters=[robot_description, robot_controllers],
|
|
|
|
output="both",
|
|
|
|
)
|
|
|
|
robot_state_pub_node = Node(
|
|
|
|
package="robot_state_publisher",
|
|
|
|
executable="robot_state_publisher",
|
|
|
|
output="both",
|
|
|
|
parameters=[robot_description],
|
|
|
|
)
|
|
|
|
rviz_node = Node(
|
|
|
|
package="rviz2",
|
|
|
|
executable="rviz2",
|
|
|
|
name="rviz2",
|
|
|
|
output="log",
|
|
|
|
# arguments=["-d", rviz_config_file],
|
|
|
|
condition=IfCondition(gui),
|
|
|
|
)
|
|
|
|
|
|
|
|
joint_state_broadcaster_spawner = Node(
|
|
|
|
package="controller_manager",
|
|
|
|
executable="spawner",
|
|
|
|
arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"],
|
|
|
|
)
|
|
|
|
|
|
|
|
robot_controller_spawner = Node(
|
|
|
|
package="controller_manager",
|
|
|
|
executable="spawner",
|
|
|
|
arguments=[robot_controller, "--controller-manager", "/controller_manager"],
|
|
|
|
)
|
|
|
|
|
|
|
|
# Delay rviz start after `joint_state_broadcaster`
|
|
|
|
delay_rviz_after_joint_state_broadcaster_spawner = RegisterEventHandler(
|
|
|
|
event_handler=OnProcessExit(
|
|
|
|
target_action=joint_state_broadcaster_spawner,
|
|
|
|
on_exit=[rviz_node],
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
# Delay start of robot_controller after `joint_state_broadcaster`
|
|
|
|
delay_robot_controller_spawner_after_joint_state_broadcaster_spawner = RegisterEventHandler(
|
|
|
|
event_handler=OnProcessExit(
|
|
|
|
target_action=joint_state_broadcaster_spawner,
|
|
|
|
on_exit=[robot_controller_spawner],
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
nodes = [
|
|
|
|
control_node,
|
|
|
|
robot_state_pub_node,
|
|
|
|
joint_state_broadcaster_spawner,
|
|
|
|
delay_rviz_after_joint_state_broadcaster_spawner,
|
|
|
|
delay_robot_controller_spawner_after_joint_state_broadcaster_spawner,
|
|
|
|
]
|
|
|
|
return nodes
|
|
|
|
|
|
|
|
|
|
|
|
def generate_launch_description():
|
|
|
|
# Declare arguments
|
|
|
|
declared_arguments = []
|
|
|
|
declared_arguments.append(
|
|
|
|
DeclareLaunchArgument(
|
|
|
|
"gui",
|
|
|
|
default_value="false",
|
|
|
|
description="Start RViz2 automatically with this launch file.",
|
|
|
|
)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
declared_arguments.append(
|
|
|
|
DeclareLaunchArgument(
|
|
|
|
"robot_controller",
|
|
|
|
default_value="forward_position_controller",
|
|
|
|
description=".......",
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return LaunchDescription(declared_arguments + [OpaqueFunction(function=launch_setup)])
|