ubuntu20 autoware+carla联合仿真通过激光雷达制作点云地图

Posted 怪皮蛇皮怪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu20 autoware+carla联合仿真通过激光雷达制作点云地图相关的知识,希望对你有一定的参考价值。

autoware+carla+carla ros bridge联合仿真

序言

环境要求

autoware 1.12.0(其他版本大同小异?最好不要docker版本,感觉docker版本老是崩)
carla+carla ros bridge
ubuntu18(最好是18,其他版本16也行)
(只可惜我是ubuntu20,被迫装了docker的autoware,打开rviz的时候rviz反复崩溃,难受)

我这里就不放carla,autoware,carla ros bridge的安装教程了,默认诸位安装成功(我也折腾半天才看起来安装成功了,我autoware 的官方demo到现在都没跑通,也不知道哪里没装好)

闲聊

很早之前在电脑中安装了autoware,但是基本没怎么用过
最近一段时间都在用carla做一些奇奇怪怪的东西
然后某一天突发奇想,autoware的通信基础是ros,carla也有carla ros bridge,那我能不能通过carla学习autoware?

这个教程主要是 知其然,不知其所以然使用 教程
我会在教程中放上我对其中的理解,但是大部分的行为都是为了跑通autoware+carla做的操作
嗯,保命要紧

致谢

感谢这位老哥的一系列教程 Autoware 培训笔记 No. 1——构建点云地图,他的系列教程可以说是相当的有用了

rosbag构建点云地图

1. 打开carla

1.打开carla服务端

安装了哪个版本的carla都无所谓了,重点是要安装carla ros bridge

~/CARLA_0.9.11/CarlaUE4.sh

2.打开 carla ros bridge

通过carla ros bridge 提供的指令打开含有ros topic 的demo

可以通过后面的town:=town05中的05改成其他数字更换其他的carla地图

roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch town:=town05

会看到之前打开的carla窗口也不一样了

3.检查rostopic【重要】

通过

rostopic list

检查下有没有含有carla的topic,照道理来说安装完整可以看得到以下场景
如果没有看到这一系列/carla开头的topic,可以先试试重启一遍carla ros bridge的地图,如果还是不行建议检查安装

3.检查激光雷达信息

接下来通过检查/carla/ego_vehicle/lidar这个topic来查看carla内部的激光雷达信息是否通过rostopic 发布出来了,这部分的信息接下来会用来做点云地图的

rostopic echo /carla/ego_vehicle/lidar


如果看到爆炸般的数据就对了

2. 打开autoware

根据自己的情况打开autoware,我这里附上我自己ubuntu20 docker版本autoware的打开方式

1.打开docker镜像

docker/generic/run.sh --ros-distro melodic

2.打开autoware

roslaunch runtime_manager runtime_manager.launch

3.开启信息转发

3.1 开启信息转发

autoware构建点云地图是默认订阅/points_raw节点的信息,同时这个节点的frame_id为velodyne
前者用于构建点云地图,后者用于定位时的坐标系转换,现在虽然用不上,但后面定位用得到就是了
但是carla发布的雷达信息是发布到/carla/ego_vehicle/lidar这个节点,所以我们需要用一个节点信息转发将/carla/ego_vehicle/lidar节点的信息发布到/points_raw

以下是python版本的信息转发文件

import rospy
from sensor_msgs.msg import PointCloud2

class Transfer():
    def __init__(self):
        #初始化节点
        rospy.init_node('transfer_topic_from_ego_lid1ar_to_points_raw')
        self.points_raw_pub = rospy.Publisher('/points_raw', PointCloud2, queue_size=100)

        #订阅lidar节点
        rospy.Subscriber('/carla/ego_vehicle/lidar', PointCloud2, self.callback_lidar)

        # 设置循环的频率
        rate = rospy.Rate(10)


    def callback_lidar(self,data):
        #重设frame_id
        data.header.frame_id="velodyne"

        # 发布消息
        self.points_raw_pub.publish(data)
        # print(data)
        
if __name__ == '__main__':
    Transfer()
    rospy.spin()

然后运行这个程序就是了,我将这个程序命名为topic_transfer.py
所以运行指令是

python topic_transfer.py

