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

相关文章

你的华为手机升级了吗? 鸿蒙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 版本一、安装 和

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,