forked from YikaiFu-cart/acRealman_xr
Add configuration files and launch scripts for left and right arm RM75 teleoperation
This commit is contained in:
121
xr_rm_bringup/launch/arm_debug.launch.py
Normal file
121
xr_rm_bringup/launch/arm_debug.launch.py
Normal file
@ -0,0 +1,121 @@
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument, OpaqueFunction
|
||||
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
|
||||
from launch_ros.actions import Node
|
||||
from launch_ros.substitutions import FindPackageShare
|
||||
|
||||
|
||||
def _as_bool(value: str) -> bool:
|
||||
return value.strip().lower() in ("1", "true", "yes", "on")
|
||||
|
||||
|
||||
def _config_file(name: str) -> PathJoinSubstitution:
|
||||
return PathJoinSubstitution([
|
||||
FindPackageShare("xr_rm_bringup"),
|
||||
"config",
|
||||
name,
|
||||
])
|
||||
|
||||
|
||||
def _udp_receiver_node() -> Node:
|
||||
return Node(
|
||||
package="xr_rm_input",
|
||||
executable="udp_controller_receiver",
|
||||
name="udp_controller_receiver",
|
||||
output="screen",
|
||||
parameters=[{
|
||||
"udp_host": LaunchConfiguration("udp_host"),
|
||||
"udp_port": LaunchConfiguration("udp_port"),
|
||||
"left_topic": "/xr/left_controller",
|
||||
"right_topic": "/xr/right_controller",
|
||||
}],
|
||||
)
|
||||
|
||||
|
||||
def _single_arm_node(arm: str, use_mock: bool, move_to_initial_pose: bool) -> Node:
|
||||
config_name = "left_arm_rm75.yaml" if arm == "left" else "right_arm_rm75.yaml"
|
||||
robot_ip = LaunchConfiguration("left_robot_ip" if arm == "left" else "right_robot_ip")
|
||||
return Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="single_arm_velocity_teleop",
|
||||
output="screen",
|
||||
parameters=[
|
||||
_config_file(config_name),
|
||||
{
|
||||
"use_mock": use_mock,
|
||||
"robot_ip": robot_ip,
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": move_to_initial_pose,
|
||||
},
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def _dual_arm_nodes(use_mock: bool, move_to_initial_pose: bool) -> list[Node]:
|
||||
config_file = _config_file("dual_arm_rm75.yaml")
|
||||
return [
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="left_arm_teleop",
|
||||
output="screen",
|
||||
parameters=[
|
||||
config_file,
|
||||
{
|
||||
"use_mock": use_mock,
|
||||
"robot_ip": LaunchConfiguration("left_robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": move_to_initial_pose,
|
||||
},
|
||||
],
|
||||
),
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="right_arm_teleop",
|
||||
output="screen",
|
||||
parameters=[
|
||||
config_file,
|
||||
{
|
||||
"use_mock": use_mock,
|
||||
"robot_ip": LaunchConfiguration("right_robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": move_to_initial_pose,
|
||||
},
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def _launch_setup(context, *args, **kwargs):
|
||||
del args, kwargs
|
||||
arm = LaunchConfiguration("arm").perform(context).strip().lower()
|
||||
use_mock = _as_bool(LaunchConfiguration("use_mock").perform(context))
|
||||
move_to_initial_pose = _as_bool(
|
||||
LaunchConfiguration("move_to_initial_pose_on_connect").perform(context)
|
||||
)
|
||||
|
||||
if arm not in ("left", "right", "both"):
|
||||
raise ValueError("arm must be one of: left, right, both")
|
||||
|
||||
nodes = [_udp_receiver_node()]
|
||||
if arm == "both":
|
||||
nodes.extend(_dual_arm_nodes(use_mock, move_to_initial_pose))
|
||||
else:
|
||||
nodes.append(_single_arm_node(arm, use_mock, move_to_initial_pose))
|
||||
return nodes
|
||||
|
||||
|
||||
def generate_launch_description() -> LaunchDescription:
|
||||
return LaunchDescription([
|
||||
DeclareLaunchArgument("arm", default_value="right"),
|
||||
DeclareLaunchArgument("use_mock", default_value="true"),
|
||||
DeclareLaunchArgument("udp_host", default_value="0.0.0.0"),
|
||||
DeclareLaunchArgument("udp_port", default_value="15000"),
|
||||
DeclareLaunchArgument("left_robot_ip", default_value="192.168.192.18"),
|
||||
DeclareLaunchArgument("right_robot_ip", default_value="192.168.192.19"),
|
||||
DeclareLaunchArgument("robot_port", default_value="8080"),
|
||||
DeclareLaunchArgument("move_to_initial_pose_on_connect", default_value="false"),
|
||||
OpaqueFunction(function=_launch_setup),
|
||||
])
|
||||
@ -1,5 +1,6 @@
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument
|
||||
from launch.conditions import IfCondition
|
||||
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
|
||||
from launch_ros.actions import Node
|
||||
from launch_ros.substitutions import FindPackageShare
|
||||
@ -9,18 +10,23 @@ def generate_launch_description() -> LaunchDescription:
|
||||
config_file = PathJoinSubstitution([
|
||||
FindPackageShare("xr_rm_bringup"),
|
||||
"config",
|
||||
"dual_arm_rm75.yaml",
|
||||
LaunchConfiguration("robot_config"),
|
||||
])
|
||||
|
||||
return LaunchDescription([
|
||||
DeclareLaunchArgument("udp_host", default_value="0.0.0.0"),
|
||||
DeclareLaunchArgument("udp_port", default_value="15000"),
|
||||
DeclareLaunchArgument("robot_config", default_value="dual_arm_rm75.yaml"),
|
||||
DeclareLaunchArgument("run_udp", default_value="true"),
|
||||
DeclareLaunchArgument("run_left_arm", default_value="true"),
|
||||
DeclareLaunchArgument("run_right_arm", default_value="true"),
|
||||
# 接收 PICO/XR 侧 UDP 数据,并按左右手字段分发到对应手柄话题。
|
||||
Node(
|
||||
package="xr_rm_input",
|
||||
executable="udp_controller_receiver",
|
||||
name="udp_controller_receiver",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_udp")),
|
||||
parameters=[{
|
||||
"udp_host": LaunchConfiguration("udp_host"),
|
||||
"udp_port": LaunchConfiguration("udp_port"),
|
||||
@ -34,6 +40,7 @@ def generate_launch_description() -> LaunchDescription:
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="left_arm_teleop",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_left_arm")),
|
||||
parameters=[config_file, {"use_mock": True}],
|
||||
),
|
||||
# 右臂模拟节点:与左臂共用同一配置文件,但读取右手柄话题。
|
||||
@ -42,14 +49,7 @@ def generate_launch_description() -> LaunchDescription:
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="right_arm_teleop",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_right_arm")),
|
||||
parameters=[config_file, {"use_mock": True}],
|
||||
),
|
||||
# 右手扳机键到 OmniPicker 归一化力控指令的桥接,模拟阶段用于检查话题输出。
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="gripper_trigger_bridge",
|
||||
name="right_omnipicker_trigger_bridge",
|
||||
output="screen",
|
||||
parameters=[config_file],
|
||||
),
|
||||
])
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument
|
||||
from launch.conditions import IfCondition
|
||||
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
|
||||
from launch_ros.actions import Node
|
||||
from launch_ros.parameter_descriptions import ParameterValue
|
||||
from launch_ros.substitutions import FindPackageShare
|
||||
|
||||
|
||||
@ -19,11 +21,16 @@ def generate_launch_description() -> LaunchDescription:
|
||||
DeclareLaunchArgument("right_robot_ip", default_value="192.168.192.19"),
|
||||
DeclareLaunchArgument("robot_port", default_value="8080"),
|
||||
DeclareLaunchArgument("robot_config", default_value="dual_arm_rm75.yaml"),
|
||||
DeclareLaunchArgument("run_udp", default_value="true"),
|
||||
DeclareLaunchArgument("run_left_arm", default_value="true"),
|
||||
DeclareLaunchArgument("run_right_arm", default_value="true"),
|
||||
DeclareLaunchArgument("move_to_initial_pose_on_connect", default_value="false"),
|
||||
Node(
|
||||
package="xr_rm_input",
|
||||
executable="udp_controller_receiver",
|
||||
name="udp_controller_receiver",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_udp")),
|
||||
parameters=[{
|
||||
"udp_host": LaunchConfiguration("udp_host"),
|
||||
"udp_port": LaunchConfiguration("udp_port"),
|
||||
@ -36,12 +43,17 @@ def generate_launch_description() -> LaunchDescription:
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="left_arm_teleop",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_left_arm")),
|
||||
parameters=[
|
||||
config_file,
|
||||
{
|
||||
"use_mock": False,
|
||||
"robot_ip": LaunchConfiguration("left_robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": ParameterValue(
|
||||
LaunchConfiguration("move_to_initial_pose_on_connect"),
|
||||
value_type=bool,
|
||||
),
|
||||
},
|
||||
],
|
||||
),
|
||||
@ -50,20 +62,18 @@ def generate_launch_description() -> LaunchDescription:
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="right_arm_teleop",
|
||||
output="screen",
|
||||
condition=IfCondition(LaunchConfiguration("run_right_arm")),
|
||||
parameters=[
|
||||
config_file,
|
||||
{
|
||||
"use_mock": False,
|
||||
"robot_ip": LaunchConfiguration("right_robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": ParameterValue(
|
||||
LaunchConfiguration("move_to_initial_pose_on_connect"),
|
||||
value_type=bool,
|
||||
),
|
||||
},
|
||||
],
|
||||
),
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="gripper_trigger_bridge",
|
||||
name="right_omnipicker_trigger_bridge",
|
||||
output="screen",
|
||||
parameters=[config_file],
|
||||
),
|
||||
])
|
||||
|
||||
@ -1,36 +1,28 @@
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument
|
||||
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
|
||||
from launch.launch_description_sources import PythonLaunchDescriptionSource
|
||||
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
|
||||
from launch_ros.actions import Node
|
||||
from launch_ros.substitutions import FindPackageShare
|
||||
|
||||
|
||||
def generate_launch_description() -> LaunchDescription:
|
||||
config_file = PathJoinSubstitution([
|
||||
FindPackageShare("xr_rm_teleop"),
|
||||
"config",
|
||||
"single_arm.yaml",
|
||||
arm_debug_launch = PathJoinSubstitution([
|
||||
FindPackageShare("xr_rm_bringup"),
|
||||
"launch",
|
||||
"arm_debug.launch.py",
|
||||
])
|
||||
|
||||
return LaunchDescription([
|
||||
DeclareLaunchArgument("arm", default_value="right"),
|
||||
DeclareLaunchArgument("udp_host", default_value="0.0.0.0"),
|
||||
DeclareLaunchArgument("udp_port", default_value="15000"),
|
||||
Node(
|
||||
package="xr_rm_input",
|
||||
executable="udp_controller_receiver",
|
||||
name="udp_controller_receiver",
|
||||
output="screen",
|
||||
parameters=[{
|
||||
IncludeLaunchDescription(
|
||||
PythonLaunchDescriptionSource(arm_debug_launch),
|
||||
launch_arguments={
|
||||
"arm": LaunchConfiguration("arm"),
|
||||
"use_mock": "true",
|
||||
"udp_host": LaunchConfiguration("udp_host"),
|
||||
"udp_port": LaunchConfiguration("udp_port"),
|
||||
"topic": "/xr/right_controller",
|
||||
}],
|
||||
),
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="single_arm_velocity_teleop",
|
||||
output="screen",
|
||||
parameters=[config_file, {"use_mock": True}],
|
||||
}.items(),
|
||||
),
|
||||
])
|
||||
|
||||
@ -1,46 +1,37 @@
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument
|
||||
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
|
||||
from launch.launch_description_sources import PythonLaunchDescriptionSource
|
||||
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
|
||||
from launch_ros.actions import Node
|
||||
from launch_ros.substitutions import FindPackageShare
|
||||
|
||||
|
||||
def generate_launch_description() -> LaunchDescription:
|
||||
config_file = PathJoinSubstitution([
|
||||
arm_debug_launch = PathJoinSubstitution([
|
||||
FindPackageShare("xr_rm_bringup"),
|
||||
"config",
|
||||
LaunchConfiguration("robot_config"),
|
||||
"launch",
|
||||
"arm_debug.launch.py",
|
||||
])
|
||||
|
||||
return LaunchDescription([
|
||||
DeclareLaunchArgument("arm", default_value="right"),
|
||||
DeclareLaunchArgument("udp_host", default_value="0.0.0.0"),
|
||||
DeclareLaunchArgument("udp_port", default_value="15000"),
|
||||
DeclareLaunchArgument("left_robot_ip", default_value="192.168.192.18"),
|
||||
# 兼容旧命令:robot_ip 仍作为右臂 IP 覆盖入口。
|
||||
DeclareLaunchArgument("robot_ip", default_value="192.168.192.19"),
|
||||
DeclareLaunchArgument("robot_port", default_value="8080"),
|
||||
DeclareLaunchArgument("robot_config", default_value="single_arm_rm75.yaml"),
|
||||
Node(
|
||||
package="xr_rm_input",
|
||||
executable="udp_controller_receiver",
|
||||
name="udp_controller_receiver",
|
||||
output="screen",
|
||||
parameters=[{
|
||||
DeclareLaunchArgument("move_to_initial_pose_on_connect", default_value="false"),
|
||||
IncludeLaunchDescription(
|
||||
PythonLaunchDescriptionSource(arm_debug_launch),
|
||||
launch_arguments={
|
||||
"arm": LaunchConfiguration("arm"),
|
||||
"use_mock": "false",
|
||||
"udp_host": LaunchConfiguration("udp_host"),
|
||||
"udp_port": LaunchConfiguration("udp_port"),
|
||||
"topic": "/xr/right_controller",
|
||||
}],
|
||||
),
|
||||
Node(
|
||||
package="xr_rm_teleop",
|
||||
executable="single_arm_velocity_teleop",
|
||||
name="single_arm_velocity_teleop",
|
||||
output="screen",
|
||||
parameters=[
|
||||
config_file,
|
||||
{
|
||||
"use_mock": False,
|
||||
"robot_ip": LaunchConfiguration("robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
},
|
||||
],
|
||||
"left_robot_ip": LaunchConfiguration("left_robot_ip"),
|
||||
"right_robot_ip": LaunchConfiguration("robot_ip"),
|
||||
"robot_port": LaunchConfiguration("robot_port"),
|
||||
"move_to_initial_pose_on_connect": LaunchConfiguration("move_to_initial_pose_on_connect"),
|
||||
}.items(),
|
||||
),
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user