首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++环境变量创建ROS2项目

使用C++环境变量创建ROS2项目
EN

Stack Overflow用户
提问于 2019-03-15 13:15:07
回答 1查看 407关注 0票数 1

我有以下问题:我编写了一个简单的ROS2 / Qt5 (机器人操作系统)项目,在GUI中展示发行者和订阅者。该项目编译得很好,在将所有Qt5和ROS复制到可执行文件的目录后,应用程序就会启动,但是很快就会关闭/崩溃,而不会给我任何错误。

尝试2:打开一个控制台并为ROS2安装提供源代码(通过运行一个批处理脚本,我相信它会将环境变量加载到控制台中,对吗?)如果我现在在ROS2控制台内启动可执行文件,那么一切都很好.

所以我的假设是,当我编译我的项目并尝试启动它时,它会丢失所有的环境变量,然后崩溃。

有办法避免启动ROS2控制台吗?

用于ROS2安装的批处理脚本在我看来也相当复杂。A不能真正理解它加载什么样的变量。有没有办法使用这个批处理脚本,并将它“钩子”到我的可执行文件中,这样我就不必知道这个脚本具体做了什么?以下是批处理脚本:

代码语言:javascript
复制
:: generated from colcon_core/shell/template/prefix.bat.em
@echo off

:: This script extends the environment with all packages contained in this
:: prefix path.

:: add this prefix to the COLCON_PREFIX_PATH
call:_colcon_prefix_bat_prepend_unique_value COLCON_PREFIX_PATH "%%~dp0"

:: get all packages in topological order
call:_colcon_get_ordered_packages _ordered_packages "%~dp0"

:: source packages
if "%_ordered_packages%" NEQ "" (
  for %%p in ("%_ordered_packages:;=";"%") do (
    call:_colcon_prefix_bat_call_script "%~dp0share\%%~p\package.bat"
  )
  set "_ordered_packages="
)

goto:eof


:: function to prepend a value to a variable
:: which uses semicolons 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_bat_prepend_unique_value
  setlocal enabledelayedexpansion
  :: arguments
  set "listname=%~1"
  set "value=%~2"

  :: get values from variable
  set "values=!%listname%!"
  :: start with the new value
  set "all_values=%value%"
  :: skip loop if values is empty
  if "%values%" NEQ "" (
    :: iterate over existing values in the variable
    for %%v in ("%values:;=";"%") do (
      :: ignore empty strings
      if "%%~v" NEQ "" (
        :: ignore duplicates of value
        if "%%~v" NEQ "%value%" (
          :: keep non-duplicate values
          set "all_values=!all_values!;%%~v"
        )
      )
    )
  )
  :: set result variable in parent scope
  endlocal & (
    set "%~1=%all_values%"
  )
goto:eof


:: Get the package names in topological order
:: using semicolons as separators and avoiding leading separators.
:: first argument: the name of the result variable
:: second argument: the base path to look for packages
:_colcon_get_ordered_packages
  setlocal enabledelayedexpansion

  :: check environment variable for custom Python executable
  if "%COLCON_PYTHON_EXECUTABLE%" NEQ "" (
    if not exist "%COLCON_PYTHON_EXECUTABLE%" (
      echo error: COLCON_PYTHON_EXECUTABLE '%COLCON_PYTHON_EXECUTABLE%' doesn't exist
      exit /b 1
    )
    set "_colcon_python_executable=%COLCON_PYTHON_EXECUTABLE%"
  ) else (
    :: use the Python executable known at configure time
    set "_colcon_python_executable=c:\python37\python.exe"
    :: if it doesn't exist try a fall back
    if not exist "!_colcon_python_executable!" (
      python --version > NUL 2> NUL
      if errorlevel 1 (
        echo error: unable to find python executable
        exit /b 1
      )
      set "_colcon_python_executable=python"
    )
  )

  set "_colcon_ordered_packages="
  for /f %%p in ('""%_colcon_python_executable%" "%~dp0_local_setup_util.py" --merged-install"') do (
    if "!_colcon_ordered_packages!" NEQ "" set "_colcon_ordered_packages=!_colcon_ordered_packages!;"
    set "_colcon_ordered_packages=!_colcon_ordered_packages!%%p"
  )
  endlocal & (
    :: set result variable in parent scope
    set "%~1=%_colcon_ordered_packages%"
  )
goto:eof


:: call the specified batch file and output the name when tracing is requested
:: first argument: the batch file
:_colcon_prefix_bat_call_script
  if exist "%~1" (
    if "%COLCON_TRACE%" NEQ "" echo call "%~1"
    call "%~1%"
  ) else (
    echo not found: "%~1" 1>&2
  )
goto:eof
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-17 07:28:50

不要修改来自ROS2的任何内部代码(甚至批处理文件),请遵循它们的规则启动ros2应用程序。ROS2是在一个复杂的系统中设计的,目的是为了动态加载不同类型的包。我认为通过将dll复制到文件夹,打破了它的库搜索规则。

我建议您通过调用.编写另一个简单的批处理文件。

代码语言:javascript
复制
call <path-to-your-ros2-ws>/setup.bat

并使用正式的ros2命令行工具运行应用程序。

代码语言:javascript
复制
ros2 run <your-package> <executable>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55183483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档