开发工具CLI包管理器任务调度【免费下载链接】pixiPowerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem.项目地址https://gitcode.com/gh_mirrors/pi/pixi点击查看免费下载导读examples/turtlesim是 pixi 官方仓库中一个极具代表性的 ROS 示例仅凭一份pixi.toml就同时托管了 ROS 2 Humble 与 ROS 1 Noetic 两套 turtlesim 环境无需在系统上安装任何 ROS也无需 Docker 或虚拟机。本文以该示例为骨架完整还原两个 ROS 版本的启动、键盘遥控teleop、RViz 可视化全流程并深入pixi.toml的 feature / environment / task 声明语法、仓库内的可视化 Python 节点源码以及 pixi 命令行的底层行为帮助你掌握“用 pixi 在任意平台复现 ROS 工作区”的标准姿势。示例概览一份 manifest两个 ROS 发行版打开 examples/turtlesim/pixi.toml 可以看到这个示例把“多发行版 ROS 共存”拆成了三个层次[workspace]定义工作区元信息、默认 channel 与目标平台[feature.humble]与[feature.noetic]两个互不干扰的特性组分别声明各自的 channel、依赖和任务[environments]把特性映射成两个可运行的环境——default与noetic。其中default环境只包含humble特性而noetic环境通过no-default-feature true明确排除默认特性、只装载noetic。这样设计的结果是你可以在同一台机器、同一个目录下按需激活 ROS 2 或 ROS 1两者互不污染。这份 manifest 声明支持linux-64、win-64、osx-64、osx-arm64四个平台examples/turtlesim/pixi.toml这正是 pixi 之于传统 ROS 安装方式的差异所在——RoboStack 把 ROS 生态重新打包为跨平台 conda 包因此同一份pixi.toml在 Linux、macOS、Windows 上都能复现无需系统级安装参见 docs/robotics.md 对 pixi RoboStack 模式的说明。ROS 2 Humble 示例两个终端跑通 turtlesimREADME 的第一步操作极其简洁开两个终端分别执行pixi run start和pixi run teleop当存在多个环境时pixi run会提示你为所有humble相关任务选择default环境。这两个命令并不是魔法——它们来自[feature.humble.tasks]的任务定义[feature.humble.tasks] rviz ros2 run rviz2 rviz2 start ros2 run turtlesim turtlesim_node teleop ros2 run turtlesim turtle_teleop_key viz python turtle_marker_viz_ROS2.py即start实际执行ros2 run turtlesim turtlesim_node拉起乌龟仿真节点teleop实际执行ros2 run turtlesim turtle_teleop_key用方向键遥控乌龟。从源码层面看pixi run的任务解析位于 crates/pixi_cli/src/run.rs该命令会在运行前自动更新 lock 文件并按需安装环境然后借助deno_task_shell在激活后的环境中执行任务任务执行前还会做环境可运行性检查verify_current_platform_can_run_environment见 crates/pixi_cli/src/run.rs并在环境缺失或不匹配时给出提示。用pixi shell进入交互式环境除了预定义任务你还可以直接进入激活后的 shell手动执行环境中的任意命令pixi shell ros2 topic echo /turtle1/cmd_velpixi shell与pixi run互补前者给你一个持久的交互终端方便反复实验后者适合封装好的、可重复的单条命令。注意ros2 topic echo这类命令必须配合正在运行的turtlesim_node才有输出因此建议在另一个终端先启动pixi run start。RViz 可视化把乌龟画成箭头标记启动方式在另外两个终端分别运行pixi run rvizpixi run vizrviz任务启动 RViz2 图形界面viz任务运行仓库自带的 Python 脚本 examples/turtlesim/turtle_marker_viz_ROS2.py把乌龟的实时位姿发布成 RViz 可显示的 Arrow 标记。随后在 RViz 中添加/turtle_marker话题的 Marker 显示再回到teleop终端遥控乌龟就能看到箭头在 RViz 中同步移动。可视化脚本原理ROS 2 版turtle_marker_viz_ROS2.py 是一个标准的 rclpy 节点核心逻辑只有三步订阅位姿create_subscription(Pose, /turtle1/pose, ...)监听乌龟实时位姿L17-L18构造 Marker在pose_callback中构建visualization_msgs/Marker类型设为Marker.ARROW位置取turtle_pose.x - 5.5turtlesim 世界是 0~11 的网格减 5.5 把坐标平移到以原点为中心朝向用四元数表达z sin(theta/2)、w cos(theta/2)L32-L40发布话题把 Marker 发布到/turtle_markerlifetime设为 0 表示永久保留L53-L57。# 关键片段位姿 → 箭头标记 marker.pose.position.x turtle_pose.x - 5.5 marker.pose.position.y turtle_pose.y - 5.5 marker.pose.orientation.z sin(turtle_pose.theta / 2.0) marker.pose.orientation.w cos(turtle_pose.theta / 2.0) marker.scale.x 1.0 # 箭头长度 marker.scale.y 0.2 # 箭头宽度 marker.scale.z 0.2 # 箭头高度 marker.color.g 1.0 # 绿色、不透明主函数里rclpy.init→ 创建节点 →rclpy.spin让回调持续运行L60-L69这是 ROS 2 Python 节点的标准生命周期。这一脚本不依赖任何自建包ros-humble-desktop已自带visualization_msgs与turtlesim消息因此开箱即用。ROS 1 Noetic 示例三个终端 -e noeticROS 1 与 ROS 2 最大的差异在于需要先启动roscore。因此 Noetic 示例需要三个终端且每条命令都要通过-e noetic或--environment noetic显式指定环境# 终端 1启动 roscore pixi run -e noetic core # 终端 2启动 turtlesim pixi run -e noetic start # 终端 3键盘遥控 pixi run -e noetic teleop如果你愿意也可以去掉-e noetic让 pixi 在运行每个noetic任务时交互式地询问并选择noetic环境——README 明确建议“为所有noetic示例选择noetic环境”。-e/--environment参数在 crates/pixi_cli/src/run.rs 中定义用于指定任务运行在哪个环境。对应地[feature.noetic.tasks]声明了 ROS 1 风格的任务[feature.noetic.tasks] core roscore rviz rosrun rviz rviz start rosrun turtlesim turtlesim_node teleop rosrun turtlesim turtle_teleop_key viz python turtle_marker_viz_ROS1.py注意任务名相同、命令不同Noetic 的rviz是rosrun rviz rvizROS 1 版 RVizstart是rosrun turtlesim turtlesim_node。由于两个特性组各自定义任务互不冲突——这是“feature 隔离 环境映射”带来的直接收益。同样地Noetic 也支持交互式 shellpixi shell -e noetic rostopic echo /turtle1/cmd_velpixi shell同样接受-e指定环境进入激活后的 ROS 1 环境可用rostopic echo直接查看乌龟的速度指令话题。RViz 可视化ROS 1 版与 Humble 对称在两个更多终端运行pixi run -e noetic rviz pixi run -e noetic viz然后在 RViz 的 Displays 面板中添加乌龟的可视化标记。对应脚本 examples/turtlesim/turtle_marker_viz_ROS1.py 结构与 ROS 2 版几乎一致只是换成了 rospy 风格全局发布器/订阅器rospy.Publisher(/turtle_marker, Marker, queue_size10)与rospy.Subscriber(/turtle1/pose, Pose, pose_callback)L52-L56回调中同样把Pose转成Marker.ARROW坐标减 5.5、朝向用四元数、绿色不透明rospy.spin()维持节点运行L58-L59。对比两个脚本可以发现除了 ROS APIrclpyvsrospy、create_subscriptionvsSubscriber之外Marker 构造逻辑完全同构——这正是“同一份示例在 ROS 1 / ROS 2 下各写一份”的典型教学形态。为什么这个示例能“零安装跑 ROS”依赖与 channel 来自 RoboStack示例没有在系统层面安装任何东西所有依赖都来自 conda 生态[feature.humble] channels [ https://prefix.dev/conda-forge, https://prefix.dev/robostack-humble, ] [feature.humble.dependencies] ros-humble-desktop * ros-humble-turtlesim *robostack-humble是 RoboStack 为 ROS 2 Humble 重新打包的 conda channelconda-forge提供其原生依赖Qt、Python、编译器运行时等两者叠加构成完整的 ROS 2 环境参见 docs/robotics.md 对“conda-forge RoboStack”与“Ubuntu packages.ros.org”同构关系的解释。依赖版本写*表示不锁上界由 examples/turtlesim/pixi.lock 负责把每个包含全部传递依赖如ros-humble-desktop背后的aiohttp、cmake、ffmpeg等数百个包钉死到精确版本。环境映射default与noetic[environments] default [humble] noetic { features [noetic], no-default-feature true }这里的语法要点是default [humble]默认环境装载humble特性noetic { features [noetic], no-default-feature true }noetic环境只装载noetic特性并且排除默认特性。如果没有no-default-feature truenoetic环境会同时包含humble造成两套 ROS 同时进环境。no-default-feature字段在 pixi manifest 解析器中是真实存在的配置项crates/pixi_manifest/src/toml/environment.rs中通过th.optional(no-default-feature)解析并存入no_default_feature: boolL160、L229其语义即“该环境是否跳过工作区默认特性”。从零复刻这个示例如果你想从空目录还原同样的效果不需要复制整个仓库只需三步# 1. 初始化一个带 RoboStack channel 的 pixi 工作区 pixi init my_turtlesim -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-humble # 2. 添加依赖 pixi add ros-humble-desktop ros-humble-turtlesim # 3. 直接跑首次会先解析依赖并安装环境 pixi run ros2 run turtlesim turtlesim_node这与 docs/tutorials/ros2.md 的官方教程入口一致pixi init生成 manifestpixi add把 ROS 包写入依赖pixi run一键执行。若需任务化再用pixi task add start ros2 run turtlesim turtlesim_node之类的命令把长命令收进 manifest。对于 ROS 1只需把 channel 换成robostack-noetic、包换成ros-noetic-desktop与ros-noetic-turtlesim。常见问题与注意事项首次运行耗时较长pixi run会自动解析并安装整个 ROS 环境Humble desktop 及其传递依赖可达数百个包耗时取决于网络后续运行因为有了 examples/turtlesim/pixi.lock 与本地缓存会显著加快。-e noetic不能省Noetic 环境与默认环境并存时务必用-e noetic明确目标否则会落入默认Humble环境导致roscore等 ROS 1 命令不存在。话题与坐标系Marker 的frame_id是mapturtlesim 的位姿坐标范围是 0~11脚本用-5.5做了中心化平移若在 RViz 中看不到标记请确认viz与rviz都已启动、并在 Displays 中添加了/turtle_marker话题的 Marker 显示。ROS 1 / ROS 2 不可混用两个环境彼此隔离rostopic属于 ROS 1、ros2 topic属于 ROS 2必须分别在noetic与default环境中使用。小结examples/turtlesim用最少的代码量演示了 pixi 在机器人领域的三个核心能力feature 隔离Humble / Noetic 共存不冲突、环境映射no-default-feature精确控制环境组成、任务封装start/teleop/rviz/viz一键直达。配合 RoboStack channel 与 lock 文件整个示例在 Linux、macOS、Windows 上都能以完全相同的 manifest 复现。对于想要“无系统 ROS 安装、可复现、跨平台”的机器人开发者这是一个可以直接照搬的最小模板。赞分享开发工具CLI包管理器任务调度【免费下载链接】pixiPowerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem.项目地址https://gitcode.com/gh_mirrors/pi/pixi点击查看免费下载相关推荐使用 Pixi 将 ROS 包构建为 conda 包pixi-build-ros 后端实战指南使用 Pixi 将 ROS 包构建为 conda 包pixi build ros 后端实战指南 本文讲解如何在 Pixi基于 Conda 生态的 Rust开发工具CLI包管理器任务调度深入解析 Anomalib 中的 DFM 模型基于深度特征概率建模的异常检测与对抗样本检测深入解析 Anomalib 中的 DFM 模型基于深度特征概率建模的异常检测与对抗样本检测 导读 本文围绕 Anomalib https://link.git开发工具CLI包管理器任务调度上一篇ReadyToRun 平台原生封装Mach-O设计解析.NET 11 如何让 R2R 跨出 PE 格式下一篇ESP-IDF v5.0 组件移除与废弃迁移指南从 ESP Component Registry 安装与管理组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考