Shell脚本运行多launch

一、代码例子

#!/bin/bash

# 确保ROS环境已经设置好
source /home/handsfree/.bashrc
source /opt/ros/noetic/setup.bash  
# <<< fishros initialize <<<

source /home/handsfree/catkin_ws/devel/setup.bash 
export ROS_HOME="handsfree"
export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
#export PATH="/home/handsfree/anaconda3/envs/yolov5/bin/python:$PATH"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib/HCNetSDKCom

# 确保ROS环境已经设置好
workdir=/home/handsfree/Desktop
workdir2=/home/handsfree/catkin_ws/src/face_recognition/scripts
workdir3=/home/handsfree/catkin_ws/src/robot_voice/src

# 添加 Qt 环境变量
export PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/handsfree/Qt/Qt_6_5/6.6.3/gcc_64/qml:$QML2_IMPORT_PATH

# 打印当前工作目录
echo "Current working directory: $(pwd)"


# 启动 usb_cam 节点
cd $workdir
roslaunch usb_cam cam_test.launch &

# 新建一个终端窗口并运行语言转换
gnome-terminal -- bash -c "cd $workdir; roslaunch vision callyou.launch;exec bash"

二、代码分析

1. 设置 ROS 环境

source /home/handsfree/.bashrc
source /opt/ros/noetic/setup.bash
  • source /home/handsfree/.bashrc : 这行命令源自 ~/.bashrc 文件,通常用于在 Bash 启动时设置用户的环境变量或执行初始化脚本。通过执行 source,系统将加载其中的设置,确保用户的环境变量和其他设置得以生效。

  • source /opt/ros/noetic/setup.bash : 这行命令加载 ROS Noetic 的环境变量,使得 ROS 命令(如 roslaunchroscore 等)可以在当前终端中运行。/opt/ros/noetic/setup.bash 是 ROS Noetic 安装时自动生成的环境配置文件路径。

2. 设置 Catkin 工作空间环境

source /home/handsfree/catkin_ws/devel/setup.bash
  • 这行命令加载 Catkin 工作空间(通常是 ROS 的构建系统)的环境设置,使得在 catkin_ws 工作空间中的包可以正常工作。执行该命令后,rosrunroslaunch 等命令会知道在哪些路径中查找 ROS 包。

3. 设置 ROS_HOME 环境变量

export ROS_HOME="handsfree"
  • export ROS_HOME="handsfree" : 这行命令设置 ROS_HOME 环境变量为 handsfree,这可能是一个自定义的路径或设置。它用于指定 ROS 的工作目录,通常 ROS 会在这个目录下存储一些文件。

4. 设置 CUDA 环境变量

export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
  • export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}} : 这行命令将 CUDA 11.4 的 bin 目录添加到系统的 PATH 环境变量中,确保在终端中能够找到 CUDA 相关的工具(如 nvcc)。

  • export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} : 这行命令将 CUDA 11.4 的 lib64 目录添加到 LD_LIBRARY_PATH 中,确保系统在运行时能够找到 CUDA 的共享库。

5. 注释掉的 Anaconda 环境变量

#export PATH="/home/handsfree/anaconda3/envs/yolov5/bin/python:$PATH"
  • 这行被注释掉的代码将 Anaconda 环境下的 Python 可执行文件目录添加到 PATH 中。虽然被注释掉了,但如果取消注释,它将确保在当前终端会话中使用 Anaconda 环境中的 Python。

6. 设置共享库搜索路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5
  • export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu : 将 /usr/lib/x86_64-linux-gnu 添加到 LD_LIBRARY_PATH 中,确保系统能够找到其他共享库。

  • export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtiff.so.5 : 这行命令将 libtiff.so.5 共享库强制加载到当前程序的内存中。这通常用于解决库冲突或确保特定库被优先加载。

7. 设置 Hikvision ROS 驱动的库路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/handsfree/catkin_ws/src/hikvision_ros/lib/HCNetSDKCom
  • 这两行将 Hikvision ROS 驱动的共享库路径添加到 LD_LIBRARY_PATH 中,确保 ROS 节点在运行时能够找到 Hikvision 相关的库文件。

8. 启动另一个终端运行 ROS 节点

gnome-terminal -- bash -c "cd $workdir; roslaunch vision callyou.launch; exec bash"
  • gnome-terminal -- bash -c "..." : 这条命令通过 gnome-terminal 启动一个新的终端窗口,并在该终端中执行给定的命令。

  • gnome-terminal 是 GNOME 桌面环境下的终端模拟器命令。它用于启动一个新的终端窗口。在这个命令中,gnome-terminal 将打开一个新的终端窗口并执行接下来的命令。

  • bash :这个参数告诉 gnome-terminal 启动一个新的 Bash shell。也就是说,在新的终端窗口中,将运行一个新的 Bash shell 会话。

  • -c "...":

    • -c 是 Bash 命令行的一个选项,表示让 Bash 执行其后跟着的字符串作为命令。"..." 中的内容是一个 Bash 命令序列,这些命令会在新的 Bash 会话中执行。
    • 注意 : 如果没有 -c,Bash 会直接进入交互式模式,而不是执行给定的命令。
  • cd $workdir; roslaunch vision callyou.launch; exce bash : 在新的终端中,首先切换到 $workdir 目录,然后启动 vision 包中的 callyou.launch 文件,最后执行一个新的 bash 会话

  • exec bash:

    • exec 是一个 shell 内置命令,用来替换当前的进程。它会启动一个新的进程并取代当前进程,而不是像普通命令那样在当前 shell 中执行。

    • 在这里,exec bash 启动一个新的 Bash shell,取代当前执行的 Bash 进程。这意味着当 roslaunch 执行完后,终端会保持在一个交互式 Bash 会话中。通过 exec bash你能够在新的终端中继续交互式操作,而不会退出终端。

    • exec 的作用是确保终端窗口保持打开状态,而不是在执行完 roslaunch 后自动关闭。

相关推荐
轻口味13 分钟前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami16 分钟前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
路人甲ing..40 分钟前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
吃杠碰小鸡1 小时前
lodash常用函数
前端·javascript
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
泰伦闲鱼1 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
m0_748250031 小时前
Web 第一次作业 初探html 使用VSCode工具开发
前端·html
一个处女座的程序猿O(∩_∩)O1 小时前
vue3 如何使用 mounted
前端·javascript·vue.js
m0_748235951 小时前
web复习(三)
前端
搬码后生仔1 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net