from setuptools import find_packages, setup import os from glob import glob package_name = 'arm_application' def _existing(paths): """只保留真实存在的常规文件。 必需:colcon 的 ``build//`` 里放着指向源文件的符号链接, 源文件被挪走或删掉之后这些链接就断了。``glob`` / ``os.walk`` 仍会把它们 列出来,随后 copy 会报 "doesn't exist or not a regular file", **整个包构建失败**,而报错信息指向 build/ 下的一个幽灵文件,很难查。 这里统一过滤掉。 """ out = [] for p in paths: if os.path.isfile(p): # 会跟随符号链接,断链返回 False out.append(p) return out def _data_files(): entries = [ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), (os.path.join('share', package_name, 'launch'), _existing(glob('launch/*.py'))), (os.path.join('share', package_name, 'trajectories'), _existing(glob('trajectories/*'))), ] for root, _dirs, files in os.walk('config'): srcs = _existing([os.path.join(root, name) for name in files]) if not srcs: continue dest = os.path.join('share', package_name, root) entries.append((dest, srcs)) return entries setup( name=package_name, version='0.1.0', packages=find_packages(exclude=['test']), data_files=_data_files(), install_requires=['setuptools'], zip_safe=True, maintainer='arm_dev', maintainer_email='dev@example.com', description='High-level arm application nodes.', license='Apache-2.0', entry_points={ 'console_scripts': [ # Bringup helpers 'demo_named_poses = arm_application.demo_named_poses:main', 'move_to_pose_client = arm_application.move_to_pose_client:main', 'run_joint_trajectory = arm_application.run_joint_trajectory:main', 'goto_ee_plane = arm_application.goto_ee_plane:main', # 相机 'realsense_color_pub = arm_application.realsense_color_pub:main', 'realsense_view = arm_application.realsense_view:main', # 手眼标定 'handeye_teach = arm_application.handeye_teach:main', 'handeye_waypoints = arm_application.handeye_waypoints:main', 'handeye_calibrate = arm_application.handeye_calibrate:main', # 视觉伺服(当前主链路) 'perception_node = arm_application.perception_node:main', 'servo_node = arm_application.servo_node:main', # 夹爪 'dh_pgea = arm_application.dh_pgea_node:main', 'dh_pgea_cli = arm_application.dh_pgea:main', 'dual_gripper = arm_application.dual_gripper_node:main', 'dual_gripper_cli = arm_application.dual_gripper_cli:main', # 入孔检测(只检测,不做插入动作) 'hole_detect = arm_application.hole_detect_node:main', # 第二阶段:一次性孔定位(k1/k2)+ 对规 'stage2_locate = arm_application.stage2_locate_node:main', # 第三阶段:柔顺找孔(Orisys 触觉螺旋 + 插入) 'stage3_search = arm_application.stage3_search_node:main', # 三段式装配流水线(跟踪 → 定位 → 找孔,单进程) 'assembly_pipeline = arm_application.pipeline_node:main', # 通止规装配(看板 S00–S11,含自检/换孔/掉件重放) 'gauge_assembly = arm_application.gauge_assembly_node:main', 'tactile = arm_application.tactile_node:main', 'tactile_cli = arm_application.tactile_cli:main', ], }, )