ROS机器人开机自启动(systemd 版本)

2024-06-13 01:38

本文主要是介绍ROS机器人开机自启动(systemd 版本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

配置/etc/rc.local的内容如下:

#!/bin/bash -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
source /opt/ros/kinetic/setup.bash
source ~/zfak_ws/install/setup.bashecho "y" | rosclean purge
du -sh ~/.ros#-------------------Route Model--------------------#
export ROS_IP=192.168.1.101
export ROS_HOSTNAME=$ROS_IP
export ROS_MASTER_URI=http://192.168.1.101:11311
#--------------------------------------------------##-------------------Default WS---------------------#
cd ~/zfak_ws/install/lib/system_scripts
echo 4 | ./start_choose.sh
#--------------------------------------------------#exit 0

注意:原始的为/bin/sh -e,ROS的应该修改为 /bin/bash -e.

在 /lib/systemd/system/rc-local.service 的【service】中添加User属性为你当前登录的session,如果不设置,默认使用的是root。完整内容如下:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.local
After=network.target[Service]
Type=forking
User=jld
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes

其中jld为你当前登录的session.

-------------------------------------开机自动启动遇到最大的坑-------------------------------------------------

1.bash和sh的区别

在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。

2.bad file descriptor

最开始在ubuntu desktop版本可以通过Startup Applications配置sh脚本能够正常启动机器人所需要的所有进程(包括:定位、导航、激光、串口交互等),但是使用ubuntu server后没有Startup Applications,所以需要更换一种开机自启动的策略,所以选择Systemd

然后,遇到了问题。在/etc/rc.local中配置sh脚本,其中两个进程都存在打开串口失败的问题。最开始把该问题归结于权限的问题,查找了几天,参考了stackoverflow的问题描述等。

链接:c++ - Opening /dev/ttyUSB0 returns "Bad file descriptor" - Stack Overflow

后来尝试使用root编译catkin_ws,给串口交互的这个Node节点赋予root权限。还是同样的错误。

bad file descriptor

也尝试其他自启动的方式:How to run ROS on startup (bootup),发现和我的策略以及实现方式一样。

链接:https://blog.roverrobotics.com/how-to-run-ros-on-startup-bootup/

实在想不出哪个地方有问题了,难道是我不清楚systemd的启动顺序和流程,(确实不清楚

是不是系统开机自启动的时候,串口还没有准备好,roslaunch就去打开这个串口设备,导致bad file descriptor

也有可能,是吧??? 

最终,我开始去从代码端入手去查找问题,先看打印perror的地方在哪里?哪一部分导致了这个错误。

open串口正常,设置串口属性的位置出错,说明fd不正常。往前查。。。fd来自于哪里?

if (tcgetattr(fd,&newtio) < 0) {perror("tcgetattr error");return -1;
}

原始返回fd的代码,如下:

int open_port(char *comport)
{int fd;fd = open(comport, O_RDWR|O_NOCTTY|O_NDELAY);if (-1 == fd){perror("Can't Open Serial Port");return(-1);}if(fcntl(fd, F_SETFL, 0)<0)printf("fcntl failed!\n");else//printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));if(isatty(STDIN_FILENO)==0)printf("standard input is not a terminal device\n");else//printf("isatty success!\n");//printf("fd-open=%d\n",fd);return fd;
}

看着有啥问题没有?仔细分析这个open_port函数到底有没有问题。

----------------------------------------更新-------------2020/10/26----------------

树莓派自启动相关: (虽然我没有测试过,但和我的想法一样, 可行)

Raspberry Pi Documentation - Using Linux

Raspberry Pi Documentation - Using Linux

这篇关于ROS机器人开机自启动(systemd 版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055931

相关文章

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和