一 准备过程
部署环境:Ubuntu/WSL2
安装教程: https://blog.youkuaiyun.com/qq_46101866/article/details/140473291
可以运行planning_simulator.launch.xml进行autoware自带的规划跟踪demo
二 开启自定义的过程
2.1 档位控制
想在autoware的环境下进行PnC自定义算法的搭建和验证,第一步首先就是要能够自己控制车辆,AutoWare和之前用过的PreScan和CarSim略有不同,具有档位的控制,更加贴近真实车辆。对控制来说,如果让车前进,档位必须在D档,先查看autoware车辆接收档位的topic,并查看topic的发送格式
ros2 topic info /control/command/gear_cmd
内容输出如下:
Type: autoware_vehicle_msgs/msg/GearCommand
Publisher count: 0
Subscription count: 2
可知topic的类型是 autoware_vehicle_msgs/msgs/GearCommand, 我们来看一下里面的内容,终端输入
ros2 interface show autoware_vehicle_msgs/msg/GearCommand
输出如下:
uint8 NONE = 0
uint8 NEUTRAL = 1
uint8 DRIVE = 2
uint8 DRIVE_2 = 3
uint8 DRIVE_3 = 4
uint8 DRIVE_4 = 5
uint8 DRIVE_5 = 6
uint8 DRIVE_6 = 7
uint8 DRIVE_7 = 8
uint8 DRIVE_8 = 9
uint8 DRIVE_9 = 10
uint8 DRIVE_10 = 11
uint8 DRIVE_11 = 12
uint8 DRIVE_12 = 13
uint8 DRIVE_13 = 14
uint8 DRIVE_14 = 15
uint8 DRIVE_15 = 16
uint8 DRIVE_16 = 17
uint8 DRIVE_17 = 18
uint8 DRIVE_18 = 19
uint8 REVERSE = 20
uint8 REVERSE_2 = 21
uint8 PARK = 22
uint8 LOW = 23
uint8 LOW_2 = 24
builtin_interfaces/Time stamp
int32 sec
uint32 nanosec
uint8 command
可以看到每个车有这么多档位可以选择,疑问:正常车辆不就是D、R、N、P四个档位吗,后来猜测有可能是对应手动挡的档位,问了下GPT解答如下
解释清楚后,在终端中准备发送一个换挡指令,在发送之前先看一下现在的档位,从图标可以看到是P档。
在终端发送档位切换命令,在指令那个图中查到2对应D档,终端输入
ros2 topic pub --once /control/command/gear_cmd autoware_vehicle_msgs/msg/GearCommand '{command: 2}'
可以看到仿真界面已经切换:
再试一次R档,对应数字为20
ros2 topic pub --once /control/command/gear_cmd autoware_vehicle_msgs/msg/GearCommand '{command: 20}'
查看仿真界面,已经切换。
2.2 横纵向控制
档位可以控制后,下一步就是控制车辆的横纵向运动,和档位一样,首先查看对应topic的type,终端输入命令
ros2 topic info /control/command/control_cmd
输出为
Type: autoware_control_msgs/msg/Control
Publisher count: 0
Subscription count: 3
我们继续查看这个类型里面的内容,终端输入:
ros2 interface show autoware_control_msgs/msg/Control
输出内容为:
# Control message with lateral and longitudinal components
# Time this message was created
builtin_interfaces/Time stamp
int32 sec
uint32 nanosec
# Time this configuration state is expected to be achieved in (optional)
builtin_interfaces/Time control_time
int32 sec
uint32 nanosec
# Lateral control command
Lateral lateral
#
#
#
builtin_interfaces/Time stamp
int32 sec
uint32 nanosec
builtin_interfaces/Time control_time
int32 sec
uint32 nanosec
float32 steering_tire_angle
float32 steering_tire_rotation_rate
bool is_defined_steering_tire_rotation_rate
# Longitudinal control command
Longitudinal longitudinal
#
#
builtin_interfaces/Time stamp
int32 sec
uint32 nanosec
builtin_interfaces/Time control_time
int32 sec
uint32 nanosec
float32 velocity
float32 acceleration
float32 jerk
bool is_defined_acceleration
bool is_defined_jerk
可以看出,无论是横向还是纵向,Autoware都有许多种控制方法,以横向控制为例,可以选择控制方向盘转角或者方向盘角速度,那么我们先来测试一下方向盘转角控制,将横向指令的前轮转角设置为15°(0.2618rad),角速度设置为0,是否启用角速度控制设置为false,纵向控制先都不设置,查看输入指令前的车辆情况。
终端输入:
ros2 topic pub --once /control/command/control_cmd autoware_control_msgs/msg/Control '
{
"lateral": {
"steering_tire_angle": 0.2618,
"steering_tire_rotation_rate": 0.0,
"is_defined_steering_tire_rotation_rate": false
},
"longitudinal": {
"velocity": 0.0,
"acceleration": 0.0,
"jerk": 0.0,
"is_defined_acceleration": false,
"is_defined_jerk": false
}
}'
在RVIZ仿真界面可以看到,方向盘转角已经变成15°
下面先让方向盘转角归0(省略代码),然后测试一下角速度控制,横向控制参数为,方向盘转角0,方向盘角速度0.52356rad/s(30°/s),是否启用方向盘转角速度控制true,纵向设置为0,指令如下:
ros2 topic pub --once /control/command/control_cmd autoware_control_msgs/msg/Control '
{
"lateral": {
"steering_tire_angle": 0,
"steering_tire_rotation_rate": 0.52356,
"is_defined_steering_tire_rotation_rate": true
},
"longitudinal": {
"velocity": 0.0,
"acceleration": 0.0,
"jerk": 0.0,
"is_defined_acceleration": false,
"is_defined_jerk": false
}
}'
可是输入指令后车辆仿真界面方向盘转角并没有变化,怀疑这个只是一个接口,不过无关紧要,可以控制方向盘转角就足够完成横向控制了,这个问题留在以后有时间再测试。
纵向控制分为速度,加速度,冲击度这三种控制方式进行控制,先进行速度控制测试,速度:0.5m/s, 加速度 0 冲击度 0, 两个标志位都设为false,终端输入(不要忘记档位设置为D档):
ros2 topic pub --once /control/command/gear_cmd autoware_vehicle_msgs/msg/GearCommand '{command: 2}'
ros2 topic pub -r 10 /control/command/control_cmd autoware_control_msgs/msg/Control '
{
"lateral": {
"steering_tire_angle": 0.0,
"steering_tire_rotation_rate": 0.0,
"is_defined_steering_tire_rotation_rate": false
},
"longitudinal": {
"velocity": 0.5,
"acceleration": 0.0,
"jerk": 0.0,
"is_defined_acceleration": false,
"is_defined_jerk": false
}
}'
结果发现,速度不起作用。。。车依然静止,感觉和横向的角速度一样,只给个接口,或者当前车辆模型不支持速度控制,接着测试加速度控制,给一个小的加速度0.1m/s^2
车辆成功启动
总结:横向通过控制方向盘转角,纵向通过控制加速度成功控制车辆。
后续待完成:
1. 其他测试不起作用的控制方法不成功的原因(GPT的回答是Autoware的原因,但是我猜测和加载的车辆模型原因);
2. 控制量到车身是理想控制?
下一章会进行定位和感知的测试。