chore: 框架科学优化前的完整基线

在开始'设备契约层 + 目录重构 + 通止规装配'改造之前,先钉住当前可运行状态,
使后续任何删除/重构都可回退。

本基线包含:
- 现有 ROS 2 工作区全部源码(arm_application / arm_control / arm_bringup 等)
- 官方 flexiv_ros2 栈(含 flexiv_hardware / flexiv_controllers 等符号链接)
- 设备契约层 src/arm_interfaces(新增,46 项单测通过)
- devices/ 设备选型与品牌清单(新增)
- scripts/gen_site_example.py 与由它生成的 config/site.example.yaml

按 .gitignore 排除:build/ / install/ / log/ / config/site.yaml / 模型权重二进制。
This commit is contained in:
arm_dev
2026-09-23 10:53:06 +08:00
commit 6edb8d39ab
635 changed files with 1165230 additions and 0 deletions
@@ -0,0 +1,99 @@
import os
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.conditions import IfCondition
from launch.substitutions import Command, LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValue
from launch_ros.substitutions import FindPackageShare
# Site robot. Official flexiv_description keeps the hyphen in the SN prefix.
SITE_ROBOT_SN = os.environ.get('SITE_ROBOT_SN', 'Rizon4-063989')
SITE_JOINT_PREFIX = os.environ.get('SITE_JOINT_PREFIX', f'{SITE_ROBOT_SN}_')
SITE_NAMED_POSES = os.environ.get('SITE_NAMED_POSES_FILE', '').strip()
def generate_launch_description():
use_rviz = LaunchConfiguration('use_rviz')
robot_sn = LaunchConfiguration('robot_sn')
rizon_type = LaunchConfiguration('rizon_type')
load_gripper = LaunchConfiguration('load_gripper')
urdf_path = PathJoinSubstitution(
[FindPackageShare('arm_description'), 'urdf', 'arm.urdf.xacro']
)
named_poses = SITE_NAMED_POSES if SITE_NAMED_POSES and os.path.isfile(SITE_NAMED_POSES) else None
if not named_poses:
named_poses = PathJoinSubstitution(
[FindPackageShare('arm_control'), 'config', 'named_poses.yaml']
)
rviz_config = PathJoinSubstitution(
[FindPackageShare('flexiv_description'), 'rviz', 'view_rizon.rviz']
)
robot_description = ParameterValue(
Command([
'xacro ', urdf_path,
' robot_sn:=', robot_sn,
' rizon_type:=', rizon_type,
' load_gripper:=', load_gripper,
' use_fake_hardware:=true',
' ros2_control:=false',
]),
value_type=str,
)
return LaunchDescription([
DeclareLaunchArgument('use_rviz', default_value='true'),
DeclareLaunchArgument(
'robot_sn',
default_value=SITE_ROBOT_SN,
description='Site SN; joints become {SN}_joint1..joint7 (hyphen kept)',
),
DeclareLaunchArgument('rizon_type', default_value='Rizon4'),
DeclareLaunchArgument(
'load_gripper',
default_value='false',
description='Site has no gripper yet',
),
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': robot_description}],
output='screen',
),
Node(
package='arm_control',
executable='mock_arm_driver',
name='mock_arm_driver',
parameters=[{'joint_prefix': SITE_JOINT_PREFIX}],
output='screen',
),
Node(
package='arm_control',
executable='arm_status_node',
name='arm_status_node',
parameters=[{
'ee_frame': f'{SITE_JOINT_PREFIX}tcp',
'base_frame': f'{SITE_JOINT_PREFIX}base_link',
}],
output='screen',
),
Node(
package='arm_control',
executable='named_pose_server',
name='named_pose_server',
parameters=[named_poses, {'joint_prefix': SITE_JOINT_PREFIX}],
output='screen',
),
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_config],
condition=IfCondition(use_rviz),
output='screen',
),
])