配置机载电脑开机自启动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
相关推荐
维度攻城狮1 天前
交互式机器人编程:使用Jupyter Notebook运行ROS2程序
jupyter·机器人·ros2
wzyannn3 天前
Ubuntu24.04下ROS2和MoveIt2控制六轴机械臂(持续更新)
ros·机械臂·ros2
小屁猪qAq4 天前
ROS2 节点中使用参数
开发语言·c++·参数·ros2
WWZZ20255 天前
Isaac Sim入门——基础用法
机器人·大模型·机械臂·ros2·具身智能·isaac sim
General_G6 天前
ROS2资源汇总
linux·机器人·ros2
lvbinemail8 天前
配置jenkins.service
java·运维·jenkins·systemctl
-点灯-12 天前
【无标题】
ros2
General_G12 天前
irobot_benchmark的编译和使用
linux·中间件·机器人·ros2
阿豪只会阿巴14 天前
【多喝热水系列】从零开始的ROS2之旅——Day10 话题的订阅与发布1:Python
开发语言·c++·python·ubuntu·ros2
阿豪只会阿巴14 天前
【多喝热水系列】从零开始的ROS2之旅——Day9 初识话题通信:基本命令
c++·笔记·python·ubuntu·ros2