ROS功能包开机自启动(2步解决)

为了实现小车在开机后能自动启动相关功能模块需要解决两个问题

1.准备启动脚本文件加载对应的rosnode和roslaunch,整合相关节点按需要顺序进行,防止报错

2.设置开启启动脚本相关内容

既然是自启动,不能避免USB数据传输的一些问题:(后续如果出现可看这篇博客解决方法)

ubuntu工控机固定设备usb串口号(详细)_ubuntu固定串口号-CSDN博客

1.1 修改bashrc文件

1.##打开bashrc文本
sudo gedit ~/.bashrc

2.在文件末尾加入需要sourece的工作空间
source ~/xxx/devel/setup.bash

3.保存bashrc设置,若不操作则无效
source ~/.bashrc

1.2 调用rosnode和roslaunch文件,注意先后顺序

1.2.1 方式1采用launch运行(参考我的如下:)

按格式进行修改
<include file="$(find “你功能包名”)/“这里填写功能包下的位置”/“你的文件名”.launch" />

 其中(launch-prefix="gnome-terminal --")这一串代码是将对应的功能模块单独用终端显示

注意如果你脚本是python记得加上.py,C++编译的节点不影响

<launch>


    <include file="$(find tayo01_model)/launch/tayo01_model.launch" />
     <!-- 等待第一个launch文件的节点发布某个话题 -->
    
    <include file="$(find nav_demo)/launch/demo1_navigation.launch" />

    <!-- 显示雷达避障状态 -->
    <node pkg="tayo01_model" type="scan_test.py" name="scan_test" output="screen" 
        launch-prefix="gnome-terminal --" />
    <!-- 显示键盘控制 -->
    <node pkg="tayo01_model" type="key_topic.py" name="key_topic" output="screen" 
        launch-prefix="gnome-terminal --" />

    <!-- 加载路网 -->
    <node pkg="waypoint_saver" name="marker_publisher_node" type="marker_publisher_node" />



</launch>

然后直接运行该launch文件 

1.2.1 方式2(没特殊要求直接采用方式1),采用python或者其他脚本运行(这里有点问题,只运行了第一个launch就是后续多个launch文件没有延时运行,代码有点问题),提前地方不变替换主函数中的对应的 launch_process(["roslaunch", "tayo01_model", "start_nav.launch"])即可,(文件类型,功能包名,文件名)

#!/usr/bin/env python
import subprocess
import time

def launch_process(command, wait=True):
    """启动一个子进程"""
    try:
        print(f"启动: {' '.join(command)}")
        process = subprocess.Popen(command)
        if wait:
            process.wait()
            if process.returncode != 0:
                print(f"命令失败: {' '.join(command)},退出码: {process.returncode}")
                exit(process.returncode)
        return process
    except Exception as e:
        print(f"启动失败: {' '.join(command)}\n错误: {e}")
        exit(1)

if __name__ == "__main__":
    try:
        # 启动第一个 launch 文件,不等待
        launch_process(["roslaunch", "tayo01_model", "start_nav.launch"])
        print("启动第一个节点")
        # 等待 5 秒(如需要)
        # time.sleep(5)

        # 启动第二个节点
        #launch_process(["roslaunch", "nav_demo", "demo1_navigation.launch"])

        # 等待 3 秒(如需要)
        #time.sleep(3)

        # 启动第三个 launch 文件
        #launch_process(["roslaunch", "package3", "third.launch"])

        print("所有任务已完成!")
    except Exception as main_error:
        print(f"脚本运行出错: {main_error}")
        exit(1)

1.3.按顺序启动节点

由于部分节点运行依赖于其他节点,所以要注意启动的顺序按自己需要进行,可以一次加入一部分分步进行测试

2. 设置开机自启动

2.1 编写run.sh自启动文件

将代码中source和launch修改为自己的,将工作和系统空间的变量source加入

#!/bin/bash
source /opt/ros/noetic/setup.bash 
source ~/learn_ws/devel/setup.bash 
roslaunch nav_pkg nav.launch

sleep 5
exit 0

2.2 给test.sh设置权限

#这一步必须进行(对应自己的test.sh位置)
sudo chmod +x  /home/ply1/learn_ws/run.sh

2.3 添加到系统进程

gnome-session-properties

 名称随便命名,命令为该test.sh的位置,注释方便自己了解就行,修改后关闭设置

 

2.4 测试

到此完成了整个ros节点的自启动,可以重启系统测试是否可行(前面代码中加了sleep 5 会等待几秒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值