第 7 节

关于实操的一些知识点

作者
刘业晗的头像刘业晗
协作者
房梓豪的头像房梓豪董佳辉的头像董佳辉
发布于 2023/12/30更新于 2026/08/20

这个板块用于记录软件算法组在Linux平台和机器人实操中遇到的常见问题。

一、程序上电自启动

总体控制原理采用服务控制脚本的形式启动,服务开机自启,带动脚本和程序开机自启

首先编写脚本,脚本位置放在项目文件夹下即可

例如mid360的驱动启动脚本

msg_MID360_launch.sh

#!/bin/bash


source /home/liu/.bashrc
source /home/liu/vinci_projects/lio_localization_ws/install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py

为脚本赋值权限

cd ~/project_name/bashes
sudo chmod 777 ./*

编写服务脚本

sudo vim /usr/lib/systemd/system/msg_MID360_launch.service

[Unit]
Description=ros2 launch script#描述

[Service]
#Environment="PYTHONPATH=/home/vinciorin/anaconda3/bin/python"#需要激活conda环境时启用
Type=simple
Environment="ROS_DOMAIN_ID=1"#设置为和你bashrc中的domain ID相同即可
Restart=on-failure#失败自启动
RestartSec=5s
User=vinciorin    # 指定用户名,也就是Ubuntu系统下当前的用户名

ExecStart=/home/$your_path$/bashes/rc_warm.sh   # 运行脚本xxx.sh,确保脚本具备可执行权限,具体指令写在xxx.sh中

PrivateTmp=true
KillMode=control-group

[Install]
WantedBy=multi-user.target#放置在总控脚本中

赋值权限

sudo chmod 777 /usr/lib/systemd/system/msg_MID360_launch.service

测试

#测试脚本
cd ~/pro_jectname/bashes
./msg_MID360_launch.sh
#测试服务
sudo systemctl daemon-reload    # 重新加载服务
systemctl start msg_MID360_launch.service     # 启动服务
systemctl status msg_MID360_launch.service     # 查看服务状态
systemctl enable msg_MID360_launch.service     # 开机启动

总控脚本,用于开机后一键关闭所有自启节点,以手动调试

#!/bin/bash

SERVICES=("ros2_warm.service" "ros2_nav.service")  # 添加所有你的服务

case "$1" in
    start)
        for service in "${SERVICES[@]}"; do
            sudo systemctl start "$service"
        done
        ;;
    stop)
        for service in "${SERVICES[@]}"; do
            sudo systemctl stop "$service"
        done
        ;;
    restart)
        for service in "${SERVICES[@]}"; do
            sudo systemctl restart "$service"
        done
        ;;
    status)
        for service in "${SERVICES[@]}"; do
            echo -e "\nStatus of $service:"
            sudo systemctl status "$service" --no-pager -l
        done
        ;;
    *)
        echo "Usage: ros2ctl {start|stop|restart|status}"
        exit 1
esac

exit 0

二、如何固定串口名称(防止单片机编译、烧录反向供电导致串口号变动,不能防止usb转ttl或者单片机c口烧毁,家中常备usb转ttl。其他解决方案:下位机使用USB与上位机直接通讯)

我写的ros2串口通信包地址:

https://github.com/MoMoxiaohan/ros_serial

关于烧毁的问题,大多是工控机通过usb转ttl或者单片机c口直接向整车供电,瞬时电流过大导致烧毁,暂时不知道怎么解决,可以试着添加类似限流阀的装置

首先查看串口设备号(此方式对应的是上位机端的设备号,所以要固定下位机设备和工控机的接口不变)

udevadm info --attribute-walk --name=/dev/ttyUSB0

找最长的那一条KERNELS

sudo vim /etc/udev/rules.d/usb.rules
KERNELS=="2-3:1.0", MODE:="0777", GROUP:="dialout", SYMLINK+="lowerport"
:wq!

保存

sudo udevadm trigger

查看更名情况

ls -l /dev |grep ttyUSB