讲道理,如果连python程序都不会运行的人(C++震怒)应该不会看我这篇教程吧
保命要紧, 保命要紧

3.2 检查信息转发效果

方法一:终端命令检查

检查是否有信息

rostopic echo /points_raw

检查frame_id是否正确

rostopic echo /points_raw |grep frame_id

上面这一堆数据是/points_raw节点的数据,下面是修改后的frame_id

方法二:autoware自带的功能检查

当然你也可以通过autoware的topic项做检查
1.最上方菜单栏里从右往左数第二个,topic选项
2.点击左下角refresh,刷新topic节点list
3.在topic list里选择/points_raw
4.勾选上面,中间靠右的位置勾选echo

4.录制rosbag(可选)

附注

因为构建点云地图有 实时/在线构建 ,也有 通过rosbag构建 共两种方式,但两种方式差别并不大,所以我将两个教程合并了
如果想要离线构建地图,那就需要提前录制rosbag
如果想试试在线构建地图模拟真车在线建图,那就跳过这一部分直接到 5.构建点云地图 去吧

录制rosbag

autoware自带了方便的rosbag录制方法,这里选择通过autoware录制rosbag


1.首先点击右下角的rosbag打开小窗口
2.点击ref选择保存目录。docker安装的话建议选择share_dir目录下,这样之后也方便将rosbag转移
3.在一系列topic中选择需要录制的topic,如果没有想要的topic点一下refresh刷新一下
4.记得点击start!!!!!

备注: 这里我选择录制rostopic echo /carla/ego_vehicle/lidar节点的信息,之后可以通过rosbag模拟carla发布信息。当然如果在之前打开了信息转发,也可以直接录制/points_raw节点的信息,这样之后回放就不需要再专门打开信息转发节点了

开始瞎跑

构建点云地图自然需要激光雷达(跟着车)到处移动才能构建地图
选择通过carla ros 打开的carla窗口(有车的那个)
记得不要开的太快,不然后面构建地图会可能出问题

按H获取帮助
按B进入/退出人工驾驶模式
WASD控制移动
按Q切换倒车
空格手刹

瞎跑结束,点击stop
然后查看自己选择的目录下有没有rosbag

5.构建点云地图

接下来的操作对于真车建图,仿真建图,又或者rosbag建图其实都差不多
所以我将其合并讲解

1. 播放激光点云数据

这里的所有操作最终都是要保证只有一个激光雷达(rosbag虚拟的也算)往points_raw发布信息

1.1 rosbag操作

1.1.1. 关闭carla

通过rosbag构建地图的话需要注意不要同时pub多个激光雷达信息到一个topic上
如果按照我的教程走下来到这一步 并且 想要通过rosbag 构建地图的话,就需要关闭carla ros打开的窗口
因为carla ros会向/carla/ego_vehicle/lidar节点发布信息,而各位无论rosbag录制了/carla/ego_vehicle/lidar的信息还是/points_raw的信息最终都会导致冲突,一个节点同时有carla发布信息也有rosbag发布信息

1.1.2. 回放rosbag数据

1. 点击simulation选项进入rosbag回放页面
2. 点击ref选择要构建点云地图的rosbag包
3. 点击play进行播放数据
4. 在play之后,右侧playing出现信息百分比后点击pause暂停

1.2 仿真建图操作

如果是按照我的教程走到这一步的话,那基本不需要做什么额外的操作。
因为carla ros已经打开,之前也检查过了激光点云的数据,数据转发也已经打开了

1.3 真车建图操作

真车建图跟其他的主要区别是要想办法将真实的激光点云数据pub到/points_raw节点且frame_id=velodyne

如果先前已经将激光雷达的信息pub到了某个节点上,那就修改信息转发节点中订阅的节点就好

2. 检查激光点云数据

1.终端检查

无论用哪种方法
最终还是检查/points_raw节点是否有信息吧

rostopic echo /points_raw

检查frame_id是否是velodyne

rostopic echo /points_raw |grep frame_id

仿真与实车建图可以直接检查
rosbag可以取消pause暂停查看一下是否有数据,然后再暂停或者重新从头回放并暂停

2.rviz检查

1.打开rviz

点击autoware右下角的rviz打开rviz

2.添加激光雷达topic


