Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6600947914 | ||
|
|
977a99f9d1 |
@@ -2,6 +2,8 @@
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
install/
|
||||
log/
|
||||
*/build/
|
||||
log/
|
||||
# Local configuration file (sdk path, etc)
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
# SkyLink ROS 2 机载端 - 快速编译脚本
|
||||
# 用法: ./build.sh [release|debug]
|
||||
|
||||
# 加载git分支
|
||||
# 如果是python分支,则加载python相关依赖
|
||||
# 如果是cpp分支,则加载cpp相关依赖
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
@@ -65,4 +69,6 @@ echo " source $SCRIPT_DIR/install/setup.bash"
|
||||
echo ""
|
||||
echo "2. 启动节点:"
|
||||
echo " ros2 launch skylink_bridge bridge.launch.py"
|
||||
echo "python 版本节点启动命令:"
|
||||
echo " ros2 launch skylink_bridge_python bridge.launch.py"
|
||||
echo ""
|
||||
|
||||
1
skylink_ros2_ws/build/.built_by
Normal file
1
skylink_ros2_ws/build/.built_by
Normal file
@@ -0,0 +1 @@
|
||||
colcon
|
||||
0
skylink_ros2_ws/build/COLCON_IGNORE
Normal file
0
skylink_ros2_ws/build/COLCON_IGNORE
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1 @@
|
||||
# generated from colcon_core/shell/template/command_prefix.sh.em
|
||||
@@ -0,0 +1,59 @@
|
||||
AMENT_PREFIX_PATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python:/opt/ros/humble
|
||||
BROWSER=/home/flower/.vscode-server/cli/servers/Stable-18e3a1ec544e6907be1e944a94c496e302073435/server/bin/helpers/browser.sh
|
||||
CMAKE_PREFIX_PATH=/home/flower/app/Qt/6.5.3/gcc_64:/opt/ros/humble/include
|
||||
COLCON=1
|
||||
COLCON_PREFIX_PATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/install
|
||||
COLORTERM=truecolor
|
||||
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
|
||||
GIT_ASKPASS=/home/flower/.vscode-server/cli/servers/Stable-18e3a1ec544e6907be1e944a94c496e302073435/server/extensions/git/dist/askpass.sh
|
||||
HOME=/home/flower
|
||||
LANG=zh_CN.UTF-8
|
||||
LANGUAGE=zh_CN:zh:en_US:en
|
||||
LC_ADDRESS=zh_CN.UTF-8
|
||||
LC_IDENTIFICATION=zh_CN.UTF-8
|
||||
LC_MEASUREMENT=zh_CN.UTF-8
|
||||
LC_MONETARY=zh_CN.UTF-8
|
||||
LC_NAME=zh_CN.UTF-8
|
||||
LC_NUMERIC=zh_CN.UTF-8
|
||||
LC_PAPER=zh_CN.UTF-8
|
||||
LC_TELEPHONE=zh_CN.UTF-8
|
||||
LC_TIME=zh_CN.UTF-8
|
||||
LD_LIBRARY_PATH=/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib:/home/flower/app/Qt/6.5.3/gcc_64/lib
|
||||
LESSCLOSE=/usr/bin/lesspipe %s %s
|
||||
LESSOPEN=| /usr/bin/lesspipe %s
|
||||
LOGNAME=flower
|
||||
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
|
||||
MOTD_SHOWN=pam
|
||||
NVM_BIN=/home/flower/app/NVM/.nvm/versions/node/v16.0.0/bin
|
||||
NVM_CD_FLAGS=
|
||||
NVM_DIR=/home/flower/app/NVM/.nvm
|
||||
NVM_INC=/home/flower/app/NVM/.nvm/versions/node/v16.0.0/include/node
|
||||
OLDPWD=/home/flower/code/camera/flyLink
|
||||
PATH=/home/flower/.vscode-server/cli/servers/Stable-18e3a1ec544e6907be1e944a94c496e302073435/server/bin/remote-cli:/opt/ros/humble/bin:/home/flower/app/NVM/.nvm/versions/node/v16.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/flower/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand
|
||||
PWD=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages
|
||||
ROS_DISTRO=humble
|
||||
ROS_LOCALHOST_ONLY=0
|
||||
ROS_PYTHON_VERSION=3
|
||||
ROS_VERSION=2
|
||||
SHELL=/bin/bash
|
||||
SHLVL=2
|
||||
SSH_CLIENT=192.168.31.107 52414 22
|
||||
SSH_CONNECTION=192.168.31.107 52414 192.168.31.21 22
|
||||
SSL_CERT_DIR=/usr/lib/ssl/certs
|
||||
SSL_CERT_FILE=/usr/lib/ssl/certs/ca-certificates.crt
|
||||
TERM=xterm-256color
|
||||
TERM_PROGRAM=vscode
|
||||
TERM_PROGRAM_VERSION=1.101.1
|
||||
USER=flower
|
||||
VSCODE_GIT_ASKPASS_EXTRA_ARGS=
|
||||
VSCODE_GIT_ASKPASS_MAIN=/home/flower/.vscode-server/cli/servers/Stable-18e3a1ec544e6907be1e944a94c496e302073435/server/extensions/git/dist/askpass-main.js
|
||||
VSCODE_GIT_ASKPASS_NODE=/home/flower/.vscode-server/cli/servers/Stable-18e3a1ec544e6907be1e944a94c496e302073435/server/node
|
||||
VSCODE_GIT_IPC_HANDLE=/run/user/1000/vscode-git-cb34e795ae.sock
|
||||
VSCODE_IPC_HOOK_CLI=/run/user/1000/vscode-ipc-9c363232-2bf9-4710-8997-fe36d048c317.sock
|
||||
XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share:/usr/share:/var/lib/snapd/desktop
|
||||
XDG_RUNTIME_DIR=/run/user/1000
|
||||
XDG_SESSION_CLASS=user
|
||||
XDG_SESSION_ID=159
|
||||
XDG_SESSION_TYPE=tty
|
||||
_=/usr/bin/colcon
|
||||
1
skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml
Symbolic link
1
skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/config/params.yaml
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/launch/bridge.launch.py
|
||||
1
skylink_ros2_ws/build/skylink_bridge_python/package.xml
Symbolic link
1
skylink_ros2_ws/build/skylink_bridge_python/package.xml
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/package.xml
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
import sys
|
||||
if sys.prefix == '/usr':
|
||||
sys.real_prefix = sys.prefix
|
||||
sys.prefix = sys.exec_prefix = '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python'
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/resource/skylink_bridge_python
|
||||
1
skylink_ros2_ws/build/skylink_bridge_python/setup.cfg
Symbolic link
1
skylink_ros2_ws/build/skylink_bridge_python/setup.cfg
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/setup.cfg
|
||||
1
skylink_ros2_ws/build/skylink_bridge_python/setup.py
Symbolic link
1
skylink_ros2_ws/build/skylink_bridge_python/setup.py
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/setup.py
|
||||
@@ -0,0 +1 @@
|
||||
prepend-non-duplicate;PYTHONPATH;/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
|
||||
|
||||
colcon_prepend_unique_value PYTHONPATH "$env:COLCON_CURRENT_PREFIX\/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python"
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_core/shell/template/hook_prepend_value.sh.em
|
||||
|
||||
_colcon_prepend_unique_value PYTHONPATH "/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python"
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python/skylink_bridge_python
|
||||
@@ -0,0 +1,13 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: skylink-bridge-python
|
||||
Version: 0.0.0
|
||||
Summary: TODO: Package description
|
||||
Home-page: UNKNOWN
|
||||
Maintainer: flower
|
||||
Maintainer-email: 737666956@qq.com
|
||||
License: TODO: License declaration
|
||||
Platform: UNKNOWN
|
||||
Provides-Extra: test
|
||||
|
||||
UNKNOWN
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package.xml
|
||||
setup.cfg
|
||||
setup.py
|
||||
config/params.yaml
|
||||
launch/bridge.launch.py
|
||||
resource/skylink_bridge_python
|
||||
skylink_bridge_python/__init__.py
|
||||
skylink_bridge_python/camera_driver_node.py
|
||||
skylink_bridge_python.egg-info/PKG-INFO
|
||||
skylink_bridge_python.egg-info/SOURCES.txt
|
||||
skylink_bridge_python.egg-info/dependency_links.txt
|
||||
skylink_bridge_python.egg-info/entry_points.txt
|
||||
skylink_bridge_python.egg-info/requires.txt
|
||||
skylink_bridge_python.egg-info/top_level.txt
|
||||
skylink_bridge_python.egg-info/zip-safe
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[console_scripts]
|
||||
camera_driver_node = skylink_bridge_python.camera_driver_node:main
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
setuptools
|
||||
|
||||
[test]
|
||||
pytest
|
||||
@@ -0,0 +1 @@
|
||||
skylink_bridge_python
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
1
skylink_ros2_ws/install/.colcon_install_layout
Normal file
1
skylink_ros2_ws/install/.colcon_install_layout
Normal file
@@ -0,0 +1 @@
|
||||
isolated
|
||||
0
skylink_ros2_ws/install/COLCON_IGNORE
Normal file
0
skylink_ros2_ws/install/COLCON_IGNORE
Normal file
407
skylink_ros2_ws/install/_local_setup_util_ps1.py
Normal file
407
skylink_ros2_ws/install/_local_setup_util_ps1.py
Normal file
@@ -0,0 +1,407 @@
|
||||
# Copyright 2016-2019 Dirk Thomas
|
||||
# Licensed under the Apache License, Version 2.0
|
||||
|
||||
import argparse
|
||||
from collections import OrderedDict
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
|
||||
FORMAT_STR_COMMENT_LINE = '# {comment}'
|
||||
FORMAT_STR_SET_ENV_VAR = 'Set-Item -Path "Env:{name}" -Value "{value}"'
|
||||
FORMAT_STR_USE_ENV_VAR = '$env:{name}'
|
||||
FORMAT_STR_INVOKE_SCRIPT = '_colcon_prefix_powershell_source_script "{script_path}"' # noqa: E501
|
||||
FORMAT_STR_REMOVE_LEADING_SEPARATOR = '' # noqa: E501
|
||||
FORMAT_STR_REMOVE_TRAILING_SEPARATOR = '' # noqa: E501
|
||||
|
||||
DSV_TYPE_APPEND_NON_DUPLICATE = 'append-non-duplicate'
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE = 'prepend-non-duplicate'
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS = 'prepend-non-duplicate-if-exists'
|
||||
DSV_TYPE_SET = 'set'
|
||||
DSV_TYPE_SET_IF_UNSET = 'set-if-unset'
|
||||
DSV_TYPE_SOURCE = 'source'
|
||||
|
||||
|
||||
def main(argv=sys.argv[1:]): # noqa: D103
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Output shell commands for the packages in topological '
|
||||
'order')
|
||||
parser.add_argument(
|
||||
'primary_extension',
|
||||
help='The file extension of the primary shell')
|
||||
parser.add_argument(
|
||||
'additional_extension', nargs='?',
|
||||
help='The additional file extension to be considered')
|
||||
parser.add_argument(
|
||||
'--merged-install', action='store_true',
|
||||
help='All install prefixes are merged into a single location')
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
packages = get_packages(Path(__file__).parent, args.merged_install)
|
||||
|
||||
ordered_packages = order_packages(packages)
|
||||
for pkg_name in ordered_packages:
|
||||
if _include_comments():
|
||||
print(
|
||||
FORMAT_STR_COMMENT_LINE.format_map(
|
||||
{'comment': 'Package: ' + pkg_name}))
|
||||
prefix = os.path.abspath(os.path.dirname(__file__))
|
||||
if not args.merged_install:
|
||||
prefix = os.path.join(prefix, pkg_name)
|
||||
for line in get_commands(
|
||||
pkg_name, prefix, args.primary_extension,
|
||||
args.additional_extension
|
||||
):
|
||||
print(line)
|
||||
|
||||
for line in _remove_ending_separators():
|
||||
print(line)
|
||||
|
||||
|
||||
def get_packages(prefix_path, merged_install):
|
||||
"""
|
||||
Find packages based on colcon-specific files created during installation.
|
||||
|
||||
:param Path prefix_path: The install prefix path of all packages
|
||||
:param bool merged_install: The flag if the packages are all installed
|
||||
directly in the prefix or if each package is installed in a subdirectory
|
||||
named after the package
|
||||
:returns: A mapping from the package name to the set of runtime
|
||||
dependencies
|
||||
:rtype: dict
|
||||
"""
|
||||
packages = {}
|
||||
# since importing colcon_core isn't feasible here the following constant
|
||||
# must match colcon_core.location.get_relative_package_index_path()
|
||||
subdirectory = 'share/colcon-core/packages'
|
||||
if merged_install:
|
||||
# return if workspace is empty
|
||||
if not (prefix_path / subdirectory).is_dir():
|
||||
return packages
|
||||
# find all files in the subdirectory
|
||||
for p in (prefix_path / subdirectory).iterdir():
|
||||
if not p.is_file():
|
||||
continue
|
||||
if p.name.startswith('.'):
|
||||
continue
|
||||
add_package_runtime_dependencies(p, packages)
|
||||
else:
|
||||
# for each subdirectory look for the package specific file
|
||||
for p in prefix_path.iterdir():
|
||||
if not p.is_dir():
|
||||
continue
|
||||
if p.name.startswith('.'):
|
||||
continue
|
||||
p = p / subdirectory / p.name
|
||||
if p.is_file():
|
||||
add_package_runtime_dependencies(p, packages)
|
||||
|
||||
# remove unknown dependencies
|
||||
pkg_names = set(packages.keys())
|
||||
for k in packages.keys():
|
||||
packages[k] = {d for d in packages[k] if d in pkg_names}
|
||||
|
||||
return packages
|
||||
|
||||
|
||||
def add_package_runtime_dependencies(path, packages):
|
||||
"""
|
||||
Check the path and if it exists extract the packages runtime dependencies.
|
||||
|
||||
:param Path path: The resource file containing the runtime dependencies
|
||||
:param dict packages: A mapping from package names to the sets of runtime
|
||||
dependencies to add to
|
||||
"""
|
||||
content = path.read_text()
|
||||
dependencies = set(content.split(os.pathsep) if content else [])
|
||||
packages[path.name] = dependencies
|
||||
|
||||
|
||||
def order_packages(packages):
|
||||
"""
|
||||
Order packages topologically.
|
||||
|
||||
:param dict packages: A mapping from package name to the set of runtime
|
||||
dependencies
|
||||
:returns: The package names
|
||||
:rtype: list
|
||||
"""
|
||||
# select packages with no dependencies in alphabetical order
|
||||
to_be_ordered = list(packages.keys())
|
||||
ordered = []
|
||||
while to_be_ordered:
|
||||
pkg_names_without_deps = [
|
||||
name for name in to_be_ordered if not packages[name]]
|
||||
if not pkg_names_without_deps:
|
||||
reduce_cycle_set(packages)
|
||||
raise RuntimeError(
|
||||
'Circular dependency between: ' + ', '.join(sorted(packages)))
|
||||
pkg_names_without_deps.sort()
|
||||
pkg_name = pkg_names_without_deps[0]
|
||||
to_be_ordered.remove(pkg_name)
|
||||
ordered.append(pkg_name)
|
||||
# remove item from dependency lists
|
||||
for k in list(packages.keys()):
|
||||
if pkg_name in packages[k]:
|
||||
packages[k].remove(pkg_name)
|
||||
return ordered
|
||||
|
||||
|
||||
def reduce_cycle_set(packages):
|
||||
"""
|
||||
Reduce the set of packages to the ones part of the circular dependency.
|
||||
|
||||
:param dict packages: A mapping from package name to the set of runtime
|
||||
dependencies which is modified in place
|
||||
"""
|
||||
last_depended = None
|
||||
while len(packages) > 0:
|
||||
# get all remaining dependencies
|
||||
depended = set()
|
||||
for pkg_name, dependencies in packages.items():
|
||||
depended = depended.union(dependencies)
|
||||
# remove all packages which are not dependent on
|
||||
for name in list(packages.keys()):
|
||||
if name not in depended:
|
||||
del packages[name]
|
||||
if last_depended:
|
||||
# if remaining packages haven't changed return them
|
||||
if last_depended == depended:
|
||||
return packages.keys()
|
||||
# otherwise reduce again
|
||||
last_depended = depended
|
||||
|
||||
|
||||
def _include_comments():
|
||||
# skipping comment lines when COLCON_TRACE is not set speeds up the
|
||||
# processing especially on Windows
|
||||
return bool(os.environ.get('COLCON_TRACE'))
|
||||
|
||||
|
||||
def get_commands(pkg_name, prefix, primary_extension, additional_extension):
|
||||
commands = []
|
||||
package_dsv_path = os.path.join(prefix, 'share', pkg_name, 'package.dsv')
|
||||
if os.path.exists(package_dsv_path):
|
||||
commands += process_dsv_file(
|
||||
package_dsv_path, prefix, primary_extension, additional_extension)
|
||||
return commands
|
||||
|
||||
|
||||
def process_dsv_file(
|
||||
dsv_path, prefix, primary_extension=None, additional_extension=None
|
||||
):
|
||||
commands = []
|
||||
if _include_comments():
|
||||
commands.append(FORMAT_STR_COMMENT_LINE.format_map({'comment': dsv_path}))
|
||||
with open(dsv_path, 'r') as h:
|
||||
content = h.read()
|
||||
lines = content.splitlines()
|
||||
|
||||
basenames = OrderedDict()
|
||||
for i, line in enumerate(lines):
|
||||
# skip over empty or whitespace-only lines
|
||||
if not line.strip():
|
||||
continue
|
||||
# skip over comments
|
||||
if line.startswith('#'):
|
||||
continue
|
||||
try:
|
||||
type_, remainder = line.split(';', 1)
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"Line %d in '%s' doesn't contain a semicolon separating the "
|
||||
'type from the arguments' % (i + 1, dsv_path))
|
||||
if type_ != DSV_TYPE_SOURCE:
|
||||
# handle non-source lines
|
||||
try:
|
||||
commands += handle_dsv_types_except_source(
|
||||
type_, remainder, prefix)
|
||||
except RuntimeError as e:
|
||||
raise RuntimeError(
|
||||
"Line %d in '%s' %s" % (i + 1, dsv_path, e)) from e
|
||||
else:
|
||||
# group remaining source lines by basename
|
||||
path_without_ext, ext = os.path.splitext(remainder)
|
||||
if path_without_ext not in basenames:
|
||||
basenames[path_without_ext] = set()
|
||||
assert ext.startswith('.')
|
||||
ext = ext[1:]
|
||||
if ext in (primary_extension, additional_extension):
|
||||
basenames[path_without_ext].add(ext)
|
||||
|
||||
# add the dsv extension to each basename if the file exists
|
||||
for basename, extensions in basenames.items():
|
||||
if not os.path.isabs(basename):
|
||||
basename = os.path.join(prefix, basename)
|
||||
if os.path.exists(basename + '.dsv'):
|
||||
extensions.add('dsv')
|
||||
|
||||
for basename, extensions in basenames.items():
|
||||
if not os.path.isabs(basename):
|
||||
basename = os.path.join(prefix, basename)
|
||||
if 'dsv' in extensions:
|
||||
# process dsv files recursively
|
||||
commands += process_dsv_file(
|
||||
basename + '.dsv', prefix, primary_extension=primary_extension,
|
||||
additional_extension=additional_extension)
|
||||
elif primary_extension in extensions and len(extensions) == 1:
|
||||
# source primary-only files
|
||||
commands += [
|
||||
FORMAT_STR_INVOKE_SCRIPT.format_map({
|
||||
'prefix': prefix,
|
||||
'script_path': basename + '.' + primary_extension})]
|
||||
elif additional_extension in extensions:
|
||||
# source non-primary files
|
||||
commands += [
|
||||
FORMAT_STR_INVOKE_SCRIPT.format_map({
|
||||
'prefix': prefix,
|
||||
'script_path': basename + '.' + additional_extension})]
|
||||
|
||||
return commands
|
||||
|
||||
|
||||
def handle_dsv_types_except_source(type_, remainder, prefix):
|
||||
commands = []
|
||||
if type_ in (DSV_TYPE_SET, DSV_TYPE_SET_IF_UNSET):
|
||||
try:
|
||||
env_name, value = remainder.split(';', 1)
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"doesn't contain a semicolon separating the environment name "
|
||||
'from the value')
|
||||
try_prefixed_value = os.path.join(prefix, value) if value else prefix
|
||||
if os.path.exists(try_prefixed_value):
|
||||
value = try_prefixed_value
|
||||
if type_ == DSV_TYPE_SET:
|
||||
commands += _set(env_name, value)
|
||||
elif type_ == DSV_TYPE_SET_IF_UNSET:
|
||||
commands += _set_if_unset(env_name, value)
|
||||
else:
|
||||
assert False
|
||||
elif type_ in (
|
||||
DSV_TYPE_APPEND_NON_DUPLICATE,
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE,
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS
|
||||
):
|
||||
try:
|
||||
env_name_and_values = remainder.split(';')
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"doesn't contain a semicolon separating the environment name "
|
||||
'from the values')
|
||||
env_name = env_name_and_values[0]
|
||||
values = env_name_and_values[1:]
|
||||
for value in values:
|
||||
if not value:
|
||||
value = prefix
|
||||
elif not os.path.isabs(value):
|
||||
value = os.path.join(prefix, value)
|
||||
if (
|
||||
type_ == DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS and
|
||||
not os.path.exists(value)
|
||||
):
|
||||
comment = f'skip extending {env_name} with not existing ' \
|
||||
f'path: {value}'
|
||||
if _include_comments():
|
||||
commands.append(
|
||||
FORMAT_STR_COMMENT_LINE.format_map({'comment': comment}))
|
||||
elif type_ == DSV_TYPE_APPEND_NON_DUPLICATE:
|
||||
commands += _append_unique_value(env_name, value)
|
||||
else:
|
||||
commands += _prepend_unique_value(env_name, value)
|
||||
else:
|
||||
raise RuntimeError(
|
||||
'contains an unknown environment hook type: ' + type_)
|
||||
return commands
|
||||
|
||||
|
||||
env_state = {}
|
||||
|
||||
|
||||
def _append_unique_value(name, value):
|
||||
global env_state
|
||||
if name not in env_state:
|
||||
if os.environ.get(name):
|
||||
env_state[name] = set(os.environ[name].split(os.pathsep))
|
||||
else:
|
||||
env_state[name] = set()
|
||||
# append even if the variable has not been set yet, in case a shell script sets the
|
||||
# same variable without the knowledge of this Python script.
|
||||
# later _remove_ending_separators() will cleanup any unintentional leading separator
|
||||
extend = FORMAT_STR_USE_ENV_VAR.format_map({'name': name}) + os.pathsep
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': extend + value})
|
||||
if value not in env_state[name]:
|
||||
env_state[name].add(value)
|
||||
else:
|
||||
if not _include_comments():
|
||||
return []
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
def _prepend_unique_value(name, value):
|
||||
global env_state
|
||||
if name not in env_state:
|
||||
if os.environ.get(name):
|
||||
env_state[name] = set(os.environ[name].split(os.pathsep))
|
||||
else:
|
||||
env_state[name] = set()
|
||||
# prepend even if the variable has not been set yet, in case a shell script sets the
|
||||
# same variable without the knowledge of this Python script.
|
||||
# later _remove_ending_separators() will cleanup any unintentional trailing separator
|
||||
extend = os.pathsep + FORMAT_STR_USE_ENV_VAR.format_map({'name': name})
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value + extend})
|
||||
if value not in env_state[name]:
|
||||
env_state[name].add(value)
|
||||
else:
|
||||
if not _include_comments():
|
||||
return []
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
# generate commands for removing prepended underscores
|
||||
def _remove_ending_separators():
|
||||
# do nothing if the shell extension does not implement the logic
|
||||
if FORMAT_STR_REMOVE_TRAILING_SEPARATOR is None:
|
||||
return []
|
||||
|
||||
global env_state
|
||||
commands = []
|
||||
for name in env_state:
|
||||
# skip variables that already had values before this script started prepending
|
||||
if name in os.environ:
|
||||
continue
|
||||
commands += [
|
||||
FORMAT_STR_REMOVE_LEADING_SEPARATOR.format_map({'name': name}),
|
||||
FORMAT_STR_REMOVE_TRAILING_SEPARATOR.format_map({'name': name})]
|
||||
return commands
|
||||
|
||||
|
||||
def _set(name, value):
|
||||
global env_state
|
||||
env_state[name] = value
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value})
|
||||
return [line]
|
||||
|
||||
|
||||
def _set_if_unset(name, value):
|
||||
global env_state
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value})
|
||||
if env_state.get(name, os.environ.get(name)):
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
if __name__ == '__main__': # pragma: no cover
|
||||
try:
|
||||
rc = main()
|
||||
except RuntimeError as e:
|
||||
print(str(e), file=sys.stderr)
|
||||
rc = 1
|
||||
sys.exit(rc)
|
||||
407
skylink_ros2_ws/install/_local_setup_util_sh.py
Normal file
407
skylink_ros2_ws/install/_local_setup_util_sh.py
Normal file
@@ -0,0 +1,407 @@
|
||||
# Copyright 2016-2019 Dirk Thomas
|
||||
# Licensed under the Apache License, Version 2.0
|
||||
|
||||
import argparse
|
||||
from collections import OrderedDict
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
|
||||
FORMAT_STR_COMMENT_LINE = '# {comment}'
|
||||
FORMAT_STR_SET_ENV_VAR = 'export {name}="{value}"'
|
||||
FORMAT_STR_USE_ENV_VAR = '${name}'
|
||||
FORMAT_STR_INVOKE_SCRIPT = 'COLCON_CURRENT_PREFIX="{prefix}" _colcon_prefix_sh_source_script "{script_path}"' # noqa: E501
|
||||
FORMAT_STR_REMOVE_LEADING_SEPARATOR = 'if [ "$(echo -n ${name} | head -c 1)" = ":" ]; then export {name}=${{{name}#?}} ; fi' # noqa: E501
|
||||
FORMAT_STR_REMOVE_TRAILING_SEPARATOR = 'if [ "$(echo -n ${name} | tail -c 1)" = ":" ]; then export {name}=${{{name}%?}} ; fi' # noqa: E501
|
||||
|
||||
DSV_TYPE_APPEND_NON_DUPLICATE = 'append-non-duplicate'
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE = 'prepend-non-duplicate'
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS = 'prepend-non-duplicate-if-exists'
|
||||
DSV_TYPE_SET = 'set'
|
||||
DSV_TYPE_SET_IF_UNSET = 'set-if-unset'
|
||||
DSV_TYPE_SOURCE = 'source'
|
||||
|
||||
|
||||
def main(argv=sys.argv[1:]): # noqa: D103
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Output shell commands for the packages in topological '
|
||||
'order')
|
||||
parser.add_argument(
|
||||
'primary_extension',
|
||||
help='The file extension of the primary shell')
|
||||
parser.add_argument(
|
||||
'additional_extension', nargs='?',
|
||||
help='The additional file extension to be considered')
|
||||
parser.add_argument(
|
||||
'--merged-install', action='store_true',
|
||||
help='All install prefixes are merged into a single location')
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
packages = get_packages(Path(__file__).parent, args.merged_install)
|
||||
|
||||
ordered_packages = order_packages(packages)
|
||||
for pkg_name in ordered_packages:
|
||||
if _include_comments():
|
||||
print(
|
||||
FORMAT_STR_COMMENT_LINE.format_map(
|
||||
{'comment': 'Package: ' + pkg_name}))
|
||||
prefix = os.path.abspath(os.path.dirname(__file__))
|
||||
if not args.merged_install:
|
||||
prefix = os.path.join(prefix, pkg_name)
|
||||
for line in get_commands(
|
||||
pkg_name, prefix, args.primary_extension,
|
||||
args.additional_extension
|
||||
):
|
||||
print(line)
|
||||
|
||||
for line in _remove_ending_separators():
|
||||
print(line)
|
||||
|
||||
|
||||
def get_packages(prefix_path, merged_install):
|
||||
"""
|
||||
Find packages based on colcon-specific files created during installation.
|
||||
|
||||
:param Path prefix_path: The install prefix path of all packages
|
||||
:param bool merged_install: The flag if the packages are all installed
|
||||
directly in the prefix or if each package is installed in a subdirectory
|
||||
named after the package
|
||||
:returns: A mapping from the package name to the set of runtime
|
||||
dependencies
|
||||
:rtype: dict
|
||||
"""
|
||||
packages = {}
|
||||
# since importing colcon_core isn't feasible here the following constant
|
||||
# must match colcon_core.location.get_relative_package_index_path()
|
||||
subdirectory = 'share/colcon-core/packages'
|
||||
if merged_install:
|
||||
# return if workspace is empty
|
||||
if not (prefix_path / subdirectory).is_dir():
|
||||
return packages
|
||||
# find all files in the subdirectory
|
||||
for p in (prefix_path / subdirectory).iterdir():
|
||||
if not p.is_file():
|
||||
continue
|
||||
if p.name.startswith('.'):
|
||||
continue
|
||||
add_package_runtime_dependencies(p, packages)
|
||||
else:
|
||||
# for each subdirectory look for the package specific file
|
||||
for p in prefix_path.iterdir():
|
||||
if not p.is_dir():
|
||||
continue
|
||||
if p.name.startswith('.'):
|
||||
continue
|
||||
p = p / subdirectory / p.name
|
||||
if p.is_file():
|
||||
add_package_runtime_dependencies(p, packages)
|
||||
|
||||
# remove unknown dependencies
|
||||
pkg_names = set(packages.keys())
|
||||
for k in packages.keys():
|
||||
packages[k] = {d for d in packages[k] if d in pkg_names}
|
||||
|
||||
return packages
|
||||
|
||||
|
||||
def add_package_runtime_dependencies(path, packages):
|
||||
"""
|
||||
Check the path and if it exists extract the packages runtime dependencies.
|
||||
|
||||
:param Path path: The resource file containing the runtime dependencies
|
||||
:param dict packages: A mapping from package names to the sets of runtime
|
||||
dependencies to add to
|
||||
"""
|
||||
content = path.read_text()
|
||||
dependencies = set(content.split(os.pathsep) if content else [])
|
||||
packages[path.name] = dependencies
|
||||
|
||||
|
||||
def order_packages(packages):
|
||||
"""
|
||||
Order packages topologically.
|
||||
|
||||
:param dict packages: A mapping from package name to the set of runtime
|
||||
dependencies
|
||||
:returns: The package names
|
||||
:rtype: list
|
||||
"""
|
||||
# select packages with no dependencies in alphabetical order
|
||||
to_be_ordered = list(packages.keys())
|
||||
ordered = []
|
||||
while to_be_ordered:
|
||||
pkg_names_without_deps = [
|
||||
name for name in to_be_ordered if not packages[name]]
|
||||
if not pkg_names_without_deps:
|
||||
reduce_cycle_set(packages)
|
||||
raise RuntimeError(
|
||||
'Circular dependency between: ' + ', '.join(sorted(packages)))
|
||||
pkg_names_without_deps.sort()
|
||||
pkg_name = pkg_names_without_deps[0]
|
||||
to_be_ordered.remove(pkg_name)
|
||||
ordered.append(pkg_name)
|
||||
# remove item from dependency lists
|
||||
for k in list(packages.keys()):
|
||||
if pkg_name in packages[k]:
|
||||
packages[k].remove(pkg_name)
|
||||
return ordered
|
||||
|
||||
|
||||
def reduce_cycle_set(packages):
|
||||
"""
|
||||
Reduce the set of packages to the ones part of the circular dependency.
|
||||
|
||||
:param dict packages: A mapping from package name to the set of runtime
|
||||
dependencies which is modified in place
|
||||
"""
|
||||
last_depended = None
|
||||
while len(packages) > 0:
|
||||
# get all remaining dependencies
|
||||
depended = set()
|
||||
for pkg_name, dependencies in packages.items():
|
||||
depended = depended.union(dependencies)
|
||||
# remove all packages which are not dependent on
|
||||
for name in list(packages.keys()):
|
||||
if name not in depended:
|
||||
del packages[name]
|
||||
if last_depended:
|
||||
# if remaining packages haven't changed return them
|
||||
if last_depended == depended:
|
||||
return packages.keys()
|
||||
# otherwise reduce again
|
||||
last_depended = depended
|
||||
|
||||
|
||||
def _include_comments():
|
||||
# skipping comment lines when COLCON_TRACE is not set speeds up the
|
||||
# processing especially on Windows
|
||||
return bool(os.environ.get('COLCON_TRACE'))
|
||||
|
||||
|
||||
def get_commands(pkg_name, prefix, primary_extension, additional_extension):
|
||||
commands = []
|
||||
package_dsv_path = os.path.join(prefix, 'share', pkg_name, 'package.dsv')
|
||||
if os.path.exists(package_dsv_path):
|
||||
commands += process_dsv_file(
|
||||
package_dsv_path, prefix, primary_extension, additional_extension)
|
||||
return commands
|
||||
|
||||
|
||||
def process_dsv_file(
|
||||
dsv_path, prefix, primary_extension=None, additional_extension=None
|
||||
):
|
||||
commands = []
|
||||
if _include_comments():
|
||||
commands.append(FORMAT_STR_COMMENT_LINE.format_map({'comment': dsv_path}))
|
||||
with open(dsv_path, 'r') as h:
|
||||
content = h.read()
|
||||
lines = content.splitlines()
|
||||
|
||||
basenames = OrderedDict()
|
||||
for i, line in enumerate(lines):
|
||||
# skip over empty or whitespace-only lines
|
||||
if not line.strip():
|
||||
continue
|
||||
# skip over comments
|
||||
if line.startswith('#'):
|
||||
continue
|
||||
try:
|
||||
type_, remainder = line.split(';', 1)
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"Line %d in '%s' doesn't contain a semicolon separating the "
|
||||
'type from the arguments' % (i + 1, dsv_path))
|
||||
if type_ != DSV_TYPE_SOURCE:
|
||||
# handle non-source lines
|
||||
try:
|
||||
commands += handle_dsv_types_except_source(
|
||||
type_, remainder, prefix)
|
||||
except RuntimeError as e:
|
||||
raise RuntimeError(
|
||||
"Line %d in '%s' %s" % (i + 1, dsv_path, e)) from e
|
||||
else:
|
||||
# group remaining source lines by basename
|
||||
path_without_ext, ext = os.path.splitext(remainder)
|
||||
if path_without_ext not in basenames:
|
||||
basenames[path_without_ext] = set()
|
||||
assert ext.startswith('.')
|
||||
ext = ext[1:]
|
||||
if ext in (primary_extension, additional_extension):
|
||||
basenames[path_without_ext].add(ext)
|
||||
|
||||
# add the dsv extension to each basename if the file exists
|
||||
for basename, extensions in basenames.items():
|
||||
if not os.path.isabs(basename):
|
||||
basename = os.path.join(prefix, basename)
|
||||
if os.path.exists(basename + '.dsv'):
|
||||
extensions.add('dsv')
|
||||
|
||||
for basename, extensions in basenames.items():
|
||||
if not os.path.isabs(basename):
|
||||
basename = os.path.join(prefix, basename)
|
||||
if 'dsv' in extensions:
|
||||
# process dsv files recursively
|
||||
commands += process_dsv_file(
|
||||
basename + '.dsv', prefix, primary_extension=primary_extension,
|
||||
additional_extension=additional_extension)
|
||||
elif primary_extension in extensions and len(extensions) == 1:
|
||||
# source primary-only files
|
||||
commands += [
|
||||
FORMAT_STR_INVOKE_SCRIPT.format_map({
|
||||
'prefix': prefix,
|
||||
'script_path': basename + '.' + primary_extension})]
|
||||
elif additional_extension in extensions:
|
||||
# source non-primary files
|
||||
commands += [
|
||||
FORMAT_STR_INVOKE_SCRIPT.format_map({
|
||||
'prefix': prefix,
|
||||
'script_path': basename + '.' + additional_extension})]
|
||||
|
||||
return commands
|
||||
|
||||
|
||||
def handle_dsv_types_except_source(type_, remainder, prefix):
|
||||
commands = []
|
||||
if type_ in (DSV_TYPE_SET, DSV_TYPE_SET_IF_UNSET):
|
||||
try:
|
||||
env_name, value = remainder.split(';', 1)
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"doesn't contain a semicolon separating the environment name "
|
||||
'from the value')
|
||||
try_prefixed_value = os.path.join(prefix, value) if value else prefix
|
||||
if os.path.exists(try_prefixed_value):
|
||||
value = try_prefixed_value
|
||||
if type_ == DSV_TYPE_SET:
|
||||
commands += _set(env_name, value)
|
||||
elif type_ == DSV_TYPE_SET_IF_UNSET:
|
||||
commands += _set_if_unset(env_name, value)
|
||||
else:
|
||||
assert False
|
||||
elif type_ in (
|
||||
DSV_TYPE_APPEND_NON_DUPLICATE,
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE,
|
||||
DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS
|
||||
):
|
||||
try:
|
||||
env_name_and_values = remainder.split(';')
|
||||
except ValueError:
|
||||
raise RuntimeError(
|
||||
"doesn't contain a semicolon separating the environment name "
|
||||
'from the values')
|
||||
env_name = env_name_and_values[0]
|
||||
values = env_name_and_values[1:]
|
||||
for value in values:
|
||||
if not value:
|
||||
value = prefix
|
||||
elif not os.path.isabs(value):
|
||||
value = os.path.join(prefix, value)
|
||||
if (
|
||||
type_ == DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS and
|
||||
not os.path.exists(value)
|
||||
):
|
||||
comment = f'skip extending {env_name} with not existing ' \
|
||||
f'path: {value}'
|
||||
if _include_comments():
|
||||
commands.append(
|
||||
FORMAT_STR_COMMENT_LINE.format_map({'comment': comment}))
|
||||
elif type_ == DSV_TYPE_APPEND_NON_DUPLICATE:
|
||||
commands += _append_unique_value(env_name, value)
|
||||
else:
|
||||
commands += _prepend_unique_value(env_name, value)
|
||||
else:
|
||||
raise RuntimeError(
|
||||
'contains an unknown environment hook type: ' + type_)
|
||||
return commands
|
||||
|
||||
|
||||
env_state = {}
|
||||
|
||||
|
||||
def _append_unique_value(name, value):
|
||||
global env_state
|
||||
if name not in env_state:
|
||||
if os.environ.get(name):
|
||||
env_state[name] = set(os.environ[name].split(os.pathsep))
|
||||
else:
|
||||
env_state[name] = set()
|
||||
# append even if the variable has not been set yet, in case a shell script sets the
|
||||
# same variable without the knowledge of this Python script.
|
||||
# later _remove_ending_separators() will cleanup any unintentional leading separator
|
||||
extend = FORMAT_STR_USE_ENV_VAR.format_map({'name': name}) + os.pathsep
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': extend + value})
|
||||
if value not in env_state[name]:
|
||||
env_state[name].add(value)
|
||||
else:
|
||||
if not _include_comments():
|
||||
return []
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
def _prepend_unique_value(name, value):
|
||||
global env_state
|
||||
if name not in env_state:
|
||||
if os.environ.get(name):
|
||||
env_state[name] = set(os.environ[name].split(os.pathsep))
|
||||
else:
|
||||
env_state[name] = set()
|
||||
# prepend even if the variable has not been set yet, in case a shell script sets the
|
||||
# same variable without the knowledge of this Python script.
|
||||
# later _remove_ending_separators() will cleanup any unintentional trailing separator
|
||||
extend = os.pathsep + FORMAT_STR_USE_ENV_VAR.format_map({'name': name})
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value + extend})
|
||||
if value not in env_state[name]:
|
||||
env_state[name].add(value)
|
||||
else:
|
||||
if not _include_comments():
|
||||
return []
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
# generate commands for removing prepended underscores
|
||||
def _remove_ending_separators():
|
||||
# do nothing if the shell extension does not implement the logic
|
||||
if FORMAT_STR_REMOVE_TRAILING_SEPARATOR is None:
|
||||
return []
|
||||
|
||||
global env_state
|
||||
commands = []
|
||||
for name in env_state:
|
||||
# skip variables that already had values before this script started prepending
|
||||
if name in os.environ:
|
||||
continue
|
||||
commands += [
|
||||
FORMAT_STR_REMOVE_LEADING_SEPARATOR.format_map({'name': name}),
|
||||
FORMAT_STR_REMOVE_TRAILING_SEPARATOR.format_map({'name': name})]
|
||||
return commands
|
||||
|
||||
|
||||
def _set(name, value):
|
||||
global env_state
|
||||
env_state[name] = value
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value})
|
||||
return [line]
|
||||
|
||||
|
||||
def _set_if_unset(name, value):
|
||||
global env_state
|
||||
line = FORMAT_STR_SET_ENV_VAR.format_map(
|
||||
{'name': name, 'value': value})
|
||||
if env_state.get(name, os.environ.get(name)):
|
||||
line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
|
||||
return [line]
|
||||
|
||||
|
||||
if __name__ == '__main__': # pragma: no cover
|
||||
try:
|
||||
rc = main()
|
||||
except RuntimeError as e:
|
||||
print(str(e), file=sys.stderr)
|
||||
rc = 1
|
||||
sys.exit(rc)
|
||||
121
skylink_ros2_ws/install/local_setup.bash
Normal file
121
skylink_ros2_ws/install/local_setup.bash
Normal file
@@ -0,0 +1,121 @@
|
||||
# generated from colcon_bash/shell/template/prefix.bash.em
|
||||
|
||||
# This script extends the environment with all packages contained in this
|
||||
# prefix path.
|
||||
|
||||
# a bash script is able to determine its own path if necessary
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
_colcon_prefix_bash_COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
|
||||
else
|
||||
_colcon_prefix_bash_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
|
||||
# function to prepend a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as trailing separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
_colcon_prefix_bash_prepend_unique_value() {
|
||||
# arguments
|
||||
_listname="$1"
|
||||
_value="$2"
|
||||
|
||||
# get values from variable
|
||||
eval _values=\"\$$_listname\"
|
||||
# backup the field separator
|
||||
_colcon_prefix_bash_prepend_unique_value_IFS="$IFS"
|
||||
IFS=":"
|
||||
# start with the new value
|
||||
_all_values="$_value"
|
||||
_contained_value=""
|
||||
# iterate over existing values in the variable
|
||||
for _item in $_values; do
|
||||
# ignore empty strings
|
||||
if [ -z "$_item" ]; then
|
||||
continue
|
||||
fi
|
||||
# ignore duplicates of _value
|
||||
if [ "$_item" = "$_value" ]; then
|
||||
_contained_value=1
|
||||
continue
|
||||
fi
|
||||
# keep non-duplicate values
|
||||
_all_values="$_all_values:$_item"
|
||||
done
|
||||
unset _item
|
||||
if [ -z "$_contained_value" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
if [ "$_all_values" = "$_value" ]; then
|
||||
echo "export $_listname=$_value"
|
||||
else
|
||||
echo "export $_listname=$_value:\$$_listname"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
unset _contained_value
|
||||
# restore the field separator
|
||||
IFS="$_colcon_prefix_bash_prepend_unique_value_IFS"
|
||||
unset _colcon_prefix_bash_prepend_unique_value_IFS
|
||||
# export the updated variable
|
||||
eval export $_listname=\"$_all_values\"
|
||||
unset _all_values
|
||||
unset _values
|
||||
|
||||
unset _value
|
||||
unset _listname
|
||||
}
|
||||
|
||||
# add this prefix to the COLCON_PREFIX_PATH
|
||||
_colcon_prefix_bash_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX"
|
||||
unset _colcon_prefix_bash_prepend_unique_value
|
||||
|
||||
# check environment variable for custom Python executable
|
||||
if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
|
||||
else
|
||||
# try the Python executable known at configure time
|
||||
_colcon_python_executable="/usr/bin/python3"
|
||||
# if it doesn't exist try a fall back
|
||||
if [ ! -f "$_colcon_python_executable" ]; then
|
||||
if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
|
||||
echo "error: unable to find python3 executable"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_sh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# get all commands in topological order
|
||||
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"
|
||||
unset _colcon_python_executable
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "$(declare -f _colcon_prefix_sh_source_script)"
|
||||
echo "# Execute generated script:"
|
||||
echo "# <<<"
|
||||
echo "${_colcon_ordered_commands}"
|
||||
echo "# >>>"
|
||||
echo "unset _colcon_prefix_sh_source_script"
|
||||
fi
|
||||
eval "${_colcon_ordered_commands}"
|
||||
unset _colcon_ordered_commands
|
||||
|
||||
unset _colcon_prefix_sh_source_script
|
||||
|
||||
unset _colcon_prefix_bash_COLCON_CURRENT_PREFIX
|
||||
55
skylink_ros2_ws/install/local_setup.ps1
Normal file
55
skylink_ros2_ws/install/local_setup.ps1
Normal file
@@ -0,0 +1,55 @@
|
||||
# generated from colcon_powershell/shell/template/prefix.ps1.em
|
||||
|
||||
# This script extends the environment with all packages contained in this
|
||||
# prefix path.
|
||||
|
||||
# check environment variable for custom Python executable
|
||||
if ($env:COLCON_PYTHON_EXECUTABLE) {
|
||||
if (!(Test-Path "$env:COLCON_PYTHON_EXECUTABLE" -PathType Leaf)) {
|
||||
echo "error: COLCON_PYTHON_EXECUTABLE '$env:COLCON_PYTHON_EXECUTABLE' doesn't exist"
|
||||
exit 1
|
||||
}
|
||||
$_colcon_python_executable="$env:COLCON_PYTHON_EXECUTABLE"
|
||||
} else {
|
||||
# use the Python executable known at configure time
|
||||
$_colcon_python_executable="/usr/bin/python3"
|
||||
# if it doesn't exist try a fall back
|
||||
if (!(Test-Path "$_colcon_python_executable" -PathType Leaf)) {
|
||||
if (!(Get-Command "python3" -ErrorAction SilentlyContinue)) {
|
||||
echo "error: unable to find python3 executable"
|
||||
exit 1
|
||||
}
|
||||
$_colcon_python_executable="python3"
|
||||
}
|
||||
}
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
function _colcon_prefix_powershell_source_script {
|
||||
param (
|
||||
$_colcon_prefix_powershell_source_script_param
|
||||
)
|
||||
# source script with conditional trace output
|
||||
if (Test-Path $_colcon_prefix_powershell_source_script_param) {
|
||||
if ($env:COLCON_TRACE) {
|
||||
echo ". '$_colcon_prefix_powershell_source_script_param'"
|
||||
}
|
||||
. "$_colcon_prefix_powershell_source_script_param"
|
||||
} else {
|
||||
Write-Error "not found: '$_colcon_prefix_powershell_source_script_param'"
|
||||
}
|
||||
}
|
||||
|
||||
# get all commands in topological order
|
||||
$_colcon_ordered_commands = & "$_colcon_python_executable" "$(Split-Path $PSCommandPath -Parent)/_local_setup_util_ps1.py" ps1
|
||||
|
||||
# execute all commands in topological order
|
||||
if ($env:COLCON_TRACE) {
|
||||
echo "Execute generated script:"
|
||||
echo "<<<"
|
||||
$_colcon_ordered_commands.Split([Environment]::NewLine, [StringSplitOptions]::RemoveEmptyEntries) | Write-Output
|
||||
echo ">>>"
|
||||
}
|
||||
if ($_colcon_ordered_commands) {
|
||||
$_colcon_ordered_commands.Split([Environment]::NewLine, [StringSplitOptions]::RemoveEmptyEntries) | Invoke-Expression
|
||||
}
|
||||
137
skylink_ros2_ws/install/local_setup.sh
Normal file
137
skylink_ros2_ws/install/local_setup.sh
Normal file
@@ -0,0 +1,137 @@
|
||||
# generated from colcon_core/shell/template/prefix.sh.em
|
||||
|
||||
# This script extends the environment with all packages contained in this
|
||||
# prefix path.
|
||||
|
||||
# since a plain shell script can't determine its own path when being sourced
|
||||
# either use the provided COLCON_CURRENT_PREFIX
|
||||
# or fall back to the build time prefix (if it exists)
|
||||
_colcon_prefix_sh_COLCON_CURRENT_PREFIX="/home/flower/code/camera/flyLink/skylink_ros2_ws/install"
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
if [ ! -d "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX" ]; then
|
||||
echo "The build time path \"$_colcon_prefix_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
|
||||
unset _colcon_prefix_sh_COLCON_CURRENT_PREFIX
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
_colcon_prefix_sh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
|
||||
# function to prepend a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as trailing separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
_colcon_prefix_sh_prepend_unique_value() {
|
||||
# arguments
|
||||
_listname="$1"
|
||||
_value="$2"
|
||||
|
||||
# get values from variable
|
||||
eval _values=\"\$$_listname\"
|
||||
# backup the field separator
|
||||
_colcon_prefix_sh_prepend_unique_value_IFS="$IFS"
|
||||
IFS=":"
|
||||
# start with the new value
|
||||
_all_values="$_value"
|
||||
_contained_value=""
|
||||
# iterate over existing values in the variable
|
||||
for _item in $_values; do
|
||||
# ignore empty strings
|
||||
if [ -z "$_item" ]; then
|
||||
continue
|
||||
fi
|
||||
# ignore duplicates of _value
|
||||
if [ "$_item" = "$_value" ]; then
|
||||
_contained_value=1
|
||||
continue
|
||||
fi
|
||||
# keep non-duplicate values
|
||||
_all_values="$_all_values:$_item"
|
||||
done
|
||||
unset _item
|
||||
if [ -z "$_contained_value" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
if [ "$_all_values" = "$_value" ]; then
|
||||
echo "export $_listname=$_value"
|
||||
else
|
||||
echo "export $_listname=$_value:\$$_listname"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
unset _contained_value
|
||||
# restore the field separator
|
||||
IFS="$_colcon_prefix_sh_prepend_unique_value_IFS"
|
||||
unset _colcon_prefix_sh_prepend_unique_value_IFS
|
||||
# export the updated variable
|
||||
eval export $_listname=\"$_all_values\"
|
||||
unset _all_values
|
||||
unset _values
|
||||
|
||||
unset _value
|
||||
unset _listname
|
||||
}
|
||||
|
||||
# add this prefix to the COLCON_PREFIX_PATH
|
||||
_colcon_prefix_sh_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX"
|
||||
unset _colcon_prefix_sh_prepend_unique_value
|
||||
|
||||
# check environment variable for custom Python executable
|
||||
if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
|
||||
else
|
||||
# try the Python executable known at configure time
|
||||
_colcon_python_executable="/usr/bin/python3"
|
||||
# if it doesn't exist try a fall back
|
||||
if [ ! -f "$_colcon_python_executable" ]; then
|
||||
if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
|
||||
echo "error: unable to find python3 executable"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_sh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# get all commands in topological order
|
||||
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh)"
|
||||
unset _colcon_python_executable
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "_colcon_prefix_sh_source_script() {
|
||||
if [ -f \"\$1\" ]; then
|
||||
if [ -n \"\$COLCON_TRACE\" ]; then
|
||||
echo \"# . \\\"\$1\\\"\"
|
||||
fi
|
||||
. \"\$1\"
|
||||
else
|
||||
echo \"not found: \\\"\$1\\\"\" 1>&2
|
||||
fi
|
||||
}"
|
||||
echo "# Execute generated script:"
|
||||
echo "# <<<"
|
||||
echo "${_colcon_ordered_commands}"
|
||||
echo "# >>>"
|
||||
echo "unset _colcon_prefix_sh_source_script"
|
||||
fi
|
||||
eval "${_colcon_ordered_commands}"
|
||||
unset _colcon_ordered_commands
|
||||
|
||||
unset _colcon_prefix_sh_source_script
|
||||
|
||||
unset _colcon_prefix_sh_COLCON_CURRENT_PREFIX
|
||||
134
skylink_ros2_ws/install/local_setup.zsh
Normal file
134
skylink_ros2_ws/install/local_setup.zsh
Normal file
@@ -0,0 +1,134 @@
|
||||
# generated from colcon_zsh/shell/template/prefix.zsh.em
|
||||
|
||||
# This script extends the environment with all packages contained in this
|
||||
# prefix path.
|
||||
|
||||
# a zsh script is able to determine its own path if necessary
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
_colcon_prefix_zsh_COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`" > /dev/null && pwd)"
|
||||
else
|
||||
_colcon_prefix_zsh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
|
||||
# function to convert array-like strings into arrays
|
||||
# to workaround SH_WORD_SPLIT not being set
|
||||
_colcon_prefix_zsh_convert_to_array() {
|
||||
local _listname=$1
|
||||
local _dollar="$"
|
||||
local _split="{="
|
||||
local _to_array="(\"$_dollar$_split$_listname}\")"
|
||||
eval $_listname=$_to_array
|
||||
}
|
||||
|
||||
# function to prepend a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as trailing separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
_colcon_prefix_zsh_prepend_unique_value() {
|
||||
# arguments
|
||||
_listname="$1"
|
||||
_value="$2"
|
||||
|
||||
# get values from variable
|
||||
eval _values=\"\$$_listname\"
|
||||
# backup the field separator
|
||||
_colcon_prefix_zsh_prepend_unique_value_IFS="$IFS"
|
||||
IFS=":"
|
||||
# start with the new value
|
||||
_all_values="$_value"
|
||||
_contained_value=""
|
||||
# workaround SH_WORD_SPLIT not being set
|
||||
_colcon_prefix_zsh_convert_to_array _values
|
||||
# iterate over existing values in the variable
|
||||
for _item in $_values; do
|
||||
# ignore empty strings
|
||||
if [ -z "$_item" ]; then
|
||||
continue
|
||||
fi
|
||||
# ignore duplicates of _value
|
||||
if [ "$_item" = "$_value" ]; then
|
||||
_contained_value=1
|
||||
continue
|
||||
fi
|
||||
# keep non-duplicate values
|
||||
_all_values="$_all_values:$_item"
|
||||
done
|
||||
unset _item
|
||||
if [ -z "$_contained_value" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
if [ "$_all_values" = "$_value" ]; then
|
||||
echo "export $_listname=$_value"
|
||||
else
|
||||
echo "export $_listname=$_value:\$$_listname"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
unset _contained_value
|
||||
# restore the field separator
|
||||
IFS="$_colcon_prefix_zsh_prepend_unique_value_IFS"
|
||||
unset _colcon_prefix_zsh_prepend_unique_value_IFS
|
||||
# export the updated variable
|
||||
eval export $_listname=\"$_all_values\"
|
||||
unset _all_values
|
||||
unset _values
|
||||
|
||||
unset _value
|
||||
unset _listname
|
||||
}
|
||||
|
||||
# add this prefix to the COLCON_PREFIX_PATH
|
||||
_colcon_prefix_zsh_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_zsh_COLCON_CURRENT_PREFIX"
|
||||
unset _colcon_prefix_zsh_prepend_unique_value
|
||||
unset _colcon_prefix_zsh_convert_to_array
|
||||
|
||||
# check environment variable for custom Python executable
|
||||
if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
|
||||
echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
|
||||
else
|
||||
# try the Python executable known at configure time
|
||||
_colcon_python_executable="/usr/bin/python3"
|
||||
# if it doesn't exist try a fall back
|
||||
if [ ! -f "$_colcon_python_executable" ]; then
|
||||
if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
|
||||
echo "error: unable to find python3 executable"
|
||||
return 1
|
||||
fi
|
||||
_colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_sh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# get all commands in topological order
|
||||
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_zsh_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh zsh)"
|
||||
unset _colcon_python_executable
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "$(declare -f _colcon_prefix_sh_source_script)"
|
||||
echo "# Execute generated script:"
|
||||
echo "# <<<"
|
||||
echo "${_colcon_ordered_commands}"
|
||||
echo "# >>>"
|
||||
echo "unset _colcon_prefix_sh_source_script"
|
||||
fi
|
||||
eval "${_colcon_ordered_commands}"
|
||||
unset _colcon_ordered_commands
|
||||
|
||||
unset _colcon_prefix_sh_source_script
|
||||
|
||||
unset _colcon_prefix_zsh_COLCON_CURRENT_PREFIX
|
||||
31
skylink_ros2_ws/install/setup.bash
Normal file
31
skylink_ros2_ws/install/setup.bash
Normal file
@@ -0,0 +1,31 @@
|
||||
# generated from colcon_bash/shell/template/prefix_chain.bash.em
|
||||
|
||||
# This script extends the environment with the environment of other prefix
|
||||
# paths which were sourced when this file was generated as well as all packages
|
||||
# contained in this prefix path.
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_chain_bash_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# source chained prefixes
|
||||
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
|
||||
COLCON_CURRENT_PREFIX="/opt/ros/humble"
|
||||
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
|
||||
|
||||
# source this prefix
|
||||
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
|
||||
COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
|
||||
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
|
||||
|
||||
unset COLCON_CURRENT_PREFIX
|
||||
unset _colcon_prefix_chain_bash_source_script
|
||||
29
skylink_ros2_ws/install/setup.ps1
Normal file
29
skylink_ros2_ws/install/setup.ps1
Normal file
@@ -0,0 +1,29 @@
|
||||
# generated from colcon_powershell/shell/template/prefix_chain.ps1.em
|
||||
|
||||
# This script extends the environment with the environment of other prefix
|
||||
# paths which were sourced when this file was generated as well as all packages
|
||||
# contained in this prefix path.
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
function _colcon_prefix_chain_powershell_source_script {
|
||||
param (
|
||||
$_colcon_prefix_chain_powershell_source_script_param
|
||||
)
|
||||
# source script with conditional trace output
|
||||
if (Test-Path $_colcon_prefix_chain_powershell_source_script_param) {
|
||||
if ($env:COLCON_TRACE) {
|
||||
echo ". '$_colcon_prefix_chain_powershell_source_script_param'"
|
||||
}
|
||||
. "$_colcon_prefix_chain_powershell_source_script_param"
|
||||
} else {
|
||||
Write-Error "not found: '$_colcon_prefix_chain_powershell_source_script_param'"
|
||||
}
|
||||
}
|
||||
|
||||
# source chained prefixes
|
||||
_colcon_prefix_chain_powershell_source_script "/opt/ros/humble\local_setup.ps1"
|
||||
|
||||
# source this prefix
|
||||
$env:COLCON_CURRENT_PREFIX=(Split-Path $PSCommandPath -Parent)
|
||||
_colcon_prefix_chain_powershell_source_script "$env:COLCON_CURRENT_PREFIX\local_setup.ps1"
|
||||
45
skylink_ros2_ws/install/setup.sh
Normal file
45
skylink_ros2_ws/install/setup.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
# generated from colcon_core/shell/template/prefix_chain.sh.em
|
||||
|
||||
# This script extends the environment with the environment of other prefix
|
||||
# paths which were sourced when this file was generated as well as all packages
|
||||
# contained in this prefix path.
|
||||
|
||||
# since a plain shell script can't determine its own path when being sourced
|
||||
# either use the provided COLCON_CURRENT_PREFIX
|
||||
# or fall back to the build time prefix (if it exists)
|
||||
_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/home/flower/code/camera/flyLink/skylink_ros2_ws/install
|
||||
if [ ! -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
elif [ ! -d "$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX" ]; then
|
||||
echo "The build time path \"$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
|
||||
unset _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX
|
||||
return 1
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_chain_sh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# source chained prefixes
|
||||
# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script
|
||||
COLCON_CURRENT_PREFIX="/opt/ros/humble"
|
||||
_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh"
|
||||
|
||||
|
||||
# source this prefix
|
||||
# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script
|
||||
COLCON_CURRENT_PREFIX="$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX"
|
||||
_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh"
|
||||
|
||||
unset _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX
|
||||
unset _colcon_prefix_chain_sh_source_script
|
||||
unset COLCON_CURRENT_PREFIX
|
||||
31
skylink_ros2_ws/install/setup.zsh
Normal file
31
skylink_ros2_ws/install/setup.zsh
Normal file
@@ -0,0 +1,31 @@
|
||||
# generated from colcon_zsh/shell/template/prefix_chain.zsh.em
|
||||
|
||||
# This script extends the environment with the environment of other prefix
|
||||
# paths which were sourced when this file was generated as well as all packages
|
||||
# contained in this prefix path.
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
_colcon_prefix_chain_zsh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$1"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# source chained prefixes
|
||||
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
|
||||
COLCON_CURRENT_PREFIX="/opt/ros/humble"
|
||||
_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh"
|
||||
|
||||
# source this prefix
|
||||
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
|
||||
COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`" > /dev/null && pwd)"
|
||||
_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh"
|
||||
|
||||
unset COLCON_CURRENT_PREFIX
|
||||
unset _colcon_prefix_chain_zsh_source_script
|
||||
@@ -0,0 +1,2 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
.
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/python3
|
||||
# EASY-INSTALL-ENTRY-SCRIPT: 'skylink-bridge-python','console_scripts','camera_driver_node'
|
||||
import re
|
||||
import sys
|
||||
|
||||
# for compatibility with easy_install; see #2198
|
||||
__requires__ = 'skylink-bridge-python'
|
||||
|
||||
try:
|
||||
from importlib.metadata import distribution
|
||||
except ImportError:
|
||||
try:
|
||||
from importlib_metadata import distribution
|
||||
except ImportError:
|
||||
from pkg_resources import load_entry_point
|
||||
|
||||
|
||||
def importlib_load_entry_point(spec, group, name):
|
||||
dist_name, _, _ = spec.partition('==')
|
||||
matches = (
|
||||
entry_point
|
||||
for entry_point in distribution(dist_name).entry_points
|
||||
if entry_point.group == group and entry_point.name == name
|
||||
)
|
||||
return next(matches).load()
|
||||
|
||||
|
||||
globals().setdefault('load_entry_point', importlib_load_entry_point)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||
sys.exit(load_entry_point('skylink-bridge-python', 'console_scripts', 'camera_driver_node')())
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/resource/skylink_bridge_python
|
||||
@@ -0,0 +1 @@
|
||||
python3-opencv:rclpy:sensor_msgs:std_msgs:std_srvs
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml
|
||||
@@ -0,0 +1 @@
|
||||
prepend-non-duplicate;AMENT_PREFIX_PATH;
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
|
||||
|
||||
colcon_prepend_unique_value AMENT_PREFIX_PATH "$env:COLCON_CURRENT_PREFIX"
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_core/shell/template/hook_prepend_value.sh.em
|
||||
|
||||
_colcon_prepend_unique_value AMENT_PREFIX_PATH "$COLCON_CURRENT_PREFIX"
|
||||
@@ -0,0 +1 @@
|
||||
prepend-non-duplicate;PYTHONPATH;lib/python3.10/site-packages
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
|
||||
|
||||
colcon_prepend_unique_value PYTHONPATH "$env:COLCON_CURRENT_PREFIX\lib/python3.10/site-packages"
|
||||
@@ -0,0 +1,3 @@
|
||||
# generated from colcon_core/shell/template/hook_prepend_value.sh.em
|
||||
|
||||
_colcon_prepend_unique_value PYTHONPATH "$COLCON_CURRENT_PREFIX/lib/python3.10/site-packages"
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/launch/bridge.launch.py
|
||||
@@ -0,0 +1,31 @@
|
||||
# generated from colcon_bash/shell/template/package.bash.em
|
||||
|
||||
# This script extends the environment for this package.
|
||||
|
||||
# a bash script is able to determine its own path if necessary
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
# the prefix is two levels up from the package specific share directory
|
||||
_colcon_package_bash_COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`/../.." > /dev/null && pwd)"
|
||||
else
|
||||
_colcon_package_bash_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
# additional arguments: arguments to the script
|
||||
_colcon_package_bash_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$@"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# source sh script of this package
|
||||
_colcon_package_bash_source_script "$_colcon_package_bash_COLCON_CURRENT_PREFIX/share/skylink_bridge_python/package.sh"
|
||||
|
||||
unset _colcon_package_bash_source_script
|
||||
unset _colcon_package_bash_COLCON_CURRENT_PREFIX
|
||||
@@ -0,0 +1,9 @@
|
||||
source;share/skylink_bridge_python/hook/pythonpath.ps1
|
||||
source;share/skylink_bridge_python/hook/pythonpath.dsv
|
||||
source;share/skylink_bridge_python/hook/pythonpath.sh
|
||||
source;share/skylink_bridge_python/hook/ament_prefix_path.ps1
|
||||
source;share/skylink_bridge_python/hook/ament_prefix_path.dsv
|
||||
source;share/skylink_bridge_python/hook/ament_prefix_path.sh
|
||||
source;../../build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.ps1
|
||||
source;../../build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.dsv
|
||||
source;../../build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.sh
|
||||
@@ -0,0 +1,117 @@
|
||||
# generated from colcon_powershell/shell/template/package.ps1.em
|
||||
|
||||
# function to append a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as leading separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
function colcon_append_unique_value {
|
||||
param (
|
||||
$_listname,
|
||||
$_value
|
||||
)
|
||||
|
||||
# get values from variable
|
||||
if (Test-Path Env:$_listname) {
|
||||
$_values=(Get-Item env:$_listname).Value
|
||||
} else {
|
||||
$_values=""
|
||||
}
|
||||
$_duplicate=""
|
||||
# start with no values
|
||||
$_all_values=""
|
||||
# iterate over existing values in the variable
|
||||
if ($_values) {
|
||||
$_values.Split(";") | ForEach {
|
||||
# not an empty string
|
||||
if ($_) {
|
||||
# not a duplicate of _value
|
||||
if ($_ -eq $_value) {
|
||||
$_duplicate="1"
|
||||
}
|
||||
if ($_all_values) {
|
||||
$_all_values="${_all_values};$_"
|
||||
} else {
|
||||
$_all_values="$_"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
# append only non-duplicates
|
||||
if (!$_duplicate) {
|
||||
# avoid leading separator
|
||||
if ($_all_values) {
|
||||
$_all_values="${_all_values};${_value}"
|
||||
} else {
|
||||
$_all_values="${_value}"
|
||||
}
|
||||
}
|
||||
|
||||
# export the updated variable
|
||||
Set-Item env:\$_listname -Value "$_all_values"
|
||||
}
|
||||
|
||||
# function to prepend a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as trailing separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
function colcon_prepend_unique_value {
|
||||
param (
|
||||
$_listname,
|
||||
$_value
|
||||
)
|
||||
|
||||
# get values from variable
|
||||
if (Test-Path Env:$_listname) {
|
||||
$_values=(Get-Item env:$_listname).Value
|
||||
} else {
|
||||
$_values=""
|
||||
}
|
||||
# start with the new value
|
||||
$_all_values="$_value"
|
||||
# iterate over existing values in the variable
|
||||
if ($_values) {
|
||||
$_values.Split(";") | ForEach {
|
||||
# not an empty string
|
||||
if ($_) {
|
||||
# not a duplicate of _value
|
||||
if ($_ -ne $_value) {
|
||||
# keep non-duplicate values
|
||||
$_all_values="${_all_values};$_"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
# export the updated variable
|
||||
Set-Item env:\$_listname -Value "$_all_values"
|
||||
}
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
# additional arguments: arguments to the script
|
||||
function colcon_package_source_powershell_script {
|
||||
param (
|
||||
$_colcon_package_source_powershell_script
|
||||
)
|
||||
# source script with conditional trace output
|
||||
if (Test-Path $_colcon_package_source_powershell_script) {
|
||||
if ($env:COLCON_TRACE) {
|
||||
echo ". '$_colcon_package_source_powershell_script'"
|
||||
}
|
||||
. "$_colcon_package_source_powershell_script"
|
||||
} else {
|
||||
Write-Error "not found: '$_colcon_package_source_powershell_script'"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# a powershell script is able to determine its own path
|
||||
# the prefix is two levels up from the package specific share directory
|
||||
$env:COLCON_CURRENT_PREFIX=(Get-Item $PSCommandPath).Directory.Parent.Parent.FullName
|
||||
|
||||
colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/skylink_bridge_python/hook/pythonpath.ps1"
|
||||
colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/skylink_bridge_python/hook/ament_prefix_path.ps1"
|
||||
colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\../../build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.ps1"
|
||||
|
||||
Remove-Item Env:\COLCON_CURRENT_PREFIX
|
||||
@@ -0,0 +1,88 @@
|
||||
# generated from colcon_core/shell/template/package.sh.em
|
||||
|
||||
# This script extends the environment for this package.
|
||||
|
||||
# function to prepend a value to a variable
|
||||
# which uses colons as separators
|
||||
# duplicates as well as trailing separators are avoided
|
||||
# first argument: the name of the result variable
|
||||
# second argument: the value to be prepended
|
||||
_colcon_prepend_unique_value() {
|
||||
# arguments
|
||||
_listname="$1"
|
||||
_value="$2"
|
||||
|
||||
# get values from variable
|
||||
eval _values=\"\$$_listname\"
|
||||
# backup the field separator
|
||||
_colcon_prepend_unique_value_IFS=$IFS
|
||||
IFS=":"
|
||||
# start with the new value
|
||||
_all_values="$_value"
|
||||
# workaround SH_WORD_SPLIT not being set in zsh
|
||||
if [ "$(command -v colcon_zsh_convert_to_array)" ]; then
|
||||
colcon_zsh_convert_to_array _values
|
||||
fi
|
||||
# iterate over existing values in the variable
|
||||
for _item in $_values; do
|
||||
# ignore empty strings
|
||||
if [ -z "$_item" ]; then
|
||||
continue
|
||||
fi
|
||||
# ignore duplicates of _value
|
||||
if [ "$_item" = "$_value" ]; then
|
||||
continue
|
||||
fi
|
||||
# keep non-duplicate values
|
||||
_all_values="$_all_values:$_item"
|
||||
done
|
||||
unset _item
|
||||
# restore the field separator
|
||||
IFS=$_colcon_prepend_unique_value_IFS
|
||||
unset _colcon_prepend_unique_value_IFS
|
||||
# export the updated variable
|
||||
eval export $_listname=\"$_all_values\"
|
||||
unset _all_values
|
||||
unset _values
|
||||
|
||||
unset _value
|
||||
unset _listname
|
||||
}
|
||||
|
||||
# since a plain shell script can't determine its own path when being sourced
|
||||
# either use the provided COLCON_CURRENT_PREFIX
|
||||
# or fall back to the build time prefix (if it exists)
|
||||
_colcon_package_sh_COLCON_CURRENT_PREFIX="/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python"
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
if [ ! -d "$_colcon_package_sh_COLCON_CURRENT_PREFIX" ]; then
|
||||
echo "The build time path \"$_colcon_package_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
|
||||
unset _colcon_package_sh_COLCON_CURRENT_PREFIX
|
||||
return 1
|
||||
fi
|
||||
COLCON_CURRENT_PREFIX="$_colcon_package_sh_COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
unset _colcon_package_sh_COLCON_CURRENT_PREFIX
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
# additional arguments: arguments to the script
|
||||
_colcon_package_sh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$@"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# source sh hooks
|
||||
_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/skylink_bridge_python/hook/pythonpath.sh"
|
||||
_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/skylink_bridge_python/hook/ament_prefix_path.sh"
|
||||
_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/../../build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.sh"
|
||||
|
||||
unset _colcon_package_sh_source_script
|
||||
unset COLCON_CURRENT_PREFIX
|
||||
|
||||
# do not unset _colcon_prepend_unique_value since it might be used by non-primary shell hooks
|
||||
@@ -0,0 +1 @@
|
||||
/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/package.xml
|
||||
@@ -0,0 +1,42 @@
|
||||
# generated from colcon_zsh/shell/template/package.zsh.em
|
||||
|
||||
# This script extends the environment for this package.
|
||||
|
||||
# a zsh script is able to determine its own path if necessary
|
||||
if [ -z "$COLCON_CURRENT_PREFIX" ]; then
|
||||
# the prefix is two levels up from the package specific share directory
|
||||
_colcon_package_zsh_COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`/../.." > /dev/null && pwd)"
|
||||
else
|
||||
_colcon_package_zsh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
|
||||
fi
|
||||
|
||||
# function to source another script with conditional trace output
|
||||
# first argument: the path of the script
|
||||
# additional arguments: arguments to the script
|
||||
_colcon_package_zsh_source_script() {
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$COLCON_TRACE" ]; then
|
||||
echo "# . \"$1\""
|
||||
fi
|
||||
. "$@"
|
||||
else
|
||||
echo "not found: \"$1\"" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# function to convert array-like strings into arrays
|
||||
# to workaround SH_WORD_SPLIT not being set
|
||||
colcon_zsh_convert_to_array() {
|
||||
local _listname=$1
|
||||
local _dollar="$"
|
||||
local _split="{="
|
||||
local _to_array="(\"$_dollar$_split$_listname}\")"
|
||||
eval $_listname=$_to_array
|
||||
}
|
||||
|
||||
# source sh script of this package
|
||||
_colcon_package_zsh_source_script "$_colcon_package_zsh_COLCON_CURRENT_PREFIX/share/skylink_bridge_python/package.sh"
|
||||
unset convert_zsh_to_array
|
||||
|
||||
unset _colcon_package_zsh_source_script
|
||||
unset _colcon_package_zsh_COLCON_CURRENT_PREFIX
|
||||
0
skylink_ros2_ws/log/COLCON_IGNORE
Normal file
0
skylink_ros2_ws/log/COLCON_IGNORE
Normal file
37
skylink_ros2_ws/log/build_2026-02-02_13-52-27/events.log
Normal file
37
skylink_ros2_ws/log/build_2026-02-02_13-52-27/events.log
Normal file
File diff suppressed because one or more lines are too long
132
skylink_ros2_ws/log/build_2026-02-02_13-52-27/logger_all.log
Normal file
132
skylink_ros2_ws/log/build_2026-02-02_13-52-27/logger_all.log
Normal file
@@ -0,0 +1,132 @@
|
||||
[0.045s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--symlink-install', '--cmake-args', '-DCMAKE_BUILD_TYPE=Release']
|
||||
[0.045s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=None, packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=['-DCMAKE_BUILD_TYPE=Release'], cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=<colcon_defaults.argument_parser.defaults.DefaultArgumentsDecorator object at 0x70ac7cf68100>, verb_extension=<colcon_core.verb.build.BuildVerb object at 0x70ac7cf330a0>, main=<bound method BuildVerb.main of <colcon_core.verb.build.BuildVerb object at 0x70ac7cf330a0>>)
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover
|
||||
[0.116s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/home/flower/code/camera/flyLink/skylink_ros2_ws'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore_ament_install'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_pkg']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_pkg'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_meta']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_meta'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ros']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ros'
|
||||
[0.123s] DEBUG:colcon.colcon_core.package_identification:Package 'src/skylink_bridge_python' with type 'ros.ament_python' and name 'skylink_bridge_python'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults
|
||||
[0.136s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) check parameters
|
||||
[0.136s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) discover
|
||||
[0.136s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' in the environment variable AMENT_PREFIX_PATH doesn't exist
|
||||
[0.137s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 0 installed packages in /home/flower/code/camera/flyLink/skylink_ros2_ws/install
|
||||
[0.137s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 281 installed packages in /opt/ros/humble
|
||||
[0.138s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) using defaults
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_args' from command line to '['-DCMAKE_BUILD_TYPE=Release']'
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target' from command line to 'None'
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target_skip_unavailable' from command line to 'False'
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_cache' from command line to 'False'
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_first' from command line to 'False'
|
||||
[0.153s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_force_configure' from command line to 'False'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'ament_cmake_args' from command line to 'None'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_cmake_args' from command line to 'None'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_skip_building_tests' from command line to 'False'
|
||||
[0.154s] DEBUG:colcon.colcon_core.verb:Building package 'skylink_bridge_python' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': ['-DCMAKE_BUILD_TYPE=Release'], 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python', 'merge_install': False, 'path': '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python', 'symlink_install': True, 'test_result_base': None}
|
||||
[0.154s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor
|
||||
[0.154s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete
|
||||
[0.154s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python' with build type 'ament_python'
|
||||
[0.155s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'ament_prefix_path')
|
||||
[0.155s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.ps1'
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.dsv'
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.sh'
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.157s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.270s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python'
|
||||
[0.270s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.270s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.418s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.612s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath_develop')
|
||||
[0.612s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.ps1'
|
||||
[0.612s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.612s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.dsv'
|
||||
[0.612s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.sh'
|
||||
[0.613s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake module files
|
||||
[0.614s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake config files
|
||||
[0.614s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib'
|
||||
[0.614s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.614s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/pkgconfig/skylink_bridge_python.pc'
|
||||
[0.614s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages'
|
||||
[0.614s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath')
|
||||
[0.614s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.ps1'
|
||||
[0.614s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.dsv'
|
||||
[0.614s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.sh'
|
||||
[0.615s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.615s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(skylink_bridge_python)
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.ps1'
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating package descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.dsv'
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.sh'
|
||||
[0.616s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.bash'
|
||||
[0.616s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.zsh'
|
||||
[0.616s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/colcon-core/packages/skylink_bridge_python)
|
||||
[0.616s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop
|
||||
[0.616s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed
|
||||
[0.616s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0'
|
||||
[0.616s] DEBUG:colcon.colcon_core.event_reactor:joining thread
|
||||
[0.619s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
|
||||
[0.619s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
|
||||
[0.619s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2'
|
||||
[0.626s] DEBUG:colcon.colcon_core.event_reactor:joined thread
|
||||
[0.626s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.ps1'
|
||||
[0.626s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_ps1.py'
|
||||
[0.627s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.ps1'
|
||||
[0.627s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.sh'
|
||||
[0.627s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_sh.py'
|
||||
[0.628s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.sh'
|
||||
[0.628s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.bash'
|
||||
[0.628s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.bash'
|
||||
[0.628s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.zsh'
|
||||
[0.629s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.zsh'
|
||||
@@ -0,0 +1,2 @@
|
||||
Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
@@ -0,0 +1,26 @@
|
||||
running develop
|
||||
running egg_info
|
||||
creating skylink_bridge_python.egg-info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/resource/skylink_bridge_python -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/package.xml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/launch/bridge.launch.py -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
@@ -0,0 +1,26 @@
|
||||
running develop
|
||||
running egg_info
|
||||
creating skylink_bridge_python.egg-info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/resource/skylink_bridge_python -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/package.xml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/launch/bridge.launch.py -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
@@ -0,0 +1,28 @@
|
||||
[0.263s] Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.379s] running develop
|
||||
[0.443s] running egg_info
|
||||
[0.443s] creating skylink_bridge_python.egg-info
|
||||
[0.443s] writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
[0.443s] writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
[0.443s] writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
[0.443s] writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
[0.443s] writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
[0.444s] writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.444s] reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.444s] writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.445s] running build_ext
|
||||
[0.445s] Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
[0.445s] Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
[0.445s]
|
||||
[0.445s] Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
[0.445s] running symlink_data
|
||||
[0.445s] creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index
|
||||
[0.445s] creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index
|
||||
[0.445s] creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
[0.446s] symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/resource/skylink_bridge_python -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/ament_index/resource_index/packages
|
||||
[0.446s] symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/package.xml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python
|
||||
[0.446s] creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
[0.446s] symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/launch/bridge.launch.py -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/launch
|
||||
[0.446s] creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
[0.446s] symbolically linking /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/config/params.yaml -> /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/config
|
||||
[0.457s] Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
26
skylink_ros2_ws/log/build_2026-02-02_14-07-50/events.log
Normal file
26
skylink_ros2_ws/log/build_2026-02-02_14-07-50/events.log
Normal file
File diff suppressed because one or more lines are too long
144
skylink_ros2_ws/log/build_2026-02-02_14-07-50/logger_all.log
Normal file
144
skylink_ros2_ws/log/build_2026-02-02_14-07-50/logger_all.log
Normal file
@@ -0,0 +1,144 @@
|
||||
[0.045s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--symlink-install', '--cmake-args', '-DCMAKE_BUILD_TYPE=Release']
|
||||
[0.045s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=None, packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=['-DCMAKE_BUILD_TYPE=Release'], cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=<colcon_defaults.argument_parser.defaults.DefaultArgumentsDecorator object at 0x7451b943ba30>, verb_extension=<colcon_core.verb.build.BuildVerb object at 0x7451b943aa10>, main=<bound method BuildVerb.main of <colcon_core.verb.build.BuildVerb object at 0x7451b943aa10>>)
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover
|
||||
[0.116s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover
|
||||
[0.116s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/home/flower/code/camera/flyLink/skylink_ros2_ws'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta'
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros']
|
||||
[0.116s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ignore'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ignore_ament_install'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['colcon_pkg']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'colcon_pkg'
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['colcon_meta']
|
||||
[0.121s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'colcon_meta'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['ros']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ros'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['cmake', 'python']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'cmake'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'python'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['python_setup_py']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'python_setup_py'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore_ament_install'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_pkg']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_pkg'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_meta']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_meta'
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ros']
|
||||
[0.122s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ros'
|
||||
[0.123s] DEBUG:colcon.colcon_core.package_identification:Package 'src/skylink_bridge_python' with type 'ros.ament_python' and name 'skylink_bridge_python'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover
|
||||
[0.123s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults
|
||||
[0.137s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) check parameters
|
||||
[0.137s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) discover
|
||||
[0.138s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 281 installed packages in /opt/ros/humble
|
||||
[0.139s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) using defaults
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_args' from command line to '['-DCMAKE_BUILD_TYPE=Release']'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target' from command line to 'None'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target_skip_unavailable' from command line to 'False'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_cache' from command line to 'False'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_first' from command line to 'False'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_force_configure' from command line to 'False'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'ament_cmake_args' from command line to 'None'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_cmake_args' from command line to 'None'
|
||||
[0.154s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_skip_building_tests' from command line to 'False'
|
||||
[0.154s] DEBUG:colcon.colcon_core.verb:Building package 'skylink_bridge_python' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': ['-DCMAKE_BUILD_TYPE=Release'], 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python', 'merge_install': False, 'path': '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python', 'symlink_install': True, 'test_result_base': None}
|
||||
[0.154s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor
|
||||
[0.155s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete
|
||||
[0.155s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python' with build type 'ament_python'
|
||||
[0.155s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'ament_prefix_path')
|
||||
[0.156s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.ps1'
|
||||
[0.156s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.dsv'
|
||||
[0.157s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.sh'
|
||||
[0.157s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.157s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.270s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python'
|
||||
[0.270s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.271s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.415s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.607s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath_develop')
|
||||
[0.607s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.ps1'
|
||||
[0.608s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.608s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.dsv'
|
||||
[0.608s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.sh'
|
||||
[0.609s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake module files
|
||||
[0.609s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake config files
|
||||
[0.609s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib'
|
||||
[0.609s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.610s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/pkgconfig/skylink_bridge_python.pc'
|
||||
[0.610s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages'
|
||||
[0.610s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath')
|
||||
[0.610s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.ps1'
|
||||
[0.610s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.dsv'
|
||||
[0.610s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.sh'
|
||||
[0.610s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.610s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(skylink_bridge_python)
|
||||
[0.611s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.ps1'
|
||||
[0.611s] INFO:colcon.colcon_core.shell:Creating package descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.dsv'
|
||||
[0.611s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.sh'
|
||||
[0.611s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.bash'
|
||||
[0.612s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.zsh'
|
||||
[0.612s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/colcon-core/packages/skylink_bridge_python)
|
||||
[0.612s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop
|
||||
[0.612s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed
|
||||
[0.612s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0'
|
||||
[0.612s] DEBUG:colcon.colcon_core.event_reactor:joining thread
|
||||
[0.615s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
|
||||
[0.615s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
|
||||
[0.615s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2'
|
||||
[0.622s] DEBUG:colcon.colcon_core.event_reactor:joined thread
|
||||
[0.622s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.ps1'
|
||||
[0.622s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_ps1.py'
|
||||
[0.623s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.ps1'
|
||||
[0.623s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.sh'
|
||||
[0.623s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_sh.py'
|
||||
[0.624s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.sh'
|
||||
[0.624s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.bash'
|
||||
[0.624s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.bash'
|
||||
[0.625s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.zsh'
|
||||
[0.625s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.zsh'
|
||||
@@ -0,0 +1,2 @@
|
||||
Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
@@ -0,0 +1,15 @@
|
||||
running develop
|
||||
running egg_info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
@@ -0,0 +1,15 @@
|
||||
running develop
|
||||
running egg_info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
@@ -0,0 +1,17 @@
|
||||
[0.260s] Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.374s] running develop
|
||||
[0.439s] running egg_info
|
||||
[0.439s] writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
[0.439s] writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
[0.439s] writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
[0.439s] writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
[0.439s] writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
[0.440s] reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.440s] writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.441s] running build_ext
|
||||
[0.441s] Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
[0.441s] Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
[0.441s]
|
||||
[0.441s] Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
[0.441s] running symlink_data
|
||||
[0.452s] Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
26
skylink_ros2_ws/log/build_2026-02-02_14-25-15/events.log
Normal file
26
skylink_ros2_ws/log/build_2026-02-02_14-25-15/events.log
Normal file
File diff suppressed because one or more lines are too long
145
skylink_ros2_ws/log/build_2026-02-02_14-25-15/logger_all.log
Normal file
145
skylink_ros2_ws/log/build_2026-02-02_14-25-15/logger_all.log
Normal file
@@ -0,0 +1,145 @@
|
||||
[0.046s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--symlink-install', '--cmake-args', '-DCMAKE_BUILD_TYPE=Release']
|
||||
[0.046s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=None, packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=['-DCMAKE_BUILD_TYPE=Release'], cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=<colcon_defaults.argument_parser.defaults.DefaultArgumentsDecorator object at 0x7f4f84a37ee0>, verb_extension=<colcon_core.verb.build.BuildVerb object at 0x7f4f84a36ec0>, main=<bound method BuildVerb.main of <colcon_core.verb.build.BuildVerb object at 0x7f4f84a36ec0>>)
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover
|
||||
[0.118s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover
|
||||
[0.118s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/home/flower/code/camera/flyLink/skylink_ros2_ws'
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore'
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install'
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg']
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg'
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta']
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta'
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros']
|
||||
[0.118s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ignore'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ignore_ament_install'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['colcon_pkg']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'colcon_pkg'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['colcon_meta']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'colcon_meta'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['ros']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'ros'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['cmake', 'python']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'cmake'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'python'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extensions ['python_setup_py']
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(camera_data) by extension 'python_setup_py'
|
||||
[0.123s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ignore', 'ignore_ament_install']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ignore_ament_install'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_pkg']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_pkg'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['colcon_meta']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'colcon_meta'
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extensions ['ros']
|
||||
[0.124s] Level 1:colcon.colcon_core.package_identification:_identify(src/skylink_bridge_python) by extension 'ros'
|
||||
[0.125s] DEBUG:colcon.colcon_core.package_identification:Package 'src/skylink_bridge_python' with type 'ros.ament_python' and name 'skylink_bridge_python'
|
||||
[0.125s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults
|
||||
[0.125s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover
|
||||
[0.125s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults
|
||||
[0.125s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover
|
||||
[0.125s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults
|
||||
[0.139s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) check parameters
|
||||
[0.139s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) discover
|
||||
[0.139s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 1 installed packages in /home/flower/code/camera/flyLink/skylink_ros2_ws/install
|
||||
[0.140s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 281 installed packages in /opt/ros/humble
|
||||
[0.141s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) using defaults
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_args' from command line to '['-DCMAKE_BUILD_TYPE=Release']'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target' from command line to 'None'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_target_skip_unavailable' from command line to 'False'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_cache' from command line to 'False'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_clean_first' from command line to 'False'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'cmake_force_configure' from command line to 'False'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'ament_cmake_args' from command line to 'None'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_cmake_args' from command line to 'None'
|
||||
[0.156s] Level 5:colcon.colcon_core.verb:set package 'skylink_bridge_python' build argument 'catkin_skip_building_tests' from command line to 'False'
|
||||
[0.156s] DEBUG:colcon.colcon_core.verb:Building package 'skylink_bridge_python' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': ['-DCMAKE_BUILD_TYPE=Release'], 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python', 'merge_install': False, 'path': '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python', 'symlink_install': True, 'test_result_base': None}
|
||||
[0.156s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor
|
||||
[0.157s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete
|
||||
[0.157s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python' with build type 'ament_python'
|
||||
[0.157s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'ament_prefix_path')
|
||||
[0.158s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
|
||||
[0.158s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.ps1'
|
||||
[0.158s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.dsv'
|
||||
[0.158s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/ament_prefix_path.sh'
|
||||
[0.159s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.159s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.272s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/home/flower/code/camera/flyLink/skylink_ros2_ws/src/skylink_bridge_python'
|
||||
[0.272s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
|
||||
[0.272s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
|
||||
[0.419s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.614s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath_develop')
|
||||
[0.614s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.ps1'
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.dsv'
|
||||
[0.615s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath_develop.sh'
|
||||
[0.617s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake module files
|
||||
[0.617s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python' for CMake config files
|
||||
[0.618s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib'
|
||||
[0.618s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.618s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/pkgconfig/skylink_bridge_python.pc'
|
||||
[0.618s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages'
|
||||
[0.618s] Level 1:colcon.colcon_core.shell:create_environment_hook('skylink_bridge_python', 'pythonpath')
|
||||
[0.618s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.ps1'
|
||||
[0.618s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.dsv'
|
||||
[0.619s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/hook/pythonpath.sh'
|
||||
[0.619s] Level 1:colcon.colcon_core.environment:checking '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/bin'
|
||||
[0.619s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(skylink_bridge_python)
|
||||
[0.619s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.ps1'
|
||||
[0.620s] INFO:colcon.colcon_core.shell:Creating package descriptor '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.dsv'
|
||||
[0.620s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.sh'
|
||||
[0.620s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.bash'
|
||||
[0.620s] INFO:colcon.colcon_core.shell:Creating package script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/skylink_bridge_python/package.zsh'
|
||||
[0.621s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/share/colcon-core/packages/skylink_bridge_python)
|
||||
[0.621s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop
|
||||
[0.621s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed
|
||||
[0.621s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0'
|
||||
[0.621s] DEBUG:colcon.colcon_core.event_reactor:joining thread
|
||||
[0.623s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
|
||||
[0.623s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
|
||||
[0.623s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2'
|
||||
[0.629s] DEBUG:colcon.colcon_core.event_reactor:joined thread
|
||||
[0.629s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.ps1'
|
||||
[0.630s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_ps1.py'
|
||||
[0.630s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.ps1'
|
||||
[0.631s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.sh'
|
||||
[0.631s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/_local_setup_util_sh.py'
|
||||
[0.631s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.sh'
|
||||
[0.631s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.bash'
|
||||
[0.632s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.bash'
|
||||
[0.632s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/local_setup.zsh'
|
||||
[0.632s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/flower/code/camera/flyLink/skylink_ros2_ws/install/setup.zsh'
|
||||
@@ -0,0 +1,2 @@
|
||||
Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
@@ -0,0 +1,15 @@
|
||||
running develop
|
||||
running egg_info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
@@ -0,0 +1,15 @@
|
||||
running develop
|
||||
running egg_info
|
||||
writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
running build_ext
|
||||
Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
|
||||
Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
running symlink_data
|
||||
@@ -0,0 +1,17 @@
|
||||
[0.262s] Invoking command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
[0.378s] running develop
|
||||
[0.444s] running egg_info
|
||||
[0.444s] writing skylink_bridge_python.egg-info/PKG-INFO
|
||||
[0.444s] writing dependency_links to skylink_bridge_python.egg-info/dependency_links.txt
|
||||
[0.444s] writing entry points to skylink_bridge_python.egg-info/entry_points.txt
|
||||
[0.444s] writing requirements to skylink_bridge_python.egg-info/requires.txt
|
||||
[0.444s] writing top-level names to skylink_bridge_python.egg-info/top_level.txt
|
||||
[0.445s] reading manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.445s] writing manifest file 'skylink_bridge_python.egg-info/SOURCES.txt'
|
||||
[0.446s] running build_ext
|
||||
[0.446s] Creating /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages/skylink-bridge-python.egg-link (link to .)
|
||||
[0.446s] Installing camera_driver_node script to /home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/skylink_bridge_python
|
||||
[0.446s]
|
||||
[0.446s] Installed /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python
|
||||
[0.446s] running symlink_data
|
||||
[0.457s] Invoked command in '/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python' returned '0': PYTHONPATH=/home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/flower/code/camera/flyLink/skylink_ros2_ws/install/skylink_bridge_python/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /home/flower/code/camera/flyLink/skylink_ros2_ws/build/skylink_bridge_python/build --no-deps symlink_data
|
||||
1
skylink_ros2_ws/log/latest
Symbolic link
1
skylink_ros2_ws/log/latest
Symbolic link
@@ -0,0 +1 @@
|
||||
latest_build
|
||||
1
skylink_ros2_ws/log/latest_build
Symbolic link
1
skylink_ros2_ws/log/latest_build
Symbolic link
@@ -0,0 +1 @@
|
||||
build_2026-02-02_14-25-15
|
||||
@@ -1,156 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(skylink_bridge LANGUAGES CXX)
|
||||
|
||||
# ============================================================================
|
||||
# 编译标准和优化选项
|
||||
# ============================================================================
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
|
||||
|
||||
# 如果未指定编译类型,默认为 Release
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
||||
endif()
|
||||
|
||||
# ============================================================================
|
||||
# 查找依赖
|
||||
# ============================================================================
|
||||
|
||||
find_package(ament_cmake REQUIRED)
|
||||
find_package(rclcpp REQUIRED)
|
||||
find_package(sensor_msgs REQUIRED)
|
||||
find_package(geometry_msgs REQUIRED)
|
||||
find_package(cv_bridge REQUIRED)
|
||||
find_package(image_transport REQUIRED)
|
||||
find_package(mavros_msgs REQUIRED)
|
||||
|
||||
# OpenCV
|
||||
find_package(OpenCV REQUIRED COMPONENTS core imgproc)
|
||||
|
||||
# JPEG 库
|
||||
find_package(JPEG REQUIRED)
|
||||
|
||||
# 线程库
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# ============================================================================
|
||||
# 包含目录
|
||||
# ============================================================================
|
||||
|
||||
include_directories(
|
||||
include
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# 源文件
|
||||
# ============================================================================
|
||||
|
||||
set(SOURCES
|
||||
src/udp_sender_node.cpp
|
||||
src/camera_driver_node.cpp
|
||||
src/device_info_sender_node.cpp
|
||||
)
|
||||
|
||||
set(HEADERS
|
||||
include/skylink_bridge/udp_sender_node.h
|
||||
include/skylink_bridge/device_info_sender_node.h
|
||||
include/protocol.h
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# 创建节点可执行文件
|
||||
# ============================================================================
|
||||
|
||||
add_executable(udp_sender_node src/udp_sender_node.cpp ${HEADERS})
|
||||
add_executable(camera_driver_node src/camera_driver_node.cpp)
|
||||
add_executable(device_info_sender_node src/device_info_sender_node.cpp)
|
||||
|
||||
# 链接库 - UDP Sender
|
||||
target_link_libraries(udp_sender_node
|
||||
${rclcpp_LIBRARIES}
|
||||
${sensor_msgs_LIBRARIES}
|
||||
${geometry_msgs_LIBRARIES}
|
||||
${cv_bridge_LIBRARIES}
|
||||
${image_transport_LIBRARIES}
|
||||
${mavros_msgs_LIBRARIES}
|
||||
${OpenCV_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
# 链接库 - Camera Driver
|
||||
target_link_libraries(camera_driver_node
|
||||
${rclcpp_LIBRARIES}
|
||||
${sensor_msgs_LIBRARIES}
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
target_link_libraries(device_info_sender_node
|
||||
${rclcpp_LIBRARIES}
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
# 目标级别的包含目录
|
||||
ament_target_dependencies(udp_sender_node
|
||||
rclcpp
|
||||
sensor_msgs
|
||||
geometry_msgs
|
||||
cv_bridge
|
||||
image_transport
|
||||
mavros_msgs
|
||||
)
|
||||
|
||||
ament_target_dependencies(camera_driver_node
|
||||
rclcpp
|
||||
sensor_msgs
|
||||
)
|
||||
|
||||
ament_target_dependencies(device_info_sender_node
|
||||
rclcpp
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# 安装规则
|
||||
# ============================================================================
|
||||
|
||||
# 安装可执行文件
|
||||
install(TARGETS udp_sender_node camera_driver_node
|
||||
DESTINATION lib/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
install(TARGETS device_info_sender_node
|
||||
DESTINATION lib/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
# 安装启动文件
|
||||
install(DIRECTORY launch/
|
||||
DESTINATION share/${PROJECT_NAME}/launch
|
||||
)
|
||||
|
||||
# 安装配置文件
|
||||
install(DIRECTORY config/
|
||||
DESTINATION share/${PROJECT_NAME}/config
|
||||
)
|
||||
|
||||
# 安装头文件
|
||||
install(DIRECTORY include/
|
||||
DESTINATION include
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# Ament 导出
|
||||
# ============================================================================
|
||||
|
||||
ament_export_dependencies(
|
||||
rclcpp
|
||||
sensor_msgs
|
||||
geometry_msgs
|
||||
cv_bridge
|
||||
image_transport
|
||||
mavros_msgs
|
||||
OpenCV
|
||||
)
|
||||
|
||||
ament_package()
|
||||
@@ -1,171 +0,0 @@
|
||||
/**
|
||||
* @file protocol.h
|
||||
* @brief SkyLink 多平台实时视频传输 - 公共协议定义
|
||||
*
|
||||
* 这个文件定义了机载端(ROS 2)、PC 端(Qt)和移动端(Android)之间的通信协议。
|
||||
* 必须保持三端的字节对齐和字段顺序一致。
|
||||
*
|
||||
* @author flowzl
|
||||
* @date 2026-01-19
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
|
||||
/**
|
||||
* @brief 强制1字节对齐,避免编译器补齐导致的大小差异
|
||||
*/
|
||||
#pragma pack(push, 1)
|
||||
|
||||
/**
|
||||
* @struct PacketHeader
|
||||
* @brief UDP 数据包头部结构
|
||||
*
|
||||
* 总大小: 50 字节
|
||||
* - 报头识别: 2 字节 (Magic)
|
||||
* - 帧标识: 4 字节 (FrameID)
|
||||
* - 分片信息: 4 字节 (TotalChunks + ChunkIndex)
|
||||
* - 数据长度: 2 字节 (DataLen)
|
||||
* - 时间戳: 8 字节 (Timestamp)
|
||||
* - GPS 位置: 24 字节 (Lat, Lon, Alt)
|
||||
* - 预留: 6 字节 (Reserve 用于将来扩展)
|
||||
*/
|
||||
struct PacketHeader {
|
||||
// ============ 包头识别 ============
|
||||
uint16_t magic; ///< 魔数 0xAA55 用于识别合法数据包
|
||||
|
||||
// ============ 帧标识 ============
|
||||
uint32_t frame_id; ///< 唯一的帧编号,从 0 开始递增,用于帧同步
|
||||
|
||||
// ============ 分片信息 ============
|
||||
uint16_t total_chunks; ///< 该帧总共被分成多少个 UDP 包
|
||||
uint16_t chunk_index; ///< 当前数据包是第几个分片 (0-based)
|
||||
|
||||
// ============ 载荷信息 ============
|
||||
uint16_t data_len; ///< 当前包的有效载荷长度(单位:字节)
|
||||
|
||||
// ============ 时间戳 ============
|
||||
double timestamp; ///< GPS 时间戳 (秒数,Unix 时间 或 ROS 时间)
|
||||
|
||||
// ============ GPS 位置数据 ============
|
||||
double lat; ///< 纬度 (WGS84 坐标系)
|
||||
double lon; ///< 经度 (WGS84 坐标系)
|
||||
double alt; ///< 海拔高度 (米)
|
||||
|
||||
// ============ 校验与预留 ============
|
||||
uint16_t crc16; ///< CRC16 校验码 (可选,当前未使用)
|
||||
uint32_t reserve; ///< 保留字段,用于将来的扩展
|
||||
|
||||
/**
|
||||
* @brief 获取包头大小(字节数)
|
||||
* @return 包头固定大小:50 字节
|
||||
*/
|
||||
static constexpr uint16_t size() {
|
||||
return sizeof(PacketHeader);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 设备信息包头结构(UDP 10000)
|
||||
*/
|
||||
struct DeviceInfoPacket {
|
||||
uint16_t magic; ///< 魔数 0xAA56
|
||||
uint32_t sequence; ///< 序列号
|
||||
uint16_t width; ///< 图像宽度
|
||||
uint16_t height; ///< 图像高度
|
||||
float framerate; ///< 帧率
|
||||
uint32_t pixel_format; ///< 像素格式(FourCC)
|
||||
char device_path[32]; ///< 设备路径(/dev/videoX)
|
||||
char device_name[64]; ///< 设备名称
|
||||
float current_fps; ///< 当前实际 FPS
|
||||
uint32_t total_frames; ///< 总帧数
|
||||
uint64_t timestamp; ///< 时间戳(毫秒)
|
||||
uint16_t crc16; ///< CRC 校验(可选)
|
||||
|
||||
static constexpr uint16_t size() {
|
||||
return sizeof(DeviceInfoPacket);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 恢复默认的对齐方式
|
||||
*/
|
||||
#pragma pack(pop)
|
||||
|
||||
// ============================================================================
|
||||
// 协议常量定义
|
||||
// ============================================================================
|
||||
|
||||
/** @brief 数据包魔数,用于识别合法的 SkyLink 数据包 */
|
||||
constexpr uint16_t SKYLINK_MAGIC = 0xAA55;
|
||||
|
||||
/** @brief 设备信息魔数,用于识别设备信息数据包 */
|
||||
constexpr uint16_t DEVICE_INFO_MAGIC = 0xAA56;
|
||||
|
||||
/** @brief 设备信息请求魔数,用于请求立即发送设备信息 */
|
||||
constexpr uint16_t DEVICE_INFO_REQUEST = 0xAA57;
|
||||
|
||||
/** @brief 最大的单个 UDP 包大小 (包含报头) - MTU 1500 字节 */
|
||||
constexpr uint16_t MAX_UDP_PACKET_SIZE = 1472; // 1500 - 20 (IP) - 8 (UDP)
|
||||
|
||||
/** @brief 最大的载荷大小 */
|
||||
constexpr uint16_t MAX_PAYLOAD_SIZE = MAX_UDP_PACKET_SIZE - PacketHeader::size();
|
||||
|
||||
/** @brief UDP 接收缓冲区大小 */
|
||||
constexpr uint32_t RX_BUFFER_SIZE = 65536;
|
||||
|
||||
/** @brief 最大支持的分片数 */
|
||||
constexpr uint16_t MAX_CHUNKS = 1000;
|
||||
|
||||
/** @brief 帧超时时间(毫秒),超过此时间的分片将被丢弃 */
|
||||
constexpr uint32_t FRAME_TIMEOUT_MS = 5000;
|
||||
|
||||
// ============================================================================
|
||||
// 图像编码相关常量
|
||||
// ============================================================================
|
||||
|
||||
/** @brief JPEG 图像格式 ID */
|
||||
constexpr uint8_t IMAGE_FORMAT_JPEG = 0x01;
|
||||
|
||||
/** @brief JPEG 最大压缩质量 */
|
||||
constexpr uint8_t JPEG_MAX_QUALITY = 100;
|
||||
|
||||
/** @brief JPEG 最小压缩质量 */
|
||||
constexpr uint8_t JPEG_MIN_QUALITY = 10;
|
||||
|
||||
// ============================================================================
|
||||
// 辅助函数
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* @brief 验证包头魔数是否合法
|
||||
* @param header 待验证的包头结构
|
||||
* @return 如果魔数为 0xAA55 返回 true,否则返回 false
|
||||
*/
|
||||
inline bool isValidPacket(const PacketHeader& header) {
|
||||
return header.magic == SKYLINK_MAGIC;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 计算 CRC16 校验码 (可选)
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度
|
||||
* @return 16 位 CRC 校验结果
|
||||
*/
|
||||
inline uint16_t crc16_ccitt(const uint8_t* data, uint16_t len) {
|
||||
uint16_t crc = 0xFFFF;
|
||||
for (uint16_t i = 0; i < len; i++) {
|
||||
crc ^= (uint16_t)data[i] << 8;
|
||||
for (int j = 0; j < 8; j++) {
|
||||
if (crc & 0x8000) {
|
||||
crc = (crc << 1) ^ 0x1021;
|
||||
} else {
|
||||
crc = crc << 1;
|
||||
}
|
||||
crc &= 0xFFFF;
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <rclcpp/rclcpp.hpp>
|
||||
#include <atomic>
|
||||
#include <netinet/in.h>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
#include "protocol.h"
|
||||
|
||||
/**
|
||||
* @brief 设备信息发送节点
|
||||
*
|
||||
* 通过 UDP 端口 10000 定期广播设备信息,并响应请求包(DEVICE_INFO_REQUEST)。
|
||||
*/
|
||||
class DeviceInfoSenderNode : public rclcpp::Node {
|
||||
public:
|
||||
DeviceInfoSenderNode();
|
||||
~DeviceInfoSenderNode();
|
||||
|
||||
private:
|
||||
void load_parameters();
|
||||
void start_listener();
|
||||
void stop_listener();
|
||||
|
||||
void broadcast_timer_callback();
|
||||
void handle_request_loop();
|
||||
void send_device_info(const sockaddr_in& addr);
|
||||
DeviceInfoPacket build_packet();
|
||||
static uint64_t htonll(uint64_t value);
|
||||
static uint32_t fourcc_from_string(const std::string& fmt);
|
||||
|
||||
private:
|
||||
// 套接字
|
||||
int udp_socket_{-1};
|
||||
std::atomic<bool> running_{false};
|
||||
std::thread listener_thread_;
|
||||
|
||||
// 参数
|
||||
uint16_t info_port_{10000};
|
||||
std::string target_ip_{"255.255.255.255"};
|
||||
bool enable_broadcast_{true};
|
||||
bool enable_request_response_{true};
|
||||
int broadcast_interval_ms_{1000};
|
||||
|
||||
// 设备信息
|
||||
std::string device_path_{"/dev/video0"};
|
||||
std::string device_name_{"Unknown"};
|
||||
uint16_t width_{0};
|
||||
uint16_t height_{0};
|
||||
float framerate_{0.0f};
|
||||
uint32_t pixel_format_{0};
|
||||
float current_fps_{0.0f};
|
||||
uint32_t total_frames_{0};
|
||||
uint32_t sequence_{0};
|
||||
|
||||
rclcpp::TimerBase::SharedPtr broadcast_timer_;
|
||||
};
|
||||
@@ -1,237 +0,0 @@
|
||||
/**
|
||||
* @file udp_sender_node.hpp
|
||||
* @brief SkyLink ROS 2 UDP 发送节点 - 头文件
|
||||
*
|
||||
* 这个节点订阅相机和 GPS Topic,将图像编码为 JPEG 并通过 UDP 广播发送。
|
||||
*
|
||||
* @author flowzl
|
||||
* @date 2026-01-19
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <rclcpp/rclcpp.hpp>
|
||||
#include <sensor_msgs/msg/compressed_image.hpp>
|
||||
#include <geometry_msgs/msg/twist.hpp>
|
||||
#include <mavros_msgs/msg/global_position_target.hpp>
|
||||
#include <sensor_msgs/msg/nav_sat_fix.hpp>
|
||||
#include <cv_bridge/cv_bridge.h>
|
||||
#include <opencv2/opencv.hpp>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <cstring>
|
||||
|
||||
// 协议定义
|
||||
#include "protocol.h"
|
||||
|
||||
/**
|
||||
* @class UdpSenderNode
|
||||
* @brief ROS 2 UDP 发送节点
|
||||
*
|
||||
* 负责:
|
||||
* 1. 订阅相机和 GPS 数据
|
||||
* 2. 编码图像为 JPEG
|
||||
* 3. 分片打包为 UDP 数据包
|
||||
* 4. 通过网络发送数据包
|
||||
*/
|
||||
class UdpSenderNode : public rclcpp::Node {
|
||||
public:
|
||||
/**
|
||||
* @brief 构造函数
|
||||
*/
|
||||
UdpSenderNode();
|
||||
|
||||
/**
|
||||
* @brief 析构函数
|
||||
*/
|
||||
~UdpSenderNode();
|
||||
|
||||
private:
|
||||
// ========================================================================
|
||||
// ROS 2 订阅和发布
|
||||
// ========================================================================
|
||||
|
||||
/** 相机图像订阅 */
|
||||
rclcpp::Subscription<sensor_msgs::msg::CompressedImage>::SharedPtr camera_subscriber_;
|
||||
|
||||
/** GPS 全球位置订阅 */
|
||||
rclcpp::Subscription<sensor_msgs::msg::NavSatFix>::SharedPtr gps_subscriber_;
|
||||
|
||||
// ========================================================================
|
||||
// 参数
|
||||
// ========================================================================
|
||||
|
||||
std::string target_ip_; ///< 目标 IP 地址
|
||||
uint16_t target_port_; ///< 目标 UDP 端口
|
||||
std::string camera_topic_; ///< 相机 Topic 名称
|
||||
std::string gps_topic_; ///< GPS Topic 名称
|
||||
int jpeg_quality_; ///< JPEG 压缩质量 (1-100)
|
||||
bool adaptive_quality_; ///< 自适应质量标志
|
||||
int quality_min_, quality_max_; ///< 质量范围
|
||||
bool enable_gps_; ///< 是否启用 GPS
|
||||
uint16_t max_packet_size_; ///< 最大 UDP 包大小
|
||||
uint32_t frame_timeout_ms_; ///< 帧超时时间
|
||||
bool enable_fps_stats_; ///< FPS 统计
|
||||
bool enable_drop_stats_; ///< 丢弃帧统计
|
||||
|
||||
// ========================================================================
|
||||
// 套接字和网络
|
||||
// ========================================================================
|
||||
|
||||
int udp_socket_; ///< UDP 套接字文件描述符
|
||||
uint32_t frame_counter_; ///< 帧计数器
|
||||
std::atomic<uint32_t> bytes_sent_{0}; ///< 已发送字节数
|
||||
std::atomic<uint32_t> packets_sent_{0}; ///< 已发送包数
|
||||
std::atomic<uint32_t> frames_dropped_{0}; ///< 丢弃的帧数
|
||||
|
||||
// ========================================================================
|
||||
// 异步发送队列和线程
|
||||
// ========================================================================
|
||||
|
||||
/** UDP 数据包队列项 */
|
||||
struct PacketQueueItem {
|
||||
std::vector<uint8_t> data;
|
||||
std::chrono::system_clock::time_point enqueue_time;
|
||||
};
|
||||
|
||||
std::queue<PacketQueueItem> send_queue_; ///< 发送队列
|
||||
std::mutex send_queue_mutex_; ///< 队列互斥锁
|
||||
std::condition_variable send_queue_cv_; ///< 队列条件变量
|
||||
std::thread sender_thread_; ///< 后台发送线程
|
||||
std::atomic<bool> sender_running_{true}; ///< 线程运行标志
|
||||
static const size_t MAX_QUEUE_SIZE = 5000; ///< 队列最大大小
|
||||
static const size_t BATCH_SEND_SIZE = 128; ///< 批量发送大小 (增加以减少锁竞争)
|
||||
|
||||
/**
|
||||
* @brief 后台发送工作函数
|
||||
*/
|
||||
void sender_worker();
|
||||
|
||||
/**
|
||||
* @brief 将数据包加入发送队列
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度
|
||||
*/
|
||||
void enqueue_packet(const uint8_t* data, uint16_t len);
|
||||
|
||||
/**
|
||||
* @brief 批量将数据包加入发送队列
|
||||
* @param packets 数据包列表 (将被移动)
|
||||
*/
|
||||
void enqueue_packets(std::vector<std::vector<uint8_t>>& packets);
|
||||
|
||||
// ========================================================================
|
||||
// GPS 数据缓存
|
||||
// ========================================================================
|
||||
|
||||
struct {
|
||||
double latitude = 39.9042; ///< 纬度
|
||||
double longitude = 116.4074; ///< 经度
|
||||
double altitude = 100.0; ///< 海拔
|
||||
std::mutex mutex;
|
||||
} current_gps_data_;
|
||||
|
||||
// ========================================================================
|
||||
// 统计信息
|
||||
// ========================================================================
|
||||
|
||||
struct {
|
||||
uint32_t total_frames = 0;
|
||||
uint32_t total_bytes = 0;
|
||||
uint32_t total_packets = 0;
|
||||
std::chrono::system_clock::time_point last_report_time;
|
||||
} stats_;
|
||||
|
||||
std::mutex stats_mutex_;
|
||||
|
||||
// ========================================================================
|
||||
// 回调函数
|
||||
// ========================================================================
|
||||
|
||||
/**
|
||||
* @brief 相机图像回调
|
||||
*/
|
||||
void camera_callback(const sensor_msgs::msg::CompressedImage::SharedPtr msg);
|
||||
|
||||
/**
|
||||
* @brief GPS 回调
|
||||
* @param msg GPS 消息
|
||||
*/
|
||||
void gps_callback(const sensor_msgs::msg::NavSatFix::SharedPtr msg);
|
||||
|
||||
// ========================================================================
|
||||
// 网络函数
|
||||
// ========================================================================
|
||||
|
||||
/**
|
||||
* @brief 初始化 UDP 套接字
|
||||
* @return 成功返回 true
|
||||
*/
|
||||
bool init_udp_socket();
|
||||
|
||||
/**
|
||||
* @brief 关闭 UDP 套接字
|
||||
*/
|
||||
void close_udp_socket();
|
||||
|
||||
/**
|
||||
* @brief 发送 UDP 数据包
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度
|
||||
* @return 发送的字节数,失败返回 -1
|
||||
*/
|
||||
int send_udp_packet(const uint8_t* data, uint16_t len);
|
||||
|
||||
// ========================================================================
|
||||
// 图像处理函数
|
||||
// ========================================================================
|
||||
|
||||
/**
|
||||
* @brief 将 OpenCV Mat 编码为 JPEG
|
||||
* @param frame OpenCV 图像
|
||||
* @param quality 压缩质量
|
||||
* @param output 输出 JPEG 数据
|
||||
* @return 成功返回 true
|
||||
*/
|
||||
bool encode_to_jpeg(const cv::Mat& frame, int quality, std::vector<uint8_t>& output);
|
||||
|
||||
/**
|
||||
* @brief 将 JPEG 数据分片为 UDP 包并发送
|
||||
* @param jpeg_data JPEG 数据指针
|
||||
* @param jpeg_len JPEG 数据长度
|
||||
* @param timestamp 时间戳
|
||||
* @param lat 纬度
|
||||
* @param lon 经度
|
||||
* @param alt 海拔
|
||||
* @return 发送的包数
|
||||
*/
|
||||
uint16_t fragment_and_send(
|
||||
const uint8_t* jpeg_data,
|
||||
uint32_t jpeg_len,
|
||||
double timestamp,
|
||||
double lat,
|
||||
double lon,
|
||||
double alt
|
||||
);
|
||||
|
||||
// ========================================================================
|
||||
// 统计和监控
|
||||
// ========================================================================
|
||||
|
||||
/**
|
||||
* @brief 更新统计信息
|
||||
* @param bytes_count 新增字节数
|
||||
* @param packet_count 新增包数
|
||||
*/
|
||||
void update_stats(uint32_t bytes_count, uint32_t packet_count);
|
||||
|
||||
/**
|
||||
* @brief 定期报告统计信息
|
||||
*/
|
||||
void report_stats();
|
||||
};
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>skylink_bridge</name>
|
||||
<version>1.0.0</version>
|
||||
<description>
|
||||
SkyLink 实时视频传输系统 - ROS 2 机载端
|
||||
负责采集相机和 GPS 数据,通过 UDP 广播发送到地面站和移动端
|
||||
</description>
|
||||
|
||||
<!-- 维护者信息 -->
|
||||
<maintainer email="support@skylink.dev">flowzl</maintainer>
|
||||
<license>MIT</license>
|
||||
|
||||
<!-- 作者 -->
|
||||
<author email="dev@skylink.dev">SkyLink Development</author>
|
||||
|
||||
<!-- 编译工具 -->
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<!-- ROS 2 依赖 -->
|
||||
<depend>rclcpp</depend>
|
||||
<depend>sensor_msgs</depend>
|
||||
<depend>geometry_msgs</depend>
|
||||
<depend>cv_bridge</depend>
|
||||
<depend>image_transport</depend>
|
||||
|
||||
<!-- 系统库依赖 -->
|
||||
<exec_depend>opencv-dev</exec_depend>
|
||||
<exec_depend>libjpeg-turbo-dev</exec_depend>
|
||||
|
||||
<!-- 可选:MAVROS GPS 支持 -->
|
||||
<depend>mavros_msgs</depend>
|
||||
|
||||
<!-- 可选:USB 相机支持 -->
|
||||
<exec_depend>usb_cam</exec_depend>
|
||||
<!-- 导出信息 -->
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
@@ -1,494 +0,0 @@
|
||||
/**
|
||||
* @file camera_driver_node.cpp
|
||||
* @brief V4L2 相机驱动节点 - 发布 ROS 2 CompressedImage 消息
|
||||
*
|
||||
* 使用 V4L2 直接读取 USB 摄像头 MJPEG 流,发布为 ROS 2 sensor_msgs/CompressedImage
|
||||
*
|
||||
* @author flowzl
|
||||
* @date 2026-01-19
|
||||
*/
|
||||
|
||||
#include <rclcpp/rclcpp.hpp>
|
||||
#include <sensor_msgs/msg/compressed_image.hpp>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
|
||||
// V4L2 includes
|
||||
#include <linux/videodev2.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/**
|
||||
* @class CameraDriverNode
|
||||
* @brief V4L2 相机驱动 ROS 2 节点 (Raw MJPEG)
|
||||
*/
|
||||
class CameraDriverNode : public rclcpp::Node {
|
||||
public:
|
||||
/**
|
||||
* @brief 构造函数
|
||||
*/
|
||||
CameraDriverNode() : rclcpp::Node("camera_driver") {
|
||||
// ====================================================================
|
||||
// 声明参数
|
||||
// ====================================================================
|
||||
|
||||
this->declare_parameter<std::string>("video_device", "/dev/video4");
|
||||
this->declare_parameter<double>("framerate", 30.0);
|
||||
this->declare_parameter<int>("image_width", 640);
|
||||
this->declare_parameter<int>("image_height", 480);
|
||||
this->declare_parameter<std::string>("camera_topic", "/camera/image_raw/compressed");
|
||||
this->declare_parameter<std::string>("camera_frame", "camera");
|
||||
this->declare_parameter<bool>("enable_fps_stats", true);
|
||||
|
||||
// 读取参数
|
||||
video_device_ = this->get_parameter("video_device").as_string();
|
||||
target_framerate_ = this->get_parameter("framerate").as_double();
|
||||
image_width_ = this->get_parameter("image_width").as_int();
|
||||
image_height_ = this->get_parameter("image_height").as_int();
|
||||
camera_topic_ = this->get_parameter("camera_topic").as_string();
|
||||
camera_frame_ = this->get_parameter("camera_frame").as_string();
|
||||
enable_fps_stats_ = this->get_parameter("enable_fps_stats").as_bool();
|
||||
|
||||
// ====================================================================
|
||||
// 初始化摄像头
|
||||
// ====================================================================
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
RCLCPP_INFO(this->get_logger(), "V4L2 Native Camera Driver Node 启动");
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
RCLCPP_INFO(this->get_logger(), "设备: %s", video_device_.c_str());
|
||||
RCLCPP_INFO(this->get_logger(), "分辨率: %dx%d", image_width_, image_height_);
|
||||
RCLCPP_INFO(this->get_logger(), "帧率: %.1f", target_framerate_);
|
||||
|
||||
if (!init_camera()) {
|
||||
RCLCPP_ERROR(this->get_logger(), "❌ 摄像头初始化失败");
|
||||
rclcpp::shutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 摄像头初始化成功");
|
||||
|
||||
// ====================================================================
|
||||
// 创建发布者
|
||||
// ====================================================================
|
||||
|
||||
// 修改为默认 QoS (Reliable, KeepLast=10) 以匹配 Python 行为和 ros2 topic hz 工具
|
||||
// 之前使用 SensorDataQoS (BestEffort) 导致 ros2 topic hz (默认 Reliable) 无法正常接收
|
||||
rclcpp::QoS qos_profile(10);
|
||||
|
||||
// 使用 CompressedImage 发布
|
||||
image_publisher_ = this->create_publisher<sensor_msgs::msg::CompressedImage>(
|
||||
camera_topic_,
|
||||
qos_profile
|
||||
);
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ CompressedImage 发布器已创建: %s (Reliable)", camera_topic_.c_str());
|
||||
|
||||
// ====================================================================
|
||||
// 启动捕获线程
|
||||
// ====================================================================
|
||||
|
||||
capturing_ = true;
|
||||
capture_thread_ = std::thread(&CameraDriverNode::capture_worker, this);
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 捕获线程已启动");
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 节点初始化完成");
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 析构函数
|
||||
*/
|
||||
~CameraDriverNode() {
|
||||
capturing_ = false;
|
||||
if (capture_thread_.joinable()) {
|
||||
capture_thread_.join();
|
||||
}
|
||||
|
||||
stop_capturing();
|
||||
uninit_device();
|
||||
close_device();
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "Camera Driver Node 已关闭");
|
||||
}
|
||||
|
||||
// 设备信息查询接口
|
||||
const std::string& device_path() const { return video_device_; }
|
||||
const std::string& device_name() const { return device_name_; }
|
||||
uint16_t image_width() const { return static_cast<uint16_t>(image_width_); }
|
||||
uint16_t image_height() const { return static_cast<uint16_t>(image_height_); }
|
||||
float target_fps() const { return static_cast<float>(target_framerate_); }
|
||||
uint32_t pixel_format_fourcc() const { return pixel_format_fourcc_; }
|
||||
float current_fps() const { return current_fps_; }
|
||||
uint32_t total_frames() const { return frame_counter_; }
|
||||
|
||||
private:
|
||||
// ========================================================================
|
||||
// V4L2 结构
|
||||
// ========================================================================
|
||||
struct Buffer {
|
||||
void *start;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
// ========================================================================
|
||||
// 成员变量
|
||||
// ========================================================================
|
||||
|
||||
// V4L2 members
|
||||
int fd_ = -1;
|
||||
std::vector<Buffer> buffers_;
|
||||
|
||||
/** 摄像头参数 */
|
||||
std::string video_device_;
|
||||
std::string device_name_{"Unknown"};
|
||||
double target_framerate_;
|
||||
int image_width_;
|
||||
int image_height_;
|
||||
std::string camera_topic_;
|
||||
std::string camera_frame_;
|
||||
bool enable_fps_stats_;
|
||||
|
||||
/** 发布者 */
|
||||
rclcpp::Publisher<sensor_msgs::msg::CompressedImage>::SharedPtr image_publisher_;
|
||||
|
||||
/** 捕获线程 */
|
||||
std::thread capture_thread_;
|
||||
std::atomic<bool> capturing_{false};
|
||||
|
||||
/** 统计信息 */
|
||||
uint32_t frame_counter_ = 0;
|
||||
std::chrono::system_clock::time_point last_stats_time_;
|
||||
float current_fps_ = 0.0f;
|
||||
uint32_t pixel_format_fourcc_ = V4L2_PIX_FMT_MJPEG;
|
||||
|
||||
// ========================================================================
|
||||
// 私有方法
|
||||
// ========================================================================
|
||||
|
||||
// xioctl helper
|
||||
static int xioctl(int fh, int request, void *arg) {
|
||||
int r;
|
||||
do {
|
||||
r = ioctl(fh, request, arg);
|
||||
} while (-1 == r && EINTR == errno);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭设备
|
||||
*/
|
||||
void close_device() {
|
||||
if (fd_ != -1) {
|
||||
close(fd_);
|
||||
fd_ = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 释放内存映射
|
||||
*/
|
||||
void uninit_device() {
|
||||
for (const auto& buffer : buffers_) {
|
||||
if (-1 == munmap(buffer.start, buffer.length)) {
|
||||
perror("munmap");
|
||||
}
|
||||
}
|
||||
buffers_.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 停止流
|
||||
*/
|
||||
void stop_capturing() {
|
||||
if (fd_ != -1) {
|
||||
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
xioctl(fd_, VIDIOC_STREAMOFF, &type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化摄像头
|
||||
*/
|
||||
bool init_camera() {
|
||||
struct stat st;
|
||||
if (-1 == stat(video_device_.c_str(), &st)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "无法识别 '%s': %d, %s", video_device_.c_str(), errno, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
if (!S_ISCHR(st.st_mode)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "%s 不是字符设备", video_device_.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
fd_ = open(video_device_.c_str(), O_RDWR | O_NONBLOCK, 0);
|
||||
if (-1 == fd_) {
|
||||
RCLCPP_ERROR(this->get_logger(), "无法打开 '%s': %d, %s", video_device_.c_str(), errno, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
struct v4l2_capability cap;
|
||||
if (-1 == xioctl(fd_, VIDIOC_QUERYCAP, &cap)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "不是 V4L2 设备");
|
||||
return false;
|
||||
}
|
||||
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "不是视频捕获设备");
|
||||
return false;
|
||||
}
|
||||
if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "不支持流 I/O");
|
||||
return false;
|
||||
}
|
||||
device_name_ = reinterpret_cast<const char*>(cap.card);
|
||||
|
||||
// 设置格式
|
||||
struct v4l2_format fmt;
|
||||
memset(&fmt, 0, sizeof(fmt));
|
||||
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
fmt.fmt.pix.width = image_width_;
|
||||
fmt.fmt.pix.height = image_height_;
|
||||
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; // 强制 MJPEG
|
||||
fmt.fmt.pix.field = V4L2_FIELD_ANY; // V4L2_FIELD_NONE? ANY common for USB cams
|
||||
|
||||
if (-1 == xioctl(fd_, VIDIOC_S_FMT, &fmt)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "设置像素格式失败");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查实际设置的格式
|
||||
if (-1 == xioctl(fd_, VIDIOC_G_FMT, &fmt)) {
|
||||
RCLCPP_WARN(this->get_logger(), "无法获取实际格式");
|
||||
} else {
|
||||
char fourcc[5] = {0};
|
||||
fourcc[0] = (fmt.fmt.pix.pixelformat) & 0xFF;
|
||||
fourcc[1] = (fmt.fmt.pix.pixelformat >> 8) & 0xFF;
|
||||
fourcc[2] = (fmt.fmt.pix.pixelformat >> 16) & 0xFF;
|
||||
fourcc[3] = (fmt.fmt.pix.pixelformat >> 24) & 0xFF;
|
||||
RCLCPP_INFO(this->get_logger(), "实际设置的格式: %s (0x%08X), 分辨率: %dx%d",
|
||||
fourcc, fmt.fmt.pix.pixelformat,
|
||||
fmt.fmt.pix.width, fmt.fmt.pix.height);
|
||||
|
||||
if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG) {
|
||||
RCLCPP_WARN(this->get_logger(),
|
||||
"⚠️ 设备不支持MJPEG格式!实际格式: %s,可能需要使用其他格式或软件编码",
|
||||
fourcc);
|
||||
}
|
||||
|
||||
pixel_format_fourcc_ = fmt.fmt.pix.pixelformat;
|
||||
}
|
||||
|
||||
// 设置帧率
|
||||
struct v4l2_streamparm streamparm;
|
||||
memset(&streamparm, 0, sizeof(streamparm));
|
||||
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
streamparm.parm.capture.timeperframe.numerator = 1;
|
||||
streamparm.parm.capture.timeperframe.denominator = (unsigned int)target_framerate_;
|
||||
|
||||
if (xioctl(fd_, VIDIOC_S_PARM, &streamparm) != -1) {
|
||||
double actual_fps = (double)streamparm.parm.capture.timeperframe.denominator /
|
||||
streamparm.parm.capture.timeperframe.numerator;
|
||||
RCLCPP_INFO(this->get_logger(), "尝试设置FPS: %.1f, 实际FPS: %.1f", target_framerate_, actual_fps);
|
||||
}
|
||||
|
||||
// 请求 buffers
|
||||
struct v4l2_requestbuffers req;
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.count = 4;
|
||||
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
req.memory = V4L2_MEMORY_MMAP;
|
||||
|
||||
if (-1 == xioctl(fd_, VIDIOC_REQBUFS, &req)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_REQBUFS 失败");
|
||||
return false;
|
||||
}
|
||||
if (req.count < 2) {
|
||||
RCLCPP_WARN(this->get_logger(), "Buffer 数量过少: %d", req.count);
|
||||
}
|
||||
|
||||
buffers_.resize(req.count);
|
||||
|
||||
for (size_t i = 0; i < req.count; ++i) {
|
||||
struct v4l2_buffer buf;
|
||||
memset(&buf, 0, sizeof(buf));
|
||||
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
buf.memory = V4L2_MEMORY_MMAP;
|
||||
buf.index = i;
|
||||
|
||||
if (-1 == xioctl(fd_, VIDIOC_QUERYBUF, &buf)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_QUERYBUF 失败");
|
||||
return false;
|
||||
}
|
||||
|
||||
buffers_[i].length = buf.length;
|
||||
buffers_[i].start = mmap(NULL, buf.length,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
fd_, buf.m.offset);
|
||||
|
||||
if (MAP_FAILED == buffers_[i].start) {
|
||||
RCLCPP_ERROR(this->get_logger(), "mmap 失败");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "实际设置 - 分辨率: %dx%d, MJPEG",
|
||||
fmt.fmt.pix.width, fmt.fmt.pix.height);
|
||||
|
||||
// 开始流
|
||||
for (size_t i = 0; i < buffers_.size(); ++i) {
|
||||
struct v4l2_buffer buf;
|
||||
memset(&buf, 0, sizeof(buf));
|
||||
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
buf.memory = V4L2_MEMORY_MMAP;
|
||||
buf.index = i;
|
||||
if (-1 == xioctl(fd_, VIDIOC_QBUF, &buf)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_QBUF 失败");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
if (-1 == xioctl(fd_, VIDIOC_STREAMON, &type)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_STREAMON 失败");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 捕获工作线程
|
||||
*/
|
||||
void capture_worker() {
|
||||
RCLCPP_INFO(this->get_logger(), "📷 捕获线程开始工作 (V4L2)");
|
||||
|
||||
last_stats_time_ = std::chrono::system_clock::now();
|
||||
uint32_t last_frame_counter = 0;
|
||||
|
||||
while (capturing_ && rclcpp::ok()) {
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
int r;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd_, &fds);
|
||||
|
||||
tv.tv_sec = 2; // Timeout
|
||||
tv.tv_usec = 0;
|
||||
|
||||
r = select(fd_ + 1, &fds, NULL, NULL, &tv);
|
||||
|
||||
if (-1 == r) {
|
||||
if (EINTR == errno) continue;
|
||||
RCLCPP_ERROR(this->get_logger(), "select error");
|
||||
break;
|
||||
}
|
||||
if (0 == r) {
|
||||
RCLCPP_WARN(this->get_logger(), "select timeout");
|
||||
continue;
|
||||
}
|
||||
|
||||
struct v4l2_buffer buf;
|
||||
memset(&buf, 0, sizeof(buf));
|
||||
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
buf.memory = V4L2_MEMORY_MMAP;
|
||||
|
||||
if (-1 == xioctl(fd_, VIDIOC_DQBUF, &buf)) {
|
||||
if (errno == EAGAIN) continue;
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_DQBUF error: %d, %s", errno, strerror(errno));
|
||||
continue; // try next
|
||||
}
|
||||
|
||||
// 数据在 buffers_[buf.index].start,长度 buf.bytesused
|
||||
try {
|
||||
// 验证MJPEG数据格式(每300帧检查一次)
|
||||
if (frame_counter_ % 300 == 0 && buf.bytesused >= 2) {
|
||||
const uint8_t* data_ptr = (const uint8_t*)buffers_[buf.index].start;
|
||||
RCLCPP_INFO(this->get_logger(),
|
||||
"V4L2 MJPEG数据检查 - 大小: %u bytes, 前2字节: 0x%02X 0x%02X",
|
||||
buf.bytesused, data_ptr[0], data_ptr[1]);
|
||||
}
|
||||
|
||||
auto msg = std::make_unique<sensor_msgs::msg::CompressedImage>();
|
||||
msg->header.stamp = this->now();
|
||||
msg->header.frame_id = camera_frame_;
|
||||
msg->format = "jpeg"; // MJPEG stream
|
||||
|
||||
// 直接使用V4L2原始数据,不进行二次解码
|
||||
msg->data.resize(buf.bytesused);
|
||||
memcpy(msg->data.data(), buffers_[buf.index].start, buf.bytesused);
|
||||
|
||||
// 发布消息
|
||||
image_publisher_->publish(std::move(msg));
|
||||
|
||||
frame_counter_++;
|
||||
|
||||
// 定期报告统计 (每 300 帧,约 10 秒)
|
||||
if (enable_fps_stats_ && (frame_counter_ % 300 == 0)) {
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
now - last_stats_time_
|
||||
).count();
|
||||
|
||||
if (elapsed_seconds > 0) {
|
||||
uint32_t current_frames = frame_counter_ - last_frame_counter;
|
||||
uint32_t fps = current_frames / elapsed_seconds;
|
||||
current_fps_ = static_cast<float>(fps);
|
||||
|
||||
RCLCPP_INFO(this->get_logger(),
|
||||
"相机统计 - 实时 FPS: %u, 总帧: %u, 每帧: %u KB",
|
||||
fps, frame_counter_, buf.bytesused/1024
|
||||
);
|
||||
|
||||
last_stats_time_ = now;
|
||||
last_frame_counter = frame_counter_;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (const std::exception& e) {
|
||||
RCLCPP_ERROR(this->get_logger(), "发布失败: %s", e.what());
|
||||
}
|
||||
|
||||
// 放回队列
|
||||
if (-1 == xioctl(fd_, VIDIOC_QBUF, &buf)) {
|
||||
RCLCPP_ERROR(this->get_logger(), "VIDIOC_QBUF error");
|
||||
}
|
||||
}
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "📷 捕获线程已停止");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 报告统计信息 (Legacy)
|
||||
*/
|
||||
void report_stats() {
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
now - last_stats_time_
|
||||
).count();
|
||||
|
||||
if (elapsed_seconds > 0) {
|
||||
uint32_t fps = frame_counter_ / elapsed_seconds;
|
||||
RCLCPP_INFO(this->get_logger(),
|
||||
"相机统计 - FPS: %u, 总帧: %u",
|
||||
fps, frame_counter_
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 主函数
|
||||
*/
|
||||
int main(int argc, char* argv[]) {
|
||||
rclcpp::init(argc, argv);
|
||||
auto node = std::make_shared<CameraDriverNode>();
|
||||
rclcpp::spin(node);
|
||||
rclcpp::shutdown();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,251 +0,0 @@
|
||||
#include "skylink_bridge/device_info_sender_node.h"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <chrono>
|
||||
#include <cstring>
|
||||
#include <fcntl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
namespace {
|
||||
uint16_t read_uint16(const std::string& s) {
|
||||
try {
|
||||
return static_cast<uint16_t>(std::stoi(s));
|
||||
} catch (...) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
DeviceInfoSenderNode::DeviceInfoSenderNode()
|
||||
: rclcpp::Node("device_info_sender_node") {
|
||||
load_parameters();
|
||||
|
||||
// 创建 UDP 套接字
|
||||
udp_socket_ = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (udp_socket_ < 0) {
|
||||
RCLCPP_FATAL(this->get_logger(), "创建 UDP 套接字失败: %s", strerror(errno));
|
||||
throw std::runtime_error("socket create failed");
|
||||
}
|
||||
|
||||
// 允许广播
|
||||
int opt = 1;
|
||||
setsockopt(udp_socket_, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
|
||||
|
||||
// 绑定监听端口
|
||||
sockaddr_in addr{};
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(info_port_);
|
||||
addr.sin_addr.s_addr = INADDR_ANY;
|
||||
if (bind(udp_socket_, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) < 0) {
|
||||
RCLCPP_FATAL(this->get_logger(), "绑定端口 %u 失败: %s", info_port_, strerror(errno));
|
||||
throw std::runtime_error("bind failed");
|
||||
}
|
||||
|
||||
// 定期广播
|
||||
if (enable_broadcast_) {
|
||||
broadcast_timer_ = this->create_wall_timer(
|
||||
std::chrono::milliseconds(broadcast_interval_ms_),
|
||||
std::bind(&DeviceInfoSenderNode::broadcast_timer_callback, this));
|
||||
}
|
||||
|
||||
// 请求响应线程
|
||||
if (enable_request_response_) {
|
||||
running_.store(true);
|
||||
listener_thread_ = std::thread(&DeviceInfoSenderNode::handle_request_loop, this);
|
||||
}
|
||||
|
||||
RCLCPP_INFO(this->get_logger(),
|
||||
"设备信息发送节点启动,端口: %u, 广播: %s, 请求响应: %s",
|
||||
info_port_, enable_broadcast_ ? "开启" : "关闭",
|
||||
enable_request_response_ ? "开启" : "关闭");
|
||||
}
|
||||
|
||||
DeviceInfoSenderNode::~DeviceInfoSenderNode() {
|
||||
running_.store(false);
|
||||
if (listener_thread_.joinable()) {
|
||||
listener_thread_.join();
|
||||
}
|
||||
if (udp_socket_ >= 0) {
|
||||
close(udp_socket_);
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceInfoSenderNode::load_parameters() {
|
||||
this->declare_parameter<int>("info_port", 10000);
|
||||
this->declare_parameter<std::string>("target_ip", "255.255.255.255");
|
||||
this->declare_parameter<bool>("enable_broadcast", true);
|
||||
this->declare_parameter<bool>("enable_request_response", true);
|
||||
this->declare_parameter<int>("broadcast_interval_ms", 1000);
|
||||
|
||||
this->declare_parameter<std::string>("device_path", "/dev/video0");
|
||||
this->declare_parameter<std::string>("device_name", "Unknown");
|
||||
this->declare_parameter<int>("width", 640);
|
||||
this->declare_parameter<int>("height", 480);
|
||||
this->declare_parameter<double>("framerate", 30.0);
|
||||
this->declare_parameter<std::string>("pixel_format", "YUYV");
|
||||
|
||||
// 读取
|
||||
info_port_ = static_cast<uint16_t>(this->get_parameter("info_port").as_int());
|
||||
target_ip_ = this->get_parameter("target_ip").as_string();
|
||||
enable_broadcast_ = this->get_parameter("enable_broadcast").as_bool();
|
||||
enable_request_response_ = this->get_parameter("enable_request_response").as_bool();
|
||||
broadcast_interval_ms_ = this->get_parameter("broadcast_interval_ms").as_int();
|
||||
|
||||
device_path_ = this->get_parameter("device_path").as_string();
|
||||
device_name_ = this->get_parameter("device_name").as_string();
|
||||
width_ = static_cast<uint16_t>(this->get_parameter("width").as_int());
|
||||
height_ = static_cast<uint16_t>(this->get_parameter("height").as_int());
|
||||
framerate_ = static_cast<float>(this->get_parameter("framerate").as_double());
|
||||
pixel_format_ = fourcc_from_string(this->get_parameter("pixel_format").as_string());
|
||||
|
||||
current_fps_ = 0.0f;
|
||||
total_frames_ = 0;
|
||||
}
|
||||
|
||||
void DeviceInfoSenderNode::broadcast_timer_callback() {
|
||||
sockaddr_in addr{};
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(info_port_);
|
||||
addr.sin_addr.s_addr = inet_addr(target_ip_.c_str());
|
||||
send_device_info(addr);
|
||||
}
|
||||
|
||||
void DeviceInfoSenderNode::send_device_info(const sockaddr_in& addr) {
|
||||
DeviceInfoPacket packet = build_packet();
|
||||
|
||||
// 手动序列化为网络字节序
|
||||
std::vector<uint8_t> buffer(sizeof(DeviceInfoPacket), 0);
|
||||
uint8_t* p = buffer.data();
|
||||
|
||||
auto write_u16 = [](uint8_t*& ptr, uint16_t v) {
|
||||
uint16_t n = htons(v);
|
||||
std::memcpy(ptr, &n, sizeof(n));
|
||||
ptr += sizeof(n);
|
||||
};
|
||||
auto write_u32 = [](uint8_t*& ptr, uint32_t v) {
|
||||
uint32_t n = htonl(v);
|
||||
std::memcpy(ptr, &n, sizeof(n));
|
||||
ptr += sizeof(n);
|
||||
};
|
||||
auto write_float = [](uint8_t*& ptr, float f) {
|
||||
uint32_t bits;
|
||||
std::memcpy(&bits, &f, sizeof(bits));
|
||||
uint32_t n = htonl(bits);
|
||||
std::memcpy(ptr, &n, sizeof(n));
|
||||
ptr += sizeof(n);
|
||||
};
|
||||
auto write_u64 = [](uint8_t*& ptr, uint64_t v) {
|
||||
uint64_t n = DeviceInfoSenderNode::htonll(v);
|
||||
std::memcpy(ptr, &n, sizeof(n));
|
||||
ptr += sizeof(n);
|
||||
};
|
||||
|
||||
write_u16(p, packet.magic);
|
||||
write_u32(p, packet.sequence);
|
||||
write_u16(p, packet.width);
|
||||
write_u16(p, packet.height);
|
||||
write_float(p, packet.framerate);
|
||||
write_u32(p, packet.pixel_format);
|
||||
|
||||
std::memcpy(p, packet.device_path, sizeof(packet.device_path));
|
||||
p += sizeof(packet.device_path);
|
||||
std::memcpy(p, packet.device_name, sizeof(packet.device_name));
|
||||
p += sizeof(packet.device_name);
|
||||
|
||||
write_float(p, packet.current_fps);
|
||||
write_u32(p, packet.total_frames);
|
||||
write_u64(p, packet.timestamp);
|
||||
write_u16(p, packet.crc16);
|
||||
|
||||
ssize_t sent = sendto(udp_socket_, buffer.data(), buffer.size(), 0,
|
||||
reinterpret_cast<const sockaddr*>(&addr), sizeof(addr));
|
||||
if (sent < 0) {
|
||||
RCLCPP_WARN(this->get_logger(), "发送设备信息失败: %s", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceInfoSenderNode::handle_request_loop() {
|
||||
// 设置非阻塞
|
||||
int flags = fcntl(udp_socket_, F_GETFL, 0);
|
||||
fcntl(udp_socket_, F_SETFL, flags | O_NONBLOCK);
|
||||
|
||||
std::vector<uint8_t> buf(512);
|
||||
while (running_.load()) {
|
||||
sockaddr_in sender{};
|
||||
socklen_t sender_len = sizeof(sender);
|
||||
ssize_t n = recvfrom(udp_socket_, buf.data(), buf.size(), 0,
|
||||
reinterpret_cast<sockaddr*>(&sender), &sender_len);
|
||||
if (n <= 0) {
|
||||
std::this_thread::sleep_for(50ms);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (n < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uint16_t magic = ntohs(*reinterpret_cast<uint16_t*>(buf.data()));
|
||||
if (magic == DEVICE_INFO_REQUEST) {
|
||||
send_device_info(sender);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DeviceInfoPacket DeviceInfoSenderNode::build_packet() {
|
||||
DeviceInfoPacket packet{};
|
||||
packet.magic = DEVICE_INFO_MAGIC;
|
||||
packet.sequence = sequence_++;
|
||||
packet.width = width_;
|
||||
packet.height = height_;
|
||||
packet.framerate = framerate_;
|
||||
packet.pixel_format = pixel_format_;
|
||||
|
||||
std::memset(packet.device_path, 0, sizeof(packet.device_path));
|
||||
std::strncpy(packet.device_path, device_path_.c_str(), sizeof(packet.device_path) - 1);
|
||||
|
||||
std::memset(packet.device_name, 0, sizeof(packet.device_name));
|
||||
std::strncpy(packet.device_name, device_name_.c_str(), sizeof(packet.device_name) - 1);
|
||||
|
||||
packet.current_fps = current_fps_;
|
||||
packet.total_frames = total_frames_;
|
||||
|
||||
auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch());
|
||||
packet.timestamp = static_cast<uint64_t>(now.count());
|
||||
packet.crc16 = 0;
|
||||
return packet;
|
||||
}
|
||||
|
||||
uint64_t DeviceInfoSenderNode::htonll(uint64_t value) {
|
||||
static const int num = 42;
|
||||
if (*reinterpret_cast<const char*>(&num) == num) {
|
||||
// little-endian
|
||||
uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
|
||||
uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFULL));
|
||||
return (static_cast<uint64_t>(low_part) << 32) | high_part;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t DeviceInfoSenderNode::fourcc_from_string(const std::string& fmt) {
|
||||
if (fmt.size() >= 4) {
|
||||
return (static_cast<uint32_t>(fmt[0]) & 0xFF) |
|
||||
((static_cast<uint32_t>(fmt[1]) & 0xFF) << 8) |
|
||||
((static_cast<uint32_t>(fmt[2]) & 0xFF) << 16) |
|
||||
((static_cast<uint32_t>(fmt[3]) & 0xFF) << 24);
|
||||
}
|
||||
// 默认 YUYV
|
||||
return ('Y') | ('U' << 8) | ('Y' << 16) | ('V' << 24);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
rclcpp::init(argc, argv);
|
||||
auto node = std::make_shared<DeviceInfoSenderNode>();
|
||||
rclcpp::spin(node);
|
||||
rclcpp::shutdown();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,555 +0,0 @@
|
||||
/**
|
||||
* @file udp_sender_node.cpp
|
||||
* @brief SkyLink ROS 2 UDP 发送节点 - 实现文件
|
||||
*
|
||||
* 完整实现相机和 GPS 数据采集、JPEG 编码、UDP 分片发送的功能。
|
||||
*
|
||||
* @author flowzl
|
||||
* @date 2026-01-19
|
||||
*/
|
||||
|
||||
#include "skylink_bridge/udp_sender_node.h"
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <cerrno>
|
||||
#include <chrono>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <sensor_msgs/msg/nav_sat_fix.hpp>
|
||||
#include <thread>
|
||||
|
||||
/**
|
||||
* @brief 构造函数
|
||||
*/
|
||||
UdpSenderNode::UdpSenderNode() : rclcpp::Node("udp_sender_node"), udp_socket_(-1), frame_counter_(0) {
|
||||
// ========================================================================
|
||||
// 声明和读取参数
|
||||
// ========================================================================
|
||||
|
||||
this->declare_parameter<std::string>("target_ip", "255.255.255.255");
|
||||
this->declare_parameter<int>("target_port", 9999);
|
||||
this->declare_parameter<std::string>("camera_topic", "/camera/image_raw");
|
||||
this->declare_parameter<std::string>("gps_topic", "/mavros/global_position/global");
|
||||
this->declare_parameter<int>("jpeg_quality", 70);
|
||||
this->declare_parameter<bool>("adaptive_quality", true);
|
||||
this->declare_parameter<int>("quality_min", 30);
|
||||
this->declare_parameter<int>("quality_max", 95);
|
||||
this->declare_parameter<bool>("enable_gps", true);
|
||||
this->declare_parameter<int>("max_packet_size", 500);
|
||||
this->declare_parameter<int>("frame_timeout_ms", 5000);
|
||||
this->declare_parameter<bool>("enable_fps_stats", true);
|
||||
this->declare_parameter<bool>("enable_drop_stats", true);
|
||||
|
||||
// 读取参数
|
||||
target_ip_ = this->get_parameter("target_ip").as_string();
|
||||
target_port_ = static_cast<uint16_t>(this->get_parameter("target_port").as_int());
|
||||
camera_topic_ = this->get_parameter("camera_topic").as_string();
|
||||
gps_topic_ = this->get_parameter("gps_topic").as_string();
|
||||
jpeg_quality_ = this->get_parameter("jpeg_quality").as_int();
|
||||
adaptive_quality_ = this->get_parameter("adaptive_quality").as_bool();
|
||||
quality_min_ = this->get_parameter("quality_min").as_int();
|
||||
quality_max_ = this->get_parameter("quality_max").as_int();
|
||||
enable_gps_ = this->get_parameter("enable_gps").as_bool();
|
||||
max_packet_size_ = static_cast<uint16_t>(this->get_parameter("max_packet_size").as_int());
|
||||
frame_timeout_ms_ = static_cast<uint32_t>(this->get_parameter("frame_timeout_ms").as_int());
|
||||
enable_fps_stats_ = this->get_parameter("enable_fps_stats").as_bool();
|
||||
enable_drop_stats_ = this->get_parameter("enable_drop_stats").as_bool();
|
||||
|
||||
// ========================================================================
|
||||
// 打印初始化信息
|
||||
// ========================================================================
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
RCLCPP_INFO(this->get_logger(), "SkyLink UDP Sender Node 启动");
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
RCLCPP_INFO(this->get_logger(), "目标 IP: %s:%d", target_ip_.c_str(), target_port_);
|
||||
RCLCPP_INFO(this->get_logger(), "相机 Topic: %s", camera_topic_.c_str());
|
||||
RCLCPP_INFO(this->get_logger(), "GPS Topic: %s", gps_topic_.c_str());
|
||||
RCLCPP_INFO(this->get_logger(), "JPEG 质量: %d (自适应: %s)", jpeg_quality_, adaptive_quality_ ? "true" : "false");
|
||||
RCLCPP_INFO(this->get_logger(), "最大包大小: %d 字节", max_packet_size_);
|
||||
|
||||
// ========================================================================
|
||||
// 初始化 UDP 套接字
|
||||
// ========================================================================
|
||||
|
||||
if (!init_udp_socket()) {
|
||||
RCLCPP_ERROR(this->get_logger(), "❌ UDP 套接字初始化失败,节点退出");
|
||||
rclcpp::shutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ UDP 套接字初始化成功");
|
||||
|
||||
// ========================================================================
|
||||
// 创建订阅
|
||||
// ========================================================================
|
||||
|
||||
// 使用更激进的 QoS 设置,保留更多消息
|
||||
rclcpp::QoS qos_profile = rclcpp::SensorDataQoS();
|
||||
qos_profile.keep_last(10); // 保留最后 10 条消息
|
||||
|
||||
camera_subscriber_ = this->create_subscription<sensor_msgs::msg::CompressedImage>(
|
||||
camera_topic_,
|
||||
qos_profile,
|
||||
[this](const sensor_msgs::msg::CompressedImage::SharedPtr msg) {
|
||||
this->camera_callback(msg);
|
||||
}
|
||||
);
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 订阅相机 Topic: %s (Compressed)", camera_topic_.c_str());
|
||||
|
||||
if (enable_gps_) {
|
||||
gps_subscriber_ = this->create_subscription<sensor_msgs::msg::NavSatFix>(
|
||||
gps_topic_,
|
||||
rclcpp::SensorDataQoS(),
|
||||
[this](const sensor_msgs::msg::NavSatFix::SharedPtr msg) {
|
||||
this->gps_callback(msg);
|
||||
}
|
||||
);
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 订阅 GPS Topic: %s", gps_topic_.c_str());
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// 启动后台发送线程
|
||||
// ========================================================================
|
||||
|
||||
sender_running_ = true;
|
||||
sender_thread_ = std::thread(&UdpSenderNode::sender_worker, this);
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 后台发送线程已启动");
|
||||
|
||||
// ========================================================================
|
||||
// 初始化统计
|
||||
// ========================================================================
|
||||
|
||||
stats_.last_report_time = std::chrono::system_clock::now();
|
||||
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 节点初始化完成,等待数据...");
|
||||
RCLCPP_INFO(this->get_logger(), "======================================");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 析构函数
|
||||
*/
|
||||
UdpSenderNode::~UdpSenderNode() {
|
||||
// 停止后台发送线程
|
||||
sender_running_ = false;
|
||||
send_queue_cv_.notify_one(); // 唤醒等待的线程
|
||||
if (sender_thread_.joinable()) {
|
||||
sender_thread_.join();
|
||||
RCLCPP_INFO(this->get_logger(), "✓ 后台发送线程已停止");
|
||||
}
|
||||
|
||||
close_udp_socket();
|
||||
RCLCPP_INFO(this->get_logger(), "UDP Sender Node 已关闭");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 UDP 套接字
|
||||
*/
|
||||
bool UdpSenderNode::init_udp_socket() {
|
||||
// 创建 UDP 套接字
|
||||
udp_socket_ = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (udp_socket_ < 0) {
|
||||
RCLCPP_ERROR(this->get_logger(), "套接字创建失败: %s", strerror(errno));
|
||||
return false;
|
||||
}
|
||||
// 开启广播权限
|
||||
int broadcast_permission = 1;
|
||||
if (setsockopt(udp_socket_, SOL_SOCKET, SO_BROADCAST, &broadcast_permission, sizeof(broadcast_permission)) < 0) {
|
||||
RCLCPP_WARN(this->get_logger(), "设置 SO_BROADCAST 失败");
|
||||
}
|
||||
|
||||
// 设置套接字可重用
|
||||
int opt = 1;
|
||||
if (setsockopt(udp_socket_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
|
||||
RCLCPP_WARN(this->get_logger(), "设置 SO_REUSEADDR 失败");
|
||||
}
|
||||
|
||||
// 设置发送缓冲区
|
||||
// 增加缓冲区大小到 4MB (4 * 1024 * 1024) 以应对高码率 MJPEG 流
|
||||
int buffer_size = 4 * 1024 * 1024;
|
||||
if (setsockopt(udp_socket_, SOL_SOCKET, SO_SNDBUF, &buffer_size, sizeof(buffer_size)) < 0) {
|
||||
RCLCPP_WARN(this->get_logger(), "设置发送缓冲区失败 (尝试 4MB): %s", strerror(errno));
|
||||
// Fallback to smaller buffer if failed
|
||||
buffer_size = 512 * 1024;
|
||||
setsockopt(udp_socket_, SOL_SOCKET, SO_SNDBUF, &buffer_size, sizeof(buffer_size));
|
||||
} else {
|
||||
// 验证实际设置的大小 (Linux 内核通常会将其翻倍)
|
||||
int actual_buf_size = 0;
|
||||
socklen_t opt_len = sizeof(actual_buf_size);
|
||||
if (getsockopt(udp_socket_, SOL_SOCKET, SO_SNDBUF, &actual_buf_size, &opt_len) == 0) {
|
||||
RCLCPP_INFO(this->get_logger(), "UDP 发送缓冲区已设置为: %d bytes", actual_buf_size);
|
||||
}
|
||||
}
|
||||
|
||||
// 设置非阻塞模式
|
||||
int flags = fcntl(udp_socket_, F_GETFL, 0);
|
||||
fcntl(udp_socket_, F_SETFL, flags | O_NONBLOCK);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭 UDP 套接字
|
||||
*/
|
||||
void UdpSenderNode::close_udp_socket() {
|
||||
if (udp_socket_ >= 0) {
|
||||
close(udp_socket_);
|
||||
udp_socket_ = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 发送 UDP 数据包
|
||||
*/
|
||||
int UdpSenderNode::send_udp_packet(const uint8_t* data, uint16_t len) {
|
||||
if (udp_socket_ < 0 || !data || len == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct sockaddr_in addr;
|
||||
std::memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(target_port_);
|
||||
addr.sin_addr.s_addr = inet_addr(target_ip_.c_str());
|
||||
|
||||
int retries = 0;
|
||||
const int MAX_RETRIES = 5;
|
||||
ssize_t sent = -1;
|
||||
|
||||
while (retries < MAX_RETRIES) {
|
||||
sent = sendto(udp_socket_, data, len, 0, (struct sockaddr*)&addr, sizeof(addr));
|
||||
|
||||
if (sent > 0) {
|
||||
bytes_sent_ += sent;
|
||||
packets_sent_++;
|
||||
return sent;
|
||||
}
|
||||
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
// 资源暂时不可用,等待并重试
|
||||
retries++;
|
||||
// 短暂休眠 1ms,给内核一点时间清空缓冲区
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(1000));
|
||||
continue;
|
||||
} else {
|
||||
// 其他错误,直接退出
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 如果重试后仍然失败
|
||||
if (sent <= 0) {
|
||||
// 简单的错误限流日志
|
||||
static auto last_error_time = std::chrono::steady_clock::now();
|
||||
auto now = std::chrono::steady_clock::now();
|
||||
if (std::chrono::duration_cast<std::chrono::seconds>(now - last_error_time).count() > 5) {
|
||||
RCLCPP_WARN(this->get_logger(), "UDP 发送失败 (即使重试后): %s (errno=%d)", strerror(errno), errno);
|
||||
last_error_time = now;
|
||||
}
|
||||
}
|
||||
|
||||
return sent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 批量将数据包加入发送队列
|
||||
*/
|
||||
void UdpSenderNode::enqueue_packets(std::vector<std::vector<uint8_t>>& packets) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(send_queue_mutex_);
|
||||
|
||||
if (send_queue_.size() + packets.size() > MAX_QUEUE_SIZE) {
|
||||
frames_dropped_++;
|
||||
// 队列满时,丢弃整个 batch,避免部分帧发送
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto& packet_data : packets) {
|
||||
PacketQueueItem item;
|
||||
// 使用 move 避免拷贝
|
||||
item.data = std::move(packet_data);
|
||||
item.enqueue_time = std::chrono::system_clock::now();
|
||||
send_queue_.push(std::move(item));
|
||||
}
|
||||
}
|
||||
|
||||
// 通知发送线程有新数据
|
||||
send_queue_cv_.notify_one();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将数据包加入发送队列
|
||||
*/
|
||||
void UdpSenderNode::enqueue_packet(const uint8_t* data, uint16_t len) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(send_queue_mutex_);
|
||||
|
||||
if (send_queue_.size() >= MAX_QUEUE_SIZE) {
|
||||
frames_dropped_++;
|
||||
return;
|
||||
}
|
||||
|
||||
PacketQueueItem item;
|
||||
item.data.assign(data, data + len);
|
||||
item.enqueue_time = std::chrono::system_clock::now();
|
||||
send_queue_.push(item);
|
||||
}
|
||||
|
||||
// 通知发送线程有新数据
|
||||
send_queue_cv_.notify_one();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 后台发送工作线程
|
||||
*/
|
||||
void UdpSenderNode::sender_worker() {
|
||||
RCLCPP_INFO(this->get_logger(), "发送线程开始运行 PID: %d", (int)getpid());
|
||||
|
||||
// 预分配 batch 内存以减少循环中的分配
|
||||
std::vector<PacketQueueItem> batch;
|
||||
batch.reserve(BATCH_SEND_SIZE);
|
||||
|
||||
while (sender_running_) {
|
||||
try {
|
||||
batch.clear();
|
||||
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(send_queue_mutex_);
|
||||
|
||||
// 如果队列为空,等待条件变量唤醒(等待最多 100ms)
|
||||
if (send_queue_.empty()) {
|
||||
send_queue_cv_.wait_for(lock, std::chrono::milliseconds(100),
|
||||
[this] { return !send_queue_.empty() || !sender_running_; });
|
||||
}
|
||||
|
||||
// 批量获取数据包(一次最多 BATCH_SEND_SIZE 个)
|
||||
while (!send_queue_.empty() && batch.size() < BATCH_SEND_SIZE) {
|
||||
// 使用 move 避免通过拷贝构造函数复制数据,大幅提高性能
|
||||
batch.push_back(std::move(send_queue_.front()));
|
||||
send_queue_.pop();
|
||||
}
|
||||
}
|
||||
|
||||
// 发送批量数据包(不在锁内进行)
|
||||
for (const auto& item : batch) {
|
||||
send_udp_packet(item.data.data(), item.data.size());
|
||||
}
|
||||
|
||||
} catch (const std::exception& e) {
|
||||
RCLCPP_ERROR(this->get_logger(), "发送线程发生异常: %s", e.what());
|
||||
// 发生异常后稍微休眠一下避免死循环疯狂报错
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
} catch (...) {
|
||||
RCLCPP_ERROR(this->get_logger(), "发送线程发生未知异常");
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
}
|
||||
RCLCPP_INFO(this->get_logger(), "发送线程已退出");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 相机图像回调
|
||||
*/
|
||||
void UdpSenderNode::camera_callback(const sensor_msgs::msg::CompressedImage::SharedPtr msg) {
|
||||
try {
|
||||
if (msg->data.empty()) {
|
||||
RCLCPP_WARN(this->get_logger(), "收到空帧");
|
||||
return;
|
||||
}
|
||||
|
||||
// 直接使用压缩数据,不再解码/重编码
|
||||
const std::vector<uint8_t>& jpeg_data = msg->data;
|
||||
|
||||
// 获取当前 GPS 数据
|
||||
double lat, lon, alt;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(current_gps_data_.mutex);
|
||||
lat = current_gps_data_.latitude;
|
||||
lon = current_gps_data_.longitude;
|
||||
alt = current_gps_data_.altitude;
|
||||
}
|
||||
|
||||
// 分片并发送
|
||||
double timestamp = rclcpp::Clock().now().seconds();
|
||||
uint16_t chunks_sent_local = fragment_and_send(
|
||||
jpeg_data.data(),
|
||||
jpeg_data.size(),
|
||||
timestamp,
|
||||
lat,
|
||||
lon,
|
||||
alt
|
||||
);
|
||||
(void)chunks_sent_local;
|
||||
|
||||
// 记录本帧发送统计,便于调试(每帧输出可能较多,建议仅在调试时启用)
|
||||
// RCLCPP_INFO(this->get_logger(), "帧信息: jpeg_size=%zu bytes, chunks_sent=%u", jpeg_data.size(), chunks_sent_local);
|
||||
|
||||
frame_counter_++;
|
||||
stats_.total_frames++;
|
||||
stats_.total_bytes += jpeg_data.size();
|
||||
|
||||
// 定期打印统计
|
||||
if (enable_fps_stats_ && (frame_counter_ % 300 == 0)) {
|
||||
report_stats();
|
||||
}
|
||||
|
||||
} catch (const std::exception& e) {
|
||||
RCLCPP_ERROR(this->get_logger(), "相机回调异常: %s", e.what());
|
||||
frames_dropped_++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief GPS 回调
|
||||
*/
|
||||
void UdpSenderNode::gps_callback(const sensor_msgs::msg::NavSatFix::SharedPtr msg) {
|
||||
std::lock_guard<std::mutex> lock(current_gps_data_.mutex);
|
||||
current_gps_data_.latitude = msg->latitude;
|
||||
current_gps_data_.longitude = msg->longitude;
|
||||
current_gps_data_.altitude = msg->altitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将 Mat 编码为 JPEG
|
||||
*/
|
||||
bool UdpSenderNode::encode_to_jpeg(const cv::Mat& frame, int quality, std::vector<uint8_t>& output) {
|
||||
try {
|
||||
std::vector<int> params{cv::IMWRITE_JPEG_QUALITY, quality};
|
||||
cv::imencode(".jpg", frame, output, params);
|
||||
return !output.empty();
|
||||
} catch (const cv::Exception& e) {
|
||||
RCLCPP_ERROR(this->get_logger(), "OpenCV 编码异常: %s", e.what());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 分片并发送
|
||||
*/
|
||||
uint16_t UdpSenderNode::fragment_and_send(
|
||||
const uint8_t* jpeg_data,
|
||||
uint32_t jpeg_len,
|
||||
double timestamp,
|
||||
double lat,
|
||||
double lon,
|
||||
double alt) {
|
||||
|
||||
// 计算需要的分片数
|
||||
uint16_t payload_size = max_packet_size_ - sizeof(PacketHeader);
|
||||
uint16_t total_chunks = (jpeg_len + payload_size - 1) / payload_size;
|
||||
|
||||
if (total_chunks > MAX_CHUNKS) {
|
||||
RCLCPP_WARN(this->get_logger(), "帧太大,超过最大分片数");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 预分配所有分片,进行批量入队
|
||||
std::vector<std::vector<uint8_t>> frame_packets;
|
||||
frame_packets.reserve(total_chunks);
|
||||
|
||||
uint16_t chunks_sent = 0;
|
||||
|
||||
// 创建每个分片
|
||||
for (uint16_t i = 0; i < total_chunks; i++) {
|
||||
uint16_t current_payload_size = std::min(
|
||||
(uint32_t)payload_size,
|
||||
jpeg_len - (uint32_t)i * payload_size
|
||||
);
|
||||
|
||||
// 构造包头
|
||||
PacketHeader header;
|
||||
header.magic = SKYLINK_MAGIC;
|
||||
header.frame_id = frame_counter_;
|
||||
header.total_chunks = total_chunks;
|
||||
header.chunk_index = i;
|
||||
header.data_len = current_payload_size;
|
||||
header.timestamp = timestamp;
|
||||
header.lat = lat;
|
||||
header.lon = lon;
|
||||
header.alt = alt;
|
||||
header.crc16 = 0; // TODO: 计算 CRC
|
||||
header.reserve = 0;
|
||||
|
||||
// 创建完整数据包
|
||||
std::vector<uint8_t> packet(sizeof(PacketHeader) + current_payload_size);
|
||||
std::memcpy(packet.data(), &header, sizeof(PacketHeader));
|
||||
std::memcpy(
|
||||
packet.data() + sizeof(PacketHeader),
|
||||
jpeg_data + i * payload_size,
|
||||
current_payload_size
|
||||
);
|
||||
|
||||
frame_packets.push_back(std::move(packet)); // Move 到 vector 中
|
||||
chunks_sent++;
|
||||
}
|
||||
|
||||
// 批量入队,减少锁的竞争
|
||||
enqueue_packets(frame_packets);
|
||||
|
||||
return chunks_sent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 报告统计信息
|
||||
*/
|
||||
void UdpSenderNode::report_stats() {
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
now - stats_.last_report_time
|
||||
).count();
|
||||
|
||||
// 获取当前队列深度
|
||||
size_t current_queue_depth = 0;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(send_queue_mutex_);
|
||||
current_queue_depth = send_queue_.size();
|
||||
}
|
||||
|
||||
if (elapsed_seconds > 0) {
|
||||
// 计算本周期的帧数和字节数(不是累计值)
|
||||
uint32_t frames_this_period = stats_.total_frames;
|
||||
uint32_t bytes_this_period = stats_.total_bytes;
|
||||
|
||||
// 计算实时 FPS 和吞吐量
|
||||
uint32_t fps = frames_this_period / elapsed_seconds;
|
||||
uint32_t kbps = (bytes_this_period / elapsed_seconds) / 1024;
|
||||
|
||||
// 计算队列使用率(百分比)
|
||||
float queue_utilization = (current_queue_depth * 100.0f) / MAX_QUEUE_SIZE;
|
||||
|
||||
RCLCPP_INFO(this->get_logger(),
|
||||
"发送统计 - FPS: %u, 速率: %u KB/s, 总帧: %u, 总包: %u, 丢弃: %u, 队列: %zu/%zu (%.1f%%)",
|
||||
fps, kbps, frame_counter_, packets_sent_.load(), frames_dropped_.load(),
|
||||
current_queue_depth, MAX_QUEUE_SIZE, queue_utilization
|
||||
);
|
||||
|
||||
// 如果队列接近满,发出警告
|
||||
if (queue_utilization > 80.0f) {
|
||||
RCLCPP_WARN(this->get_logger(),
|
||||
"发送队列接近饱和 (%.1f%%),建议检查网络或增加发送线程",
|
||||
queue_utilization
|
||||
);
|
||||
}
|
||||
|
||||
// 重置周期统计
|
||||
stats_.total_frames = 0;
|
||||
stats_.total_bytes = 0;
|
||||
stats_.last_report_time = now;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 主函数
|
||||
*/
|
||||
int main(int argc, char* argv[]) {
|
||||
rclcpp::init(argc, argv);
|
||||
auto node = std::make_shared<UdpSenderNode>();
|
||||
rclcpp::spin(node);
|
||||
rclcpp::shutdown();
|
||||
return 0;
|
||||
}
|
||||
@@ -9,13 +9,21 @@
|
||||
/camera_driver:
|
||||
ros__parameters:
|
||||
# 相机驱动参数(对应 launch 中的 node name: camera_driver)
|
||||
video_device: "/dev/video6"
|
||||
framerate: 30.0
|
||||
image_width: 640
|
||||
image_height: 480
|
||||
camera_topic: "/camera/image_raw/compressed"
|
||||
camera_frame: "camera"
|
||||
enable_fps_stats: true
|
||||
video_device: 2 # OpenCV 摄像头索引,例如 0 代表 /dev/video0,2 代表 /dev/video2
|
||||
|
||||
image_width: 3840
|
||||
image_height: 2160
|
||||
|
||||
# 调试参数
|
||||
frame_rate: 30.0 # 帧率
|
||||
fourcc: "MJPG" # 视频流格式: MJPG, YUYV 等
|
||||
auto_exposure: true # 自动曝光开关: true=自动, false=手动
|
||||
exposure_value: -5.0 # 曝光值 (仅在 auto_exposure=false 时生效, 具体范围取决于设备,通常是负数或很小的正数)
|
||||
|
||||
# 拍照功能配置
|
||||
save_dir: "./camera_data"
|
||||
interval: 5.0 # 自动拍照间隔(秒),设为 0 则仅通过服务触发拍照
|
||||
gps_topic: "/gps_info"
|
||||
|
||||
/udp_sender:
|
||||
ros__parameters:
|
||||
@@ -26,7 +34,7 @@
|
||||
sender_thread_name: "skylink_sender"
|
||||
|
||||
# 相机相关(udp_sender 使用的 topic / 图像格式)
|
||||
camera_topic: "/camera/image_raw/compressed"
|
||||
camera_topic: "/camera/image_raw"
|
||||
camera_frame: "bgr8"
|
||||
|
||||
# JPEG 压缩配置
|
||||
@@ -50,17 +58,3 @@
|
||||
qos_keep_last: 10 # 增加消息队列深度
|
||||
enable_batch_send: true # 启用批量发送优化
|
||||
send_interval_ms: 0 # 发送间隔(0 表示尽快发送)
|
||||
|
||||
/device_info_sender:
|
||||
ros__parameters:
|
||||
info_port: 10000
|
||||
target_ip: "255.255.255.255"
|
||||
broadcast_interval_ms: 1000
|
||||
enable_broadcast: true
|
||||
enable_request_response: true
|
||||
device_path: "/dev/video6"
|
||||
device_name: "Unknown"
|
||||
width: 1280
|
||||
height: 720
|
||||
framerate: 30.0
|
||||
pixel_format: "YUYV"
|
||||
@@ -10,12 +10,12 @@ def generate_launch_description():
|
||||
SkyLink Bridge 启动配置
|
||||
|
||||
用法:
|
||||
ros2 launch skylink_bridge bridge.launch.py
|
||||
ros2 launch skylink_bridge bridge.launch.py target_ip:=192.168.1.100 jpeg_quality:=80
|
||||
ros2 launch skylink_bridge_python bridge.launch.py
|
||||
ros2 launch skylink_bridge_python bridge.launch.py target_ip:=192.168.1.100 jpeg_quality:=80
|
||||
"""
|
||||
|
||||
# 获取包共享目录
|
||||
pkg_share_dir = get_package_share_directory('skylink_bridge')
|
||||
pkg_share_dir = get_package_share_directory('skylink_bridge_python')
|
||||
config_file = os.path.join(pkg_share_dir, 'config', 'params.yaml')
|
||||
|
||||
# ========================================================================
|
||||
@@ -34,18 +34,6 @@ def generate_launch_description():
|
||||
description='UDP 目标端口'
|
||||
)
|
||||
|
||||
jpeg_quality_arg = DeclareLaunchArgument(
|
||||
'jpeg_quality',
|
||||
default_value='70',
|
||||
description='JPEG 压缩质量 (1-100)'
|
||||
)
|
||||
|
||||
camera_topic_arg = DeclareLaunchArgument(
|
||||
'camera_topic',
|
||||
default_value='/camera/image_raw',
|
||||
description='相机 Topic 名称'
|
||||
)
|
||||
|
||||
gps_topic_arg = DeclareLaunchArgument(
|
||||
'gps_topic',
|
||||
default_value='/mavros/global_position/global',
|
||||
@@ -56,15 +44,12 @@ def generate_launch_description():
|
||||
# ========================================================================
|
||||
|
||||
camera_driver_node = Node(
|
||||
package='skylink_bridge',
|
||||
package='skylink_bridge_python',
|
||||
executable='camera_driver_node',
|
||||
name='camera_driver',
|
||||
output='screen',
|
||||
parameters=[
|
||||
config_file, # 从 YAML 配置文件加载参数
|
||||
{
|
||||
'camera_topic': LaunchConfiguration('camera_topic'),
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
@@ -73,7 +58,7 @@ def generate_launch_description():
|
||||
# ========================================================================
|
||||
|
||||
udp_sender_node = Node(
|
||||
package='skylink_bridge',
|
||||
package='skylink_bridge_python',
|
||||
executable='udp_sender_node',
|
||||
name='udp_sender',
|
||||
output='screen',
|
||||
@@ -100,9 +85,7 @@ def generate_launch_description():
|
||||
return LaunchDescription([
|
||||
target_ip_arg,
|
||||
target_port_arg,
|
||||
jpeg_quality_arg,
|
||||
camera_topic_arg,
|
||||
gps_topic_arg,
|
||||
camera_driver_node,
|
||||
udp_sender_node,
|
||||
# udp_sender_node,
|
||||
])
|
||||
23
skylink_ros2_ws/src/skylink_bridge_python/package.xml
Normal file
23
skylink_ros2_ws/src/skylink_bridge_python/package.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>skylink_bridge_python</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="737666956@qq.com">flower</maintainer>
|
||||
<license>TODO: License declaration</license>
|
||||
|
||||
|
||||
<test_depend>python3-pytest</test_depend>
|
||||
|
||||
<!-- ros2 依赖 -->
|
||||
<exec_depend>rclpy</exec_depend>
|
||||
<exec_depend>std_msgs</exec_depend>
|
||||
<exec_depend>std_srvs</exec_depend>
|
||||
<exec_depend>sensor_msgs</exec_depend>
|
||||
<exec_depend>python3-opencv</exec_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_python</build_type>
|
||||
</export>
|
||||
</package>
|
||||
4
skylink_ros2_ws/src/skylink_bridge_python/setup.cfg
Normal file
4
skylink_ros2_ws/src/skylink_bridge_python/setup.cfg
Normal file
@@ -0,0 +1,4 @@
|
||||
[develop]
|
||||
script_dir=$base/lib/skylink_bridge_python
|
||||
[install]
|
||||
install_scripts=$base/lib/skylink_bridge_python
|
||||
32
skylink_ros2_ws/src/skylink_bridge_python/setup.py
Normal file
32
skylink_ros2_ws/src/skylink_bridge_python/setup.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
package_name = 'skylink_bridge_python'
|
||||
|
||||
setup(
|
||||
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']),
|
||||
('share/' + package_name + '/launch', ['launch/bridge.launch.py']),
|
||||
('share/' + package_name + '/config', ['config/params.yaml']),
|
||||
],
|
||||
install_requires=['setuptools'],
|
||||
zip_safe=True,
|
||||
maintainer='flower',
|
||||
maintainer_email='737666956@qq.com',
|
||||
description='TODO: Package description',
|
||||
license='TODO: License declaration',
|
||||
extras_require={
|
||||
'test': [
|
||||
'pytest',
|
||||
],
|
||||
},
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
'camera_driver_node = skylink_bridge_python.camera_driver_node:main'
|
||||
],
|
||||
},
|
||||
)
|
||||
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user