配置机载电脑开机自启动ros2节点和配置can0
在 Linux 系统中设置 ROS 2 节点开机自启动,可以通过 systemd 服务来实现,这是一种可靠且常用的方法。以下是具体步骤:
1.首先创建一个服务文件,例如my_ros2_node.service
:
sudo vim /etc/systemd/system/my_ros2_node.service
2编写服务文件
2.1在文件中添加以下内容
[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
sudo EDITOR=vim visudo # 使用 vim 编辑
2.2.1.2添加无密码权限配置
# 允许用户 cheng 无密码执行指定命令
cheng ALL=(ALL) NOPASSWD: /usr/bin/slcand, /usr/bin/ip, /usr/bin/MicroXRCEAgent
2.2.1.3验证命令路径
如果不确定命令的实际路径,先用 which
命令确认,避免因路径错误导致权限配置无效:
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 测试无密码权限
sudo slcand --help # 应直接显示帮助信息,不提示输入密码
sudo ip link show # 应直接显示网络接口信息
sudo MicroXRCEAgent --help # 应直接显示代理帮助信息
法二:2.2.2 root权限执行,见2.1代码,只需要将将User和Group改为:
# 以root身份运行,避免sudo权限问题
User=root
Group=root
3.设置权限并保存,执行
sudo chmod 644 /etc/systemd/system/my_ros2_node.service
sudo systemctl daemon-reload
sudo systemctl enable my_ros2_node.service
sudo systemctl start my_ros2_node.service
sudo systemctl status my_ros2_node.service
4.通过过设备的唯一标识(而非动态编号)来绑定固定的设备名
步骤 1:获取设备的唯一标识
# 列出所有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 规则文件
sudo nano /etc/udev/rules.d/10-custom-usb.rules
根据步骤 1 获取的标识,添加以下内容
# 规则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 规则
# 重新加载udev规则
sudo udevadm control --reload-rules
# 触发规则应用到已连接设备
sudo udevadm trigger --subsystem-match=tty --action=change
步骤 4:验证
ls -l /dev/can_usb /dev/microxrce_usb
步骤 5:修改你的脚本
# 原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