室外组二代车上手记录
碎碎念
8月5号拿到室外组二代新车,人有点麻,一方面比赛日期临近,而且二队还没有车。
新车上手后,发现问题很多,首先是密码登不上去,车的所有USB端口都被占满,而且昇腾310的板没有内置wifi,300块的树莓派都有wifi,他没有,而且系统是Ubuntu22(魔改版,单内核)的,只有这个版本的镜像,这导致无法在原生环境跑ros1,
赛事方给出的解决方法是在root用户在跑linux容器,容器为ubuntu20,在此跑ros,然后通过与用户ubuntu20的电脑使用ros的主从机和ssh连接实现远程部分可视化操作
我的评价是,脑残,傻逼操作,垃圾昇腾上位机板卡没wifi,支持的镜像也少,官网查询板卡资料,还带锁,各种注册,还要序列号申请,垃圾板卡,狗都不用。工控机都比他强
碎碎念结束,不管这么说,比赛还是要继续的。
vim常见命令及操作
首先,关闭大写锁定,切换为英语小写模式
基础操作
- 进入文件 vim 文件名,文件不存在会创建文件
- 按a或i进入编辑模式,此时左下方显示 –INSERT–,o新增加一行,进入编辑模式
- 输入文本,后按Ese退出编辑模式,输入:,进入命令行模式
- q为不保存退出,wq为保存退出
- shift+i,在此行最前面加内容,shift+a,在此行最后面就内容
- 普通模式输入gg,光标回到起头,输入shift+g,光标回到最后
配置
小插曲,突然发现图床用不了了,检查发现系统时间用问题,更新一下就可以了,时间问题是因为双系统切换导致的,具体原因不明
输入 vim –version
打开其中的$HOME/.vimrc
Vim $HOME/.vimrc增加set number
vim显示行号
进阶操作
- gg-到第一行
- shift + g 最后一行
- yy-复制当前行
- dd-删除当前行
- u-撤销前次操作
- .重复前次操作
- / 搜索
- :/%s/原单词/新单词/g
zip常见操作
zip的安装,打开终端输入下面两行,安装 zip 和 unzip
1 | sudo apt update |
基本创建
1 | zip archive_name.zip file1 file2 |
解压ZIP文件
1 | unzip archive_name.zip |
linux系统操作命令行
1 | # 过于基本的就略过了 |
与功能包安装及下载相关
1 | 首先检查网路,并且检查时间的准确性 |
ros车设置
新车实录
警告1,所有的端口定义与官方给的教程并不相同,而且雷达端口在车辆启动后拔插会导致该端口丢失。所以开机后不要尝试拔插雷达口,所有USB接口已用小标签标注
警告2,由于升腾的板卡没有WiFi模块,所以通过拓展坞插上网口,连接有网的路由器后,还需要拔掉车载路由器与板卡的网线,否则没有网
警告3,小车的ROS相关进程需要在固定IP下才能运行,该固定IP是由车载路由器固定,也就是说在通过网卡联网时,ROS相关程序会报错,找不到IP之类的,秉持有用就不折腾的原则,ROS关于IP的配置文件就不更改了,后来者自行调整。
室外组上手
镜像
前期准备
打开车和电脑从机,电脑链接下车wifi
终端链接,密码Mind@123
打开VScode,远程链接小车主机
建图
将车放在出发区,位置要记住
在终端出运行
python3 /racecar/src/auto_car/scripts/map_wj.py
运行前打开底盘,运行后,底盘控制小车建图,建完图后,在键盘控制的终端里按g保存地图
打点
建完图后,vscode重开一个终端
python3 /racecar/src/auto_car/scripts/run_way_point_click.py
运行后输入1或2回车,打开从机的rviz,挂载rviz.rviz
如何挂载rviz,点击file,点击rencent config,选择rviz.rviz,如果你是第一次打开,点击open config 在rviz(已经放在代码文件下)文件夹中找到rviz.rviz
点击2D Nav Goal开始打点,打完点后,再次点击2D Nav Goal,使点位与最后一个重合,终端窗口显示,保存成功。
如果选择的是1,可以点击PUBlish Point ,点击空白处,显示之前打的点位,点击publish Point,点击要更改的点,点击
红绿灯与斑马线停车点位修改
修改
start_light_post ,white_go,while_back
开跑
将车放在起始点,运行
python3 /racecar/src/auto_car/scripts/wj_run.py
打开rviz,配置文件选择acml_rviz.rviz
在python3 /racecar/src/auto_car/scripts/wj_run.py代码下的终端回车,车辆开跑。
速度更改vp_min
跑的不好的话,更改点位,再次跑
代码讲解
代码分为3个部分,建图,打点,启动
代码程序总结构
建图代码
map_wj.py
文件map_wj.py,这个代码是建图文件总得启动代码,主要启动两个roslaunch节点和一个python文件。
其中使用subprocess库可以方便在该文件在命令行窗口启动其他窗口,subprocess是非阻塞,打开后和在命令行窗口运行的本程序失去关系,无法通过关闭命令行窗口的方式关闭其打开的其他程序,所以需要使用
ps aux | grep ros | xargs -n 1 kill -9 关闭其打开的其他程序,主要是ros程序。
在建图方面主要做的工作是将多个命令集成到一个python文件中,方便操作。
1 | import subprocess |
Run_gmapping_wy.py
Run_gmapping_wy.py这个是gmapping建图的配置文件,可以通过这个文件改变建图的大小,分辨率,雷达有效范围等
1 |
|
Run_car.launch
这个代码是底盘控制代码,开启这个代码能够开启上位机ros对下位机发送速度指令,下车速度话题名为car/cmd_vel,其他话题运行该launch文件后,使用rostopic list 查看
racecar_teleop.py
这是一个键盘控制小车移动的代码,具体操作键见具体代码
在官方代码里补充了一个按g,保存地图到指定位置的代码行
1 | elif key == 'g' : |
打点
run_way_point_click.py,该程序实现的功能是通过订阅rviz发布的点位将其储存到配置文件中,启动实跑时,将点位发布出去,实现导航
1 | import os |
启动
wj_run.py
启动脚本,集成了底盘launch文件,导航launch文件,控制主程序wj_go_hh.py
1 | import subprocess |
amcl_nav_wy.launch
Run_car.launch文件上面已经介绍过了,这里就不介绍了,acml_nav_wy.launch文件是导航控制文件
该文件同级目录下还有一个文件acml_nav.launch,是官方原文件,这里对他进行了修改,主要在move_base进行修改,由于实际上局部路径规划并没有用到,这里就将其注释掉了,其中,该文件,调用了acml,controller也会介绍
param name=”base_global_planner” value=”navfn/NavfnROS”/该文件中使用的全局路径规划器为NavfnROS,而不是GlobalPlanner,由于时间较短没有测试两者区别。
这里的controller控制器代替了局部路径规划器的功能。
这里介绍一下导航控制代码的总体思路。
wj_run.py脚本会启动底盘节点,导航节点,wj_go_hh.py文件。
wj_go_hh.py会读取之前打点的参数文件,按先后顺序发布,导航节点会调用全局路径规划器,计算出此时位置倒目标点的路径,由node pkg=”racecar” type=”car_controller_new” respawn=”false” name=”car_controller” output=”screen运行的car_controller_new.cpp文件负责发布car/cmd_vel速度与舵机话题控制下位机实现底盘运动。这个代码后面会介绍。
1 |
|
amcl.launch.xml
src\racecar\launch\includes\amcl.launch.xml
该文件是acml配置文件
其中param name=”tf_broadcast” value=”false”/
该参数表示是否将计算的位姿发布到全局,这里我选择了false,由于之前的一代车雷达位姿计算不准,导致位姿乱跳,二代车位姿尚可,但未测试。
在位姿计算准确的情况下,可以防止车辆跑的过程中雷达扫到的图和与建的图不重合,有较大偏差。其他参数chat搜索。自行添加注释
1 |
|
amcl.launch.xml
src\racecar\src\car_controller_new.cpp
代码很长,这里就不放了,自行下载源代码查看。
这个代码很重要,我将其中的舵机限幅改大了,并注释掉了到达目标点后,发布速度为0,舵机打角为0的部分,实际上发布的节点是car/cmd_vel,舵机打角0度,向右偏到最大,90才是正中,修复到达目标点后计算并突然左打角的BUG.
wj_go_hh.py
src\auto_car\scripts\wj_go_hh.py
控制主程序思路读取打点的配置文件,发布目标点,检测自身位置,当目标点与自身位姿小于参数Distance_min(单位m)时,发布下一个目标点
停车思路,这里并没有实际检测红绿灯和斑马线,而是采用定点的方式,首先将参数start_light_post ,white_go ,while_back 写入,横纵坐标,写入后程序会检测打点配置文件中哪些目标点与这些停车点距离最近,在发布到这个目标点时,先停车一段时间后,在出发,停车采用发布/light话题,car_controller_new节点接受到后就会停车。
1 | import rospy |
改进
代码介绍完毕,下面介绍一下改进的思路。
- 由于主程序是一个一个点发布的,每次导航只是专注于此时的目标点,导致路径不平滑,有时由于拐的太大,在下一个目标点,无法回正到正确的轨迹,可尝试对打点的参数文件做平滑处理
- controller_new.cpp文件中还有bug没修改,并且这个控制器不好用,可以自己写一个
- 可以关闭controller,启用局部路径规划,衔接局部路径规划和底盘的代码
赛后结果及其感悟
三个队,国一,国二,国三,结果还行,没崩。