datetime:2024/11/19 15:12
author:nzb
ROS2源码加密混淆
pip install Cython
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws /src
ros2 pkg create --build-type ament_python ros2_cythonize_demo
cd ros2_cythonize_demo
touch ros2_cythonize_demo/py_node.py
ros2_cythonize_demo/
├── package.xml
├── resource
│ └── ros2_cythonize_demo
├── ros2_cythonize_demo
│ ├── __init__.py
│ └── py_node.py
├── setup.cfg
├── setup.py
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
3 directories, 9 files
from Cython.Build import cythonize
from setuptools import find_packages, setup
package_name = 'ros2_cythonize_demo'
files = package_name + "/*.py"
setup(
ext_modules=cythonize(files, compiler_directives={'language_level': "3"}, force=True, quiet=True),
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools', "wheel", "Cython"],
zip_safe=True,
maintainer='blues',
maintainer_email='nzbwork@gmail.com',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
"ros2_cythonize_demo = ros2_cythonize_demo.py_node:main"
],
},
)
import rclpy
import rclpy.logging
from rclpy.node import Node
"""
tar -zcvf install.tar.gz --exclude=**/lib/*.py install/
"""
class LogNode(Node):
def __init__(self, name):
super().__init__(name)
self.get_logger().info("init LogNode")
self.create_timer(0.001, self.logger_cb)
def logger_cb(self):
self.get_logger().info("hello world [info]")
self.get_logger().debug("hello world [debug]")
def main(args=None):
rclpy.init(args=args)
node = LogNode(name='node')
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
迁移
cd ~/ros2_ws
# 项目路径假设在~/ros2_ws
colcon build
tar -zcvf ros2_code.tar.gz --exclude=**/lib/*.py install/
# 排除源码
- 压缩包上传新机器
mkdir -p ~/ros2_ws/ && cd ros2_ws
- 压缩包解压到
~/ros2_ws
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 run ros2_cythonize_demo ros2_cythonize_demo
cythonize闭源后,日志打印error和warn报错解决
[INFO] [1732850295.663592467] [node]: init LogNode
[INFO] [1732850295.664980223] [node]: hello world [info]
Traceback (most recent call last):
File "/home/blues/vscode_projects/cyan_demos/ros2_ws/install/cythonize_demo/lib/cythonize_demo/cythonize_demo", line 33, in <module>
sys.exit(load_entry_point('cythonize-demo==0.0.0', 'console_scripts', 'cythonize_demo')())
File "cythonize_demo/py_node.py", line 30, in cythonize_demo.py_node.main
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/__init__.py", line 222, in spin
executor.spin_once()
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 739, in spin_once
self._spin_once_impl(timeout_sec)
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 736, in _spin_once_impl
raise handler.exception()
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/task.py", line 239, in __call__
self._handler.send(None)
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 437, in handler
await call_coroutine(entity, arg)
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 351, in _execute_timer
await await_or_execute(tmr.callback)
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 107, in await_or_execute
return callback(*args)
File "cythonize_demo/py_node.py", line 21, in cythonize_demo.py_node.LogNode.logger_cb
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/impl/rcutils_logger.py", line 345, in error
return self.log(message, LoggingSeverity.ERROR, **kwargs)
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/impl/rcutils_logger.py", line 299, in log
raise ValueError('Logger severity cannot be changed between calls.')
ValueError: Logger severity cannot be changed between calls.
[ros2run]: Process exited with failure 1
from uuid import uuid4
from rclpy.impl.rcutils_logger import RcutilsLogger as RosLogger
from rclpy.node import Node
class NodeAdapter(Node):
def __init__(self, node_name: str, *args, **kwargs) -> None:
super().__init__(node_name, *args, **kwargs)
def get_logger(self) -> RosLogger:
unique_logger_name = f"{uuid4()}"
return self._logger.get_child(unique_logger_name)
ros1 闭源