CARLA_autoware的配置流程(三)CARLA 与 Autoware 的联合
在上一章中,完成了 ROS 与 CARLA 的联合控制,现在进行 CARLA 与 Autoware 的联合控制流程。
话题的转发
2023年 07月 15日 星期六 15:17:04 CST
参考文件
Carla Ros Autoware 联合仿真——安装、源码修改、数据预处理 - 知乎 (zhihu.com)
Blueprint Library - CARLA Simulator
需要进行话题转发的原因是:ros bridge 的脚本中对各个传感器话题的 frame 做了设定,而且各 个frame 之间的 tf 关系同样固定,可以通过脚本修改,但是这些源码分布在很多地方,修改不易,更好的选择是进行话题转发的同时,修改 frame 名称和 frame 的 tf 关系。
话题转发包括2个部分,一个是传感器数据的话题转发,另一个是autoware规划后的控制指令geometry::TwistStamped,转换为carla的控制指令。
carla ros bridge中提供了carla twist to contral节点,这个节点用于将geometry::Twist 类型的ros消息转化为carla中车辆的控制指令,但是autoware规划器输出的控制命令为geometry::TwistStamped类型,做一个简单的转换即可。下面是carla twist to contral节点的说明。
自建功能包后编写代码
#include <ros/ros.h>
#include <iostream>
#include "sensor_msgs/Imu.h"
#include "sensor_msgs/PointCloud2.h"
#include "geometry_msgs/TwistStamped.h"
#include "geometry_msgs/Twist.h"
#include <tf/transform_broadcaster.h>
#include <tf/transform_datatypes.h>
//定义发接收者
ros::Subscriber imu_sub;
ros::Subscriber lidar_sub;
ros::Subscriber twist_sub;
//定义发送者
ros::Publisher imu_adv;
ros::Publisher lidar_adv;
ros::Publisher twist_adv;
//定义话题名称
const std::string IMU_TOPIC = "/carla/ego_vehicle/imu";//这些是carla ros bridge发出的ros topic
const std::string LIDAR_TOPIC = "/carla/ego_vehicle/lidar";
const std::string TWIST_TOPIC = "/twist_cmd";//订阅autoware的控制指令,TwistStamped,把它转成carla ros bridge的控制指令Twist
geometry_msgs::Twist m_twist;
void imu_callback(const sensor_msgs::Imu::Ptr &imu_msg)//imu数据回调
{
imu_msg->header.frame_id = "imu";//更换frame名称
imu_msg->header.stamp = ros::Time::now();
imu_adv.publish(*imu_msg);
}
void lidar_callback(const sensor_msgs::PointCloud2::Ptr& lidar_msg)//lidar数据回调
{
lidar_msg->header.frame_id = "lidar";
lidar_msg->header.stamp = ros::Time::now();
lidar_adv.publish(*lidar_msg);
}
//autoware发出的车辆控制指令,需要转化为ros bridge需要的geometry_msgs::Twist类型
void twist_callback(const geometry_msgs::TwistStamped::Ptr& twist_msg)//TwistStamped数据回调
{
m_twist.linear = twist_msg->twist.linear;
m_twist.angular = twist_msg->twist.angular;
twist_adv.publish(m_twist);
}
int main(int argc,char **argv){
ros::init(argc,argv,"Carla_Bridge");
ros::NodeHandle n;
imu_sub = n.subscribe(IMU_TOPIC,10000,imu_callback);
lidar_sub = n.subscribe(LIDAR_TOPIC,10000,lidar_callback);
twist_sub = n.subscribe(TWIST_TOPIC,10,twist_callback);
imu_adv = n.advertise<sensor_msgs::Imu>("/imu_raw", 10000);
lidar_adv = n.advertise<sensor_msgs::PointCloud2>("/points_raw", 10000);
twist_adv = n.advertise<geometry_msgs::Twist>("/carla/ego_vehicle/twist", 10);//ros bridge carla_twist_to_contral节点
ros::spin();
}
frame的tf关系在launch文件中修改
<launch>
<node pkg="carla_bridge" type="carla_bridge" name="carla_bridge1"/>
<node pkg="tf" type="static_transform_publisher" name="lidar_baselink" args="0 0 1.0 0 0 0 base_link lidar 10" />
<node pkg="tf" type="static_transform_publisher" name="imu_baselink" args="-0.3 0 0.4 0 0 0 base_link imu 100" />
<node pkg="tf" type="static_transform_publisher" name="world_map" args="0 0 0 0 0 0 world map 10" />
</launch>
完成后修改CMake文件后,编译
catkin_make
CARLA 与 Autoware
在沟通桥中就有关于 Autoware 用于 CARLA 的启动文件
启动 carla 仿真
cd ~/CARLA_0.9.11
bash CarlaUE4.sh -prefernvidia
启动ROS连接桥
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch town:=town01
启动话题转发节点
roslaunch topic_forwarding autoware_carla.launch
地图
roslaunch carla_autoware_agent my_map.launch
传感器
roslaunch carla_autoware_agent my_sensing.launch
定位
roslaunch carla_autoware_agent my_localization.launch
[RViz]-[2D Pose Estimate]
全局路径规划
roslaunch carla_autoware_agent my_mission_planning.launch
[RViz]-[2D Nav Goal]
局部路径规划
roslaunch carla_autoware_agent my_motion_planning.launch
cmd 的底盘控制转发
参考文件:[carla]通过Twist指令控制carla中的车辆_一骑红尘荔枝来的博客-CSDN博客
roslaunch carla_twist_to_control carla_twist_to_control.launch role_name:="ego_vehicle"
稍等片刻就开始行驶
自此,CARLA 与 Autoware 的联合仿真自动驾驶结束
上一节 CARLA_autoware的配置流程(二)CARLA 与 ROS1 的联合-CSDN博客
下一节 CARLA_autoware的配置流程(四)在 CARLA 中生成自定义高精地图-CSDN博客