第 7 节
关于实操的一些知识点
这个板块用于记录软件算法组在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


