{ description = "Robossembler Development Environments on Nix"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs?ref=master"; flake-utils.follows = "ros-flake/flake-utils"; ros-flake.url = "github:lopsided98/nix-ros-overlay?ref=develop"; gazebo = { url = "github:movefasta/gazebo-sim-overlay"; inputs.flake-utils.follows = "ros-flake/flake-utils"; inputs.nixpkgs.follows = "ros-flake/nixpkgs"; # Transitive inputs "not in registry" https://github.com/NixOS/nix/issues/5790 # inputs.nixgl.inputs.nixpkgs.follows = "ros-flake/nixpkgs"; # inputs.nixgl.inputs.flake-utils.follows = "ros-flake/flake-utils"; }; }; outputs = { self, nixpkgs, ros-flake, gazebo, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let # pkgs = nixpkgs.legacyPackages.${system}.extend overlay; ros = ros-flake.legacyPackages.${system}; # single source for Robossembler Framework packages rbsFrameworkSrc = pkgs.fetchgit { url = "https://gitlab.com/robossembler/framework"; hash = "sha256-K6vnCQn129TWiMEKe81eBx/1H6PaIriCnkHGRwL8fg0="; rev = "e8bb59124d56c5aee0180b4c7d5c7bfeec9cb1ea"; }; pkgs = import nixpkgs { inherit system; overlays = [ overlay gazebo.overlays.default ]; }; overlay = final: prev: { # -- PLACEHOLDER for overlay # freecad = prev.freecad.overrideAttrs # (old: { cmakeFlags = old.cmakeFlags ++ [ "-DBUILD_GUI=OFF" ]; }); # cmakeFlag -BUILD_GUI=OFF for build without gui pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [ ( python-final: python-prev: { iopath = python-prev.iopath.overridePythonAttrs (oldAttrs: { version = "unstable"; src = pkgs.fetchFromGitHub { owner = "facebookresearch"; repo = "iopath"; rev = "9dcb63a46447556460fdb65c21aa6d094a7a788c"; hash = "sha256-X1LTOfbIAMy6gToNYS0JpeJpHi0jHPsEjrnCq2c9U0E="; }; }); } ) ]; }; # overrided packages and attributes for nix-ros-overlay humble-overrided = ros.humble.overrideScope (final: prev: { # remove after update github:lopsided98/nixpkgs/nix-ros for https://github.com/NixOS/nixpkgs/pull/224099 behaviortree-cpp-v3 = prev.behaviortree-cpp-v3.overrideAttrs (old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.zeromq ]; }); moveit-core = prev.moveit-core.overrideAttrs (old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ prev.tf2-kdl ]; }); moveit-kinematics = prev.moveit-kinematics.overrideAttrs (old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ final.moveit-ros-planning ]; }); }); # robossembler custom packages; defined here for share between devShells and packages cg_preferences = pkgs.fetchgit { url = "https://gitflic.ru/project/brothermechanic/cg_preferences.git"; sha256 = "sha256-/mNNjvrhIxSZVv1/LSJ7+c/dXH3E0Orh5Zr0oVPLquY="; }; rs_logo = pkgs.fetchgit { url = "https://gitlab.com/robossembler/logo.git"; rev = "0a0235cd154a59b711e87456206ccd7ba69a7e4e"; sha256 = "sha256-/QsgKdtDHNymsTEmhIzSrOKNUqqkXl8coy+5LwIEkas="; fetchLFS = true; }; blender' = pkgs.blender.override { cudaSupport = true; spaceNavSupport = false; waylandSupport = false; }; blender = blender'.overrideAttrs (old: { optix = pkgs.fetchzip { # url taken from the archlinux blender PKGBUILD url = "https://developer.download.nvidia.com/redist/optix/v7.4/OptiX-7.4.0-Include.zip"; sha256 = "sha256-ca08XetwaUYC9foeP5bff9kcDfuFgEzopvjspn2s8RY="; }; patches = old.patches ++ [ "${cg_preferences}/patches/cg-defaults.patch" ]; buildInputs = old.buildInputs ++ [ pkgs.imath pkgs.git ]; postPatch = old.postPatch + '' cp ${cg_preferences}/share/00_cg_preferences_service.py scripts/startup/ cp ${cg_preferences}/share/startup.blend release/datafiles/ cp ${rs_logo}/raster/robossembler_1024x512_roboty-rossii.png release/datafiles/splash.png ''; env.NIX_CFLAGS_COMPILE = old.env.NIX_CFLAGS_COMPILE + " -I${pkgs.imath}/include/Imath"; postInstall = old.postInstall + '' cp -r ${cg_preferences}/cg_preferences $out/share/blender/${ pkgs.lib.versions.majorMinor pkgs.blender.version }/scripts/addons/ ''; }); bpy = blender.overrideAttrs (old: { pname = "bpy"; src = pkgs.fetchurl { url = "https://download.blender.org/source/${old.pname}-${old.version}.tar.xz"; hash = "sha256-3AAtguPDQMk4VcZoRzDQGAG2aaKbHMa3XuuZC6aecj8="; }; cmakeFlags = old.cmakeFlags ++ [ "-DWITH_PYTHON_INSTALL=OFF" "-DWITH_AUDASPACE=OFF" "-DWITH_PYTHON_MODULE=ON" "-DWITH_MEM_JEMALLOC=OFF" "-DWITH_INSTALL_PORTABLE=ON" ]; postInstall = '' mkdir -p $out/nix-support mkdir -p $out/lib/python${pkgs.python3.pythonVersion}/site-packages ln -s $out/bpy $out/lib/python${pkgs.python3.pythonVersion}/site-packages/bpy echo ${pkgs.python3} >> $out/nix-support/propagated-build-inputs ''; }); bpy-wheel = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/bpy-wheel { }; pysdf = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/pysdf { }; pytorch3d = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/pytorch3d { }; mayo = pkgs.libsForQt5.callPackage ./pkgs/misc/mayo { }; fstl = pkgs.libsForQt5.callPackage ./pkgs/misc/fstl { }; open3d = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/open3d { }; unified-planning = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/unified-planning { }; blenderproc = pkgs.python3Packages.callPackage ./blenderproc.nix { }; test-script = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/test-script { }; webdataset = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/webdataset { }; ansitable = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/ansitable { }; megapose6d = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/megapose6d { inherit webdataset; }; spatialmath = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/spatialmath { inherit ansitable; }; rcg-pipeline = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/rcg-pipeline { bpy = bpy-lib; inherit rbsFrameworkSrc; }; rbs-workbench = pkgs.python3Packages.callPackage ./pkgs/development/python-modules/freecad.robossembler { inherit freecad-lib; inherit rbsFrameworkSrc; }; freecad-lib = pkgs.python3Packages.toPythonModule (pkgs.callPackage ./pkgs/misc/freecad-lib { }); bpy-lib = pkgs.python3Packages.toPythonModule bpy; cad-gen = let cad_export_script = pkgs.writers.writePython3 "cad_export_script.py" { libraries = [ rbs-workbench ]; } '' import FreeCAD as App import freecad.robossembler.utils.freecad_exporters as rbs import sys path = sys.argv[4] print(path) doc = App.openDocument(path) rbs.publish_project_database(doc) App.closeDocument(doc.Name) ''; in pkgs.writeShellScriptBin "cad-gen" '' export PYTHONPATH="${rbs-workbench}/${pkgs.python3.sitePackages}" ${pkgs.freecad}/bin/freecadcmd ${cad_export_script} -- --pass $1 ''; cg-gen = pkgs.writers.writePython3Bin "cg-gen" { libraries = [ rcg-pipeline ]; } '' from rcg_pipeline import rcg_full_pipeline import sys rcg_full_pipeline(sys.argv[1]) ''; in { inherit pkgs; rlib = import ./. { inherit (pkgs.stdenv) mkDerivation; inherit (pkgs) lib; inherit mayo; inherit (pkgs.libsForQt5) wrapQtAppsHook; }; packages = { inherit unified-planning test-script cad-gen cg-gen blender bpy; }; devShells.ci = pkgs.mkShell { buildInputs = [ pkgs.jq ]; }; devShells.gazebo = gazebo.devShells.${system}.default; devShells.ros = pkgs.mkShell { buildInputs = (with humble-overrided; [ ros2run rmw-fastrtps-dynamic-cpp urdf ament-pep257 ament-lint-auto xacro ament-cmake rclcpp-action tf2 action-msgs ament-copyright pythonPackages.pytest rosidl-default-generators behaviortree-cpp-v3 geometry-msgs rosidl-default-runtime rclpy std-msgs ament-lint-common ament-flake8 tf2-ros rclcpp moveit-core moveit-msgs moveit-ros-planning moveit-ros-planning-interface gazebo-ros2-control plansys2-bringup image-transport cv-bridge example-interfaces ]) ++ (with pkgs; [ nlohmann_json glog lua5_3_compat gazebo_sim ]); RMW_IMPLEMENTATION = "rmw_fastrtps_dynamic_cpp"; }; devShells.all = pkgs.mkShell { packages = [ blender fstl mayo ]; }; devShells.perception = let rbs-packages = p: with p; [ torch torchvision torchaudio detectron2 ]; in pkgs.mkShell { packages = [ (pkgs.python3.withPackages rbs-packages) ]; }; devShells.default = let my-python-packages = p: with p; [ unified-planning pybullet scipy spatialmath rcg-pipeline rbs-workbench ledger ]; in pkgs.mkShell { packages = with pkgs; [ freecad mayo bashInteractive ] ++ [ (pkgs.python3.withPackages my-python-packages) ]; buildInputs = [ ]; # Run when the shell is started up shellHook = '' ${pkgs.python3}/bin/python --version ''; }; } ); nixConfig = { extra-substituters = [ "https://ros.cachix.org" "https://robossembler.cachix.org" ]; extra-trusted-public-keys = [ "ros.cachix.org-1:dSyZxI8geDCJrwgvCOHDoAfOm5sV1wCPjBkKL+38Rvo=" "robossembler.cachix.org-1:56jBJHroRQSGpZFkW8XMquuzQTjAF/XTo6MogmBM7SQ=" ]; }; }