配置机载电脑开机自启动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
相关推荐
winfreedoms2 天前
ROS2知识大白话
笔记·学习·ros2
LS_learner4 天前
RViz(ROS Visualization)显示传感器数据、机器人状态、路径规划结果等各种信息的强大图形界面
ros2
LS_learner5 天前
ROS2的jazzy版本的机器人3D仿真软件gazebo的安装和使用
ros2
LS_learner5 天前
Xacro 和 SDF 是进行复杂机器人系统开发与高级仿真的关键技能
ros2
LS_learner5 天前
URDF(Unified Robot Description Format)机器人领域中用于描述机器人模型的标准 XML 格式
ros2
LS_learner5 天前
机器人描述中的Xacro、SDF与URDF在实际项目中的协作流程
ros2
LS_learner5 天前
Gazebo 机器人三维物理仿真平台
ros2
REDcker8 天前
DDS 协议详解
机器人·ros·ros2·dds
LS_learner12 天前
ROS 2(Robot Operating System 2)通信机制
ros2
LS_learner12 天前
ROS2通信DDS 最核心的特性之一 QoS(Quality of Service,服务质量)
ros2