配置机载电脑开机自启动ros2节点和配置can0

在 Linux 系统中设置 ROS 2 节点开机自启动,可以通过 systemd 服务来实现,这是一种可靠且常用的方法。以下是具体步骤:

1.首先创建一个服务文件,例如my_ros2_node.service

bash 复制代码
sudo vim /etc/systemd/system/my_ros2_node.service

2编写服务文件

2.1在文件中添加以下内容

bash 复制代码
[Unit]
Description=My ROS2 Node Service
After=network.target

[Service]
# 以root身份运行,避免sudo权限问题
User=root
Group=root
# 环境变量配置(确保ROS正常运行)
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/ros/humble/bin"
Environment="ROS_DOMAIN_ID=0"
Environment="ROS_HOME=/home/cheng/.ros"
Environment="LD_LIBRARY_PATH=/opt/ros/humble/lib:/usr/local/lib"
WorkingDirectory=/home/cheng/Desktop/PX4_interface_ws
# 执行命令(注意续行符\后无空格)
ExecStart=/bin/bash -c " \
  modprobe slcan && \
  slcand -o -s6 -t hw -S 1000000 /dev/ttyACM0 can0 && \
  ip link set can0 up && \
  MicroXRCEAgent serial --dev /dev/TTYACM1 -b 57600 & AGENT_PID=$! && \
  sleep 6 && \
  source /opt/ros/humble/setup.bash && \
  source /home/cheng/Desktop/PX4_interface_ws/install/setup.bash && \
  ros2 run Manual_Control_Mode Manual_Control_node && \
  kill $AGENT_PID \
"
Restart=always
RestartSec=5

[Install]
WantedBy=graphical.target

2.2sudo 无密码权限怎么解决

法一:2.2.1 赋予用户权限(推荐用2.2.2的方法,上述代码使用的2.2.2)

2.2.1.1打开visudo
bash 复制代码
sudo EDITOR=vim visudo  # 使用 vim 编辑
2.2.1.2添加无密码权限配置
bash 复制代码
# 允许用户 cheng 无密码执行指定命令
cheng ALL=(ALL) NOPASSWD: /usr/bin/slcand, /usr/bin/ip, /usr/bin/MicroXRCEAgent
2.2.1.3验证命令路径

如果不确定命令的实际路径,先用 which 命令确认,避免因路径错误导致权限配置无效:

bash 复制代码
which slcand        # 输出类似 /usr/bin/slcand
which ip            # 输出类似 /usr/bin/ip
which MicroXRCEAgent # 输出类似 /usr/bin/MicroXRCEAgent

如果命令路径与配置中的不同(例如某些系统可能在 /usr/local/bin 下),以 which 命令的输出为准修改配置。

2.2.1.4保存并退出
2.2.1.5 测试无密码权限
bash 复制代码
sudo slcand --help        # 应直接显示帮助信息,不提示输入密码
sudo ip link show         # 应直接显示网络接口信息
sudo MicroXRCEAgent --help # 应直接显示代理帮助信息

法二:2.2.2 root权限执行,见2.1代码,只需要将将User和Group改为:

bash 复制代码
# 以root身份运行,避免sudo权限问题
User=root
Group=root

3.设置权限并保存,执行

bash 复制代码
sudo chmod 644 /etc/systemd/system/my_ros2_node.service
sudo systemctl daemon-reload
sudo systemctl enable my_ros2_node.service
bash 复制代码
sudo systemctl start my_ros2_node.service
sudo systemctl status my_ros2_node.service

4.通过过设备的唯一标识(而非动态编号)来绑定固定的设备名

步骤 1:获取设备的唯一标识
bash 复制代码
# 列出所有ttyACM设备及其属性
udevadm info -a -n /dev/ttyACM1 | grep -E "SUBSYSTEM|ATTRS{idVendor}|ATTRS{idProduct}|ATTRS{serial}|ATTRS{devpath}"
udevadm info -a -n /dev/ttyACM2 | grep -E "SUBSYSTEM|ATTRS{idVendor}|ATTRS{idProduct}|ATTRS{serial}|ATTRS{devpath}"

示例输出(假设):

  • 设备 1(CAN 适配器)serial="CAN_USB_1234"idVendor="0483"idProduct="5740"
  • 设备 2(MicroXRCE 设备)serial="XRCE_USB_5678"idVendor="2341"idProduct="0042"
步骤 2:编写 udev 规则文件
bash 复制代码
sudo nano /etc/udev/rules.d/10-custom-usb.rules

根据步骤 1 获取的标识,添加以下内容

bash 复制代码
# 规则1:绑定CAN适配器到 /dev/can_usb
SUBSYSTEM=="tty", ATTRS{serial}=="CAN_USB_1234", SYMLINK+="can_usb", MODE="0666"

# 规则2:绑定MicroXRCE设备到 /dev/microxrce_usb
SUBSYSTEM=="tty", ATTRS{serial}=="XRCE_USB_5678", SYMLINK+="microxrce_usb", MODE="0666"
步骤 3:生效 udev 规则
bash 复制代码
# 重新加载udev规则
sudo udevadm control --reload-rules
# 触发规则应用到已连接设备
sudo udevadm trigger --subsystem-match=tty --action=change
步骤 4:验证
bash 复制代码
ls -l /dev/can_usb /dev/microxrce_usb
步骤 5:修改你的脚本
bash 复制代码
# 原CAN接口配置
sudo slcand -o -s6 -t hw -S 1000000 /dev/can_usb can0  # 替换为/dev/can_usb
# 原MicroXRCE代理
sudo MicroXRCEAgent serial --dev /dev/microxrce_usb -b 57600  # 替换为/dev/microxrce_usb
相关推荐
悠哉悠哉愿意4 天前
【智能系统项目开发与学习记录】bringup功能包详解
学习·机器人·ros2
悠哉悠哉愿意9 天前
【ROS2学习笔记】URDF 机器人建模
笔记·学习·机器人·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】 TF 坐标系
笔记·学习·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】RViz 三维可视化
笔记·学习·机器人·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】分布式通信
笔记·学习·ros2
悠哉悠哉愿意11 天前
【ROS2学习笔记】rqt 模块化可视化工具
笔记·学习·机器人·ros2
悠哉悠哉愿意11 天前
【ROS2学习笔记】Gazebo 仿真与 XACRO 模型
笔记·学习·机器人·ros2
悠哉悠哉愿意11 天前
【ROS2学习笔记】节点篇:ROS 2编程基础
笔记·学习·ros2
悠哉悠哉愿意12 天前
【ROS2学习笔记】话题通信篇:话题通信项目实践——系统状态监测与可视化工具
笔记·学习·ros2
悠哉悠哉愿意12 天前
【ROS2学习笔记】话题通信篇:python话题订阅与发布
笔记·学习·ros2