1.点击左下角add添加topic
2.选择 by topic的方式通过topic节点选择需要添加的topic
3.选中/points_raw节点。(如果这里没有/points_raw节点考虑一下是不是没有开启转发)
4.点击ok
5.回到rviz左侧菜单栏,在global options选择fixed frame,将world修改成velodyne

3.播放激光雷达数据

rosbag取消暂停或者重新播放就能看到雷达信息
真车/仿真应该一直有数据,可以直接看到结果

rviz中间应该能看到类似这样效果的激光雷达图

备注rviz调整激光雷达视角

3. autoware构建地图之点点点

下面的操作不区分rosbag/真车/carla实时仿真

以下部分来自Autoware 培训笔记 No. 1——构建点云地图
里面写的很详细,我就不复制了,直接简化所有操作至点点点

1. setup点点点

  1. 确认localizer中选择的是velodyne
  2. baselink to localizer点击 TF
  3. 直接点击vehicle model

最终效果如图

2. map点点点

在tf中选中autoware官方demo中data/tf/tf.launch文件
文件内容如下

<!---->
<launch>
<!-- world銇嬨倝map銇搞伄tf -->
<node pkg="tf"  type="static_transform_publisher" name="world_to_map" args="14771 84757 -39 0 0 0 /world /map 10" />

<!-- map銇嬨倝mobility銇搞伄tf -->
<node pkg="tf"  type="static_transform_publisher" name="map_to_mobility" args="0 0 0 0 0 0 /map /mobility 10" />

</launch>

然后点击tf

最终效果如图

3. computing点点点

  1. 选择ndt mapping 右侧的app查看config

config配置


3. 参数基本用默认配置
4. method type中选择加速配置。如果有gpu可以选择pcl_anh_gpu,但是我docker安装的autoware,nvida_docker2都不清楚到底装没装好,所以选择了pcl_generic
5. 下面ref选择地图文件保存目录
6. 确认配置文件没有问题后点击close
没错,是close。
因为pcd output是点云地图构建完后才选择的,构建完成之前不管他

确认好配置,如果觉得可以开始构建地图就可以勾选ndt mapping
当然,你也可以先打开rviz实时查看建图的状况

4. rviz查看建图状态

ndt mapping 可以通过rviz实时查看建图的状态

  1. 打开rviz
  2. 选择左上角file,open config
  3. 选择ndt_mapping.rviz
    /home/autoware/shared_dir/carla/pcd/carla_town05_small.pcd
    不出意外地话,新版本的autoware没有ndt mapping.rviz这个文件
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /PointCloud21
      Splitter Ratio: 0.5
    Tree Height: 706
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.5886790156364441
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: PointCloud2
Preferences:
  PromptSaveOnExit: true
Toolbars:
  toolButtonStyle: 2
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.029999999329447746
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
        base_link:
          Value: true
        ego_vehicle:
          Value: true
        ego_vehicle/lidar:
          Value: true
        ego_vehicle/rgb_birdview:
          Value: true
        ego_vehicle/rgb_view:
          Value: true
        map:
          Value: true
        mobility:
          Value: true
        velodyne:
          Value: true
        world:
          Value: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        map:
          ego_vehicle:
            
          ego_vehicle/lidar:
            
          ego_vehicle/rgb_birdview:
            
          ego_vehicle/rgb_view:
            
          mobility:
            
        world:
          
      Update Interval: 0
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/PointCloud2
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 254
      Min Color: 0; 0; 0
      Min Intensity: 0
      Name: NDT Map
      Position Transformer: XYZ
      Queue Size: 1
      Selectable: true
      Size (Pixels): 1
      Size (m): 0.009999999776482582
      Style: Points
      Topic: /ndt_map
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Alpha: 1
      Class: rviz/RobotModel
      Collision Enabled: false
      Enabled: true
      Links:
        All Links Enabled: true
        Expand Joint Details: false
        Expand Link Details: false
        Expand Tree: false
        Link Tree Style: Links in Alphabetic Order
      Name: Vehicle Model
      Robot Description: robot_description
      TF Prefix: ""
      Update Interval: 0
      Value: true
      Visual Enabled: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/PointCloud2
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: false
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 0.9801089763641357
      Min Color: 0; 0; 0
      Min Intensity: 0.8869207501411438
      Name: PointCloud2
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.05000000074505806
      Style: Flat Squares
      Topic: /points_map
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: false
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: map
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Theta std deviation: 0.2617993950843811
      Topic: /initialpose
      X std deviation: 0.5
      Y std deviation: 0.5
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Angle: 0
      Class: rviz/TopDownOrtho
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.05999999865889549
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.009999999776482582
      Scale: 6.548531532287598
      Target Frame: <Fixed Frame>
      Value: TopDownOrtho (rviz)
      X: 32.1850700378418
      Y: 9.996487617492676
    Saved: ~
