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 后自动关闭。

相关推荐
iphone1082 分钟前
一次编码,多端运行:HTML5多终端调用
前端·javascript·html·html5
老坛00120 分钟前
2025决策延迟的椭圆算子分析:锐减协同工具的谱间隙优化
前端
老坛00121 分钟前
从记录到预测:2025新一代预算工具如何通过AI实现前瞻性资金管理
前端
今禾24 分钟前
" 当Base64遇上Blob,图像转换不再神秘,让你的网页瞬间变身魔法画布! "
前端·数据可视化
华科云商xiao徐28 分钟前
高性能小型爬虫语言与代码示例
前端·爬虫
十盒半价29 分钟前
深入理解 React useEffect:从基础到实战的全攻略
前端·react.js·trae
攀登的牵牛花30 分钟前
Electron+Vue+Python全栈项目打包实战指南
前端·electron·全栈
iccb101330 分钟前
我是如何实现在线客服系统的极致稳定性与安全性的
前端·javascript·后端
一大树31 分钟前
Vue3祖孙组件通信方法总结
前端·vue.js
不要进入那温驯的良夜32 分钟前
跨平台UI自动化-Appium
前端