1、创建工程目录
工作空间可以简单理解为工程目录,通过mkdir创建一个工作空间文件夹,这里我们命名为carla_bridge,创建后进入该目录
2. 创建src文件夹
mkdir src
catkin_init_workspace
3、编译工程项目
返回my_workspace目录,注意目录路径,不是在src内,利用catkin_make指令,执行工程项目编译,编译成功后会生成build、devel目录。
catkin_make
4、创建功能包及依赖库
catkin_create_pkg carla_bridge roscpp rospy std_msgs
在carla_bridge src目录下新建carla_bridge1.cpp文件
#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();
}
修改carla_bridge CMakeLists.txt
add_executable(carla_bridge src/carla_bridge1.cpp)
target_link_libraries(carla_bridge
${catkin_LIBRARIES}
)
5.ROS的launch文件创建
catkin_cteate_pkg package_launch
然后再在package_launch文件夹里面新建一个launch文件夹,把.launch文件放在里面即可(其实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>
6.编译
catkin_make
7.运行
source devel/setup.bash
roslaunch carla_bridge_launch carla_bridge_sim.launch