Window Geometry:
  Camera:
    collapsed: false
  Displays:
    collapsed: false
  Height: 997
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd00000004000000000000016a0000034bfc020000000afb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003b0000034b000000c700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d0061006700650100000320000000660000000000000000fb0000000c00430061006d0065007200610000000420000000160000001600000016000000010000010f0000034bfc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fc0000003b0000034b000000a000fffffffa000000010100000002fb0000000a0049006d0061006700650000000000ffffffff0000000000000000fb0000000a0056006900650077007301000003a10000010f0000010000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000006740000003efc0100000002fb0000000800540069006d00650100000000000006740000024400fffffffb0000000800540069006d00650100000000000004500000000000000000000003ef0000034b00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1652
  X: 120
  Y: 93

复制粘贴并选择配置文件

最终rviz会成这个样子

现在点击ndt mapping按钮就可以开始构建地图了
当然,对于播放rosbag建图的话,还需要取消rosbag的simulation暂停
对于真车或者carla实时仿真的话,那就开始老司机开车吧!

6. 保存地图

1.构建地图需要注意的点

需要注意的一点,打开autoware之后会出现一个终端窗口,那个终端窗口在勾选ndt mapping之后会显示这样

这意味着选择已经开始在构建地图了
同时注意到还有一个(Processed/Input): (512 / 567) 后面跟着两个数字
这两个数字前一个数字表示正在处理的点云帧数,后一个表示加载的点云帧数。如果两个数字相差过大,会出现运行错误。

如果数字相差过大
对于rosbag构建地图,可以通过点击simulation的暂停,停止播放点云数据,这样可以让前面的数字缓缓追上来

对于真车/carla实时仿真,可以通过让车停下来原地等待,并且关闭信息转发
通过关闭信息转发达到不往/points_raw发送激光雷达数据的效果,直到processed数字追上来后重新打开信息转发节点

1.保存构建好的地图

1.首先,地图只有在构建完毕后才能被保存!

也就是(Processed/Input): (512 / 567) 中前一个数字追上后面的数字
亦或者终端不再实时刷新界面(这是因为有时候会发现processed会超过input一两帧又或者少一两帧,就不知道怎么回事)

2.保存地图

回到autoware界面,点击之前勾选好的ndt mapping 的app选项打开配置
点击ref选择要保存的路径,然后点击下面的PCD OUTPUT

终端界面会显示这样
然后就可以检查保存好的地图文件了

记得取消勾选ndt mapping

RVIZ最终建图效果如下

7. 查看地图

autoware发布map

  1. map中 point cloud 右边的ref选择刚刚构建好的点云地图
  2. 点击point cloud

rviz检查map

【累了】
在RViz显示界面点击左下角的 [Add] 按钮,通过 [By Topic] 找到/points_map 并打开,在rviz中显示如下:

(忘记地图保存到哪里去了,所以随便拉了个之前建好的地图)

  1. 如果发现没有显示地图的话,可以反复勾选刚刚添加的rviz中的point_map
  2. 如果还是没有地图,那就重新取消再点击autoware中的point cloud选项
  3. 一般就这两个在抽风,之后就能看到地图了

以上是关于ubuntu20 autoware+carla联合仿真通过激光雷达制作点云地图的主要内容,如果未能解决你的问题,请参考以下文章

ros_bridge ackermann控制

ros_bridge ackermann控制

ros_bridge ackermann控制

Carla+ROS1联合仿真环境搭建

Carla 安装详细教程 —— Ubuntu 20.04 安装 Carla

ubuntu20.04编译carla0.9.13源码