diff --git a/1.10.1-1.tar.gz b/1.10.1-1.tar.gz
deleted file mode 100644
index 1ca1d66..0000000
Binary files a/1.10.1-1.tar.gz and /dev/null differ
diff --git a/_multibuild b/_multibuild
new file mode 100644
index 0000000..0dbaefe
--- /dev/null
+++ b/_multibuild
@@ -0,0 +1,5 @@
+
+ nodelet
+ nodelet-core
+ nodelet-topic-tools
+
diff --git a/nodelet-core.spec b/nodelet-core.spec
new file mode 100644
index 0000000..7ff14a5
--- /dev/null
+++ b/nodelet-core.spec
@@ -0,0 +1,101 @@
+%bcond_without tests
+%bcond_without weak_deps
+
+%global debug_package %{nil}
+%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
+%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
+%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$
+
+%define RosPkgName nodelet-core
+%define with_tests 0
+
+Name: ros-%{ros_distro}-%{RosPkgName}
+Version: 1.10.2
+Release: 1%{?dist}%{?release_suffix}
+Summary: Nodelet Core Metapackage
+
+Url: http://www.ros.org/wiki/nodelet_core
+License: BSD
+Source0: %{name}_%{version}.orig.tar.gz
+
+Requires: ros-%{ros_distro}-nodelet
+Requires: ros-%{ros_distro}-nodelet-topic-tools
+
+BuildRequires: ros-%{ros_distro}-catkin
+
+%if 0%{?with_tests}
+%endif
+
+Provides: %{name}-devel = %{version}-%{release}
+Provides: %{name}-doc = %{version}-%{release}
+Provides: %{name}-runtime = %{version}-%{release}
+
+%description
+Nodelet Core Metapackage
+
+%prep
+%autosetup -p1
+
+%build
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+export ROS_DISTRO=%{ros_distro}
+export ROS_PYTHON_VERSION=%{python3_version}
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+mkdir -p .obj-%{_target_platform} && cd .obj-%{_target_platform}
+%cmake3 \
+ -UINCLUDE_INSTALL_DIR \
+ -ULIB_INSTALL_DIR \
+ -USYSCONF_INSTALL_DIR \
+ -USHARE_INSTALL_PREFIX \
+ -ULIB_SUFFIX \
+ -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
+ -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_INSTALL_LIBDIR="/opt/ros/%{ros_distro}/lib" \
+ -DSETUPTOOLS_DEB_LAYOUT=OFF \
+%if !0%{?with_tests}
+ -DBUILD_TESTING=OFF \
+%endif
+ ..
+
+%make_build
+
+%install
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+%make_install -C .obj-%{_target_platform}
+
+%if 0%{?with_tests}
+%check
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# Look for a Makefile target with a name indicating that it runs tests
+TEST_TARGET=$(%__make -qp -C .obj-%{_target_platform} | sed "s/^\(test\|check\):.*/\\1/;t f;d;:f;q0")
+if [ -n "$TEST_TARGET" ]; then
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+CTEST_OUTPUT_ON_FAILURE=1 \
+ %make_build -C .obj-%{_target_platform} $TEST_TARGET || echo "RPM TESTS FAILED"
+else echo "RPM TESTS SKIPPED"; fi
+%endif
+
+%files
+/opt/ros/%{ros_distro}
+
+%changelog
+* 三 1月 10 2024 Michael Carroll michael@openrobotics.org - 1.10.2-1
+- Autogenerated by ros-porting-tools
diff --git a/nodelet-topic-tools.spec b/nodelet-topic-tools.spec
new file mode 100644
index 0000000..6272b61
--- /dev/null
+++ b/nodelet-topic-tools.spec
@@ -0,0 +1,109 @@
+%bcond_without tests
+%bcond_without weak_deps
+
+%global debug_package %{nil}
+%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
+%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
+%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$
+
+%define RosPkgName nodelet-topic-tools
+%define with_tests 0
+
+Name: ros-%{ros_distro}-%{RosPkgName}
+Version: 1.10.2
+Release: 1%{?dist}%{?release_suffix}
+Summary: ROS nodelet-topic-tools package
+
+Url: http://ros.org/wiki/nodelet_topic_tools
+License: BSD
+Source0: %{name}_%{version}.orig.tar.gz
+
+Requires: boost-devel
+Requires: ros-%{ros_distro}-dynamic-reconfigure
+Requires: ros-%{ros_distro}-message-filters
+Requires: ros-%{ros_distro}-nodelet
+Requires: ros-%{ros_distro}-pluginlib
+Requires: ros-%{ros_distro}-roscpp
+
+BuildRequires: boost-devel
+BuildRequires: ros-%{ros_distro}-dynamic-reconfigure
+BuildRequires: ros-%{ros_distro}-catkin
+
+%if 0%{?with_tests}
+%endif
+
+Provides: %{name}-devel = %{version}-%{release}
+Provides: %{name}-doc = %{version}-%{release}
+Provides: %{name}-runtime = %{version}-%{release}
+
+%description
+
+ This package contains common nodelet tools such as a mux, demux and throttle.
+
+
+%prep
+%autosetup -p1
+
+%build
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+export ROS_DISTRO=%{ros_distro}
+export ROS_PYTHON_VERSION=%{python3_version}
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+mkdir -p .obj-%{_target_platform} && cd .obj-%{_target_platform}
+%cmake3 \
+ -UINCLUDE_INSTALL_DIR \
+ -ULIB_INSTALL_DIR \
+ -USYSCONF_INSTALL_DIR \
+ -USHARE_INSTALL_PREFIX \
+ -ULIB_SUFFIX \
+ -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
+ -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_INSTALL_LIBDIR="/opt/ros/%{ros_distro}/lib" \
+ -DSETUPTOOLS_DEB_LAYOUT=OFF \
+%if !0%{?with_tests}
+ -DBUILD_TESTING=OFF \
+%endif
+ ..
+
+%make_build
+
+%install
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+%make_install -C .obj-%{_target_platform}
+
+%if 0%{?with_tests}
+%check
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# Look for a Makefile target with a name indicating that it runs tests
+TEST_TARGET=$(%__make -qp -C .obj-%{_target_platform} | sed "s/^\(test\|check\):.*/\\1/;t f;d;:f;q0")
+if [ -n "$TEST_TARGET" ]; then
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+CTEST_OUTPUT_ON_FAILURE=1 \
+ %make_build -C .obj-%{_target_platform} $TEST_TARGET || echo "RPM TESTS FAILED"
+else echo "RPM TESTS SKIPPED"; fi
+%endif
+
+%files
+/opt/ros/%{ros_distro}
+
+%changelog
+* 三 1月 10 2024 Michael Carroll michael@openrobotics.org - 1.10.2-1
+- Autogenerated by ros-porting-tools
diff --git a/nodelet.spec b/nodelet.spec
new file mode 100644
index 0000000..4add5cc
--- /dev/null
+++ b/nodelet.spec
@@ -0,0 +1,124 @@
+%bcond_without tests
+%bcond_without weak_deps
+
+%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
+%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
+%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$
+
+%define RosPkgName nodelet
+%define with_tests 0
+
+Name: ros-%{ros_distro}-%{RosPkgName}
+Version: 1.10.2
+Release: 1%{?dist}%{?release_suffix}
+Summary: ROS nodelet package
+
+Url: http://ros.org/wiki/nodelet
+License: BSD
+Source0: %{name}_%{version}.orig.tar.gz
+
+Requires: ros-%{ros_distro}-bondcpp
+Requires: boost-devel
+Requires: ros-%{ros_distro}-pluginlib
+Requires: ros-%{ros_distro}-rosconsole
+Requires: ros-%{ros_distro}-roscpp
+Requires: ros-%{ros_distro}-std-msgs
+Requires: libuuid-devel
+Requires: ros-%{ros_distro}-message-runtime
+Requires: ros-%{ros_distro}-rospy
+
+BuildRequires: ros-%{ros_distro}-bondcpp
+BuildRequires: boost-devel
+BuildRequires: ros-%{ros_distro}-pluginlib
+BuildRequires: ros-%{ros_distro}-rosconsole
+BuildRequires: ros-%{ros_distro}-roscpp
+BuildRequires: ros-%{ros_distro}-std-msgs
+BuildRequires: libuuid-devel
+BuildRequires: ros-%{ros_distro}-cmake-modules
+BuildRequires: ros-%{ros_distro}-message-generation
+BuildRequires: ros-%{ros_distro}-catkin
+
+%if 0%{?with_tests}
+%endif
+
+Provides: %{name}-devel = %{version}-%{release}
+Provides: %{name}-doc = %{version}-%{release}
+Provides: %{name}-runtime = %{version}-%{release}
+
+%description
+
+ The nodelet package is designed to provide a way to run multiple
+ algorithms in the same process with zero copy transport between
+ algorithms.
+
+ This package provides both the nodelet base class needed for
+ implementing a nodelet, as well as the NodeletLoader class used
+ for instantiating nodelets.
+
+
+%prep
+%autosetup -p1
+
+%build
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+export ROS_DISTRO=%{ros_distro}
+export ROS_PYTHON_VERSION=%{python3_version}
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+mkdir -p .obj-%{_target_platform} && cd .obj-%{_target_platform}
+%cmake3 \
+ -UINCLUDE_INSTALL_DIR \
+ -ULIB_INSTALL_DIR \
+ -USYSCONF_INSTALL_DIR \
+ -USHARE_INSTALL_PREFIX \
+ -ULIB_SUFFIX \
+ -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
+ -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \
+ -DCMAKE_INSTALL_LIBDIR="/opt/ros/%{ros_distro}/lib" \
+ -DSETUPTOOLS_DEB_LAYOUT=OFF \
+%if !0%{?with_tests}
+ -DBUILD_TESTING=OFF \
+%endif
+ ..
+
+%make_build
+
+%install
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+%make_install -C .obj-%{_target_platform}
+
+%if 0%{?with_tests}
+%check
+# Needed to bootstrap since the ros_workspace package does not yet exist.
+export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages
+
+# Look for a Makefile target with a name indicating that it runs tests
+TEST_TARGET=$(%__make -qp -C .obj-%{_target_platform} | sed "s/^\(test\|check\):.*/\\1/;t f;d;:f;q0")
+if [ -n "$TEST_TARGET" ]; then
+# In case we're installing to a non-standard location, look for a setup.sh
+# in the install tree and source it. It will set things like
+# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
+if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi
+CTEST_OUTPUT_ON_FAILURE=1 \
+ %make_build -C .obj-%{_target_platform} $TEST_TARGET || echo "RPM TESTS FAILED"
+else echo "RPM TESTS SKIPPED"; fi
+%endif
+
+%files
+/opt/ros/%{ros_distro}
+
+%changelog
+* 三 1月 10 2024 Michael Carroll michael@openrobotics.org - 1.10.2-1
+- Autogenerated by ros-porting-tools
diff --git a/nodelet_core.spec b/nodelet_core.spec
deleted file mode 100644
index fec9003..0000000
--- a/nodelet_core.spec
+++ /dev/null
@@ -1,110 +0,0 @@
-Name: ros-noetic-ros-nodelet_core
-Version: 1.10.1
-Release: 1
-Summary: This is ROS noetic %{name} Package
-License: Public Domain and Apache-2.0 and BSD and MIT and BSL-1.0 and LGPL-2.1-only and MPL-2.0 and GPL-3.0-only and GPL-2.0-or-later and MPL-1.1 and IJG and Zlib and OFL-1.1
-URL: https://github.com/ros-gbp/nodelet_core-release/archive/release/noetic/nodelet_core
-Source0: https://github.com/ros-gbp/nodelet_core-release/archive/release/noetic/nodelet_core/1.10.1-1.tar.gz
-BuildRequires: gcc-c++
-BuildRequires: cmake
-BuildRequires: lz4-devel
-BuildRequires: bzip2-devel
-BuildRequires: python3-devel
-BuildRequires: python3-setuptools
-BuildRequires: openssl-devel
-BuildRequires: uuid-devel
-BuildRequires: uuid
-BuildRequires: libuuid-devel
-BuildRequires: libtiff-devel
-BuildRequires: libwebp-devel
-BuildRequires: libjpeg-turbo-devel
-BuildRequires: yaml-cpp-devel
-BuildRequires: boost-devel
-BuildRequires: libtool-ltdl-devel
-BuildRequires: fltk-devel
-BuildRequires: libpng-devel
-BuildRequires: bullet-devel
-BuildRequires: gtest-devel
-BuildRequires: gmock-devel
-
-%description
-This is %{name} Package
-
-%prep
-%setup
-
-%install
-
-cd 3rdparty/
-
-cd empy-3.3.4/
-python3 setup.py install --user
-cd ..
-
-cd six-1.15.0/
-python3 setup.py install --user
-cd ..
-
-cd setuptools_scm-4.1.2/
-python3 setup.py install --user
-cd ..
-
-cd python-dateutil-2.8.1/
-python3 setup.py install --user
-cd ..
-
-cd pyparsing-2.4.7/
-python3 setup.py install --user
-cd ..
-
-cd docutils-0.16/
-python3 setup.py install --user
-cd ..
-
-cd catkin_pkg-0.4.22/
-python3 setup.py install --user
-cd ..
-
-#for std_msgs
-cd PyYAML-5.3.1/
-python3 setup.py install --user
-cd ..
-
-cd distro-1.5.0/
-python3 setup.py install --user
-cd ..
-
-cd rospkg-1.2.8/
-python3 setup.py install --user
-cd ..
-
-# 3rdparty
-cd ..
-
-#compile
-#./src/catkin/bin/catkin_make_isolated --install
-#cp install_dependence.sh install_isolated/
-
-####
-# 对install_isoloate内部的变量名称进行替换
-#
-####
-#SRC_PATH=$PWD/install_isolated
-#DST_PATH=/opt/ros/noetic
-#sed -i "s:${SRC_PATH}:${DST_PATH}:g" `grep -rIln "${SRC_PATH}" install_isolated/*`
-
-####
-# 添加.catkin和.rosinstall文件
-#
-####
-#mkdir -p %{buildroot}/opt/ros/noetic/
-#cp -r install_isolated/* %{buildroot}/opt/ros/noetic/
-#cp install_isolated/.rosinstall %{buildroot}/opt/ros/noetic/
-#cp install_isolated/.catkin %{buildroot}/opt/ros/noetic/
-
-%files
-%defattr(-,root,root)
-
-%changelog
-* Tue Dec 15 2020 openEuler Buildteam - 1.10.1-1
-- Package init
diff --git a/ros-noetic-nodelet-core_1.10.2.orig.tar.gz b/ros-noetic-nodelet-core_1.10.2.orig.tar.gz
new file mode 100644
index 0000000..d98270b
Binary files /dev/null and b/ros-noetic-nodelet-core_1.10.2.orig.tar.gz differ
diff --git a/ros-noetic-nodelet-topic-tools_1.10.2.orig.tar.gz b/ros-noetic-nodelet-topic-tools_1.10.2.orig.tar.gz
new file mode 100644
index 0000000..3c7b7b0
Binary files /dev/null and b/ros-noetic-nodelet-topic-tools_1.10.2.orig.tar.gz differ
diff --git a/ros-noetic-nodelet_1.10.2.orig.tar.gz b/ros-noetic-nodelet_1.10.2.orig.tar.gz
new file mode 100644
index 0000000..5a4bbe4
Binary files /dev/null and b/ros-noetic-nodelet_1.10.2.orig.tar.gz differ