Autoware.ai开源自动驾驶系统学习日记(一):使用Autoware录制激光雷达的rosbag数据包

目标:

本篇文章记录我使用autoware内置rosbag激光雷达数据包录制功能的录制方法,当然,如果只掌握了怎么录制,对于我而言是远远不够的,我将复习丢掉已久的ROS知识并且适度挖掘这其中的相关技术


内容:

  1. 网络配置
  2. 启动Autoware
  3. 控制车辆运动
  4. 录制激光雷达的rosbag数据包
  5. rosbag格式解析

正文来了:

此时学习使用的机器是是来自轮趣的autoware自动驾驶测试车,外观如下:

测试车

网络配置

进入轮趣的系统后一定要先进行网络配置,进入到终端初始化文件bashrc里面修改ROS_MASTER_URI和ROS_IP.这里关于这部分内容我看了这篇博客:
链接: link
这篇博客讲解了ROS_MASTER_URI和ROS_IP的作用,但是目前笔者还没接触到主从机ros控制,所以就先不管这部分内容,有兴趣的朋友可以去这篇博客看看。

sudo gedit .bashrc

添加目前连接上的网络的IP地址如图:
在这里插入图片描述

启动Autoware

然后就是正常按照文档开启Autoware软件了,这里有两个launch文件

roslaunch turn_on_wheeltec_robot open_autoware.launch
roslaunch runtime_manager runtime_manager.launch

这两个打开后都是autoware的界面,但是区别是第一个不止打开了autoware而且打开了车子的大部分功能,也就是说,你如果只是运行第一个命令,那么效果是autoware被打开了,并且激光雷达什么的也都打开了,如果运行的是第二个,那么就只是打开了autoware。

我们进入到这两个launch文件内部一探究竟:
open_autoware.launch:
在这里插入图片描述
runtime_manager.launch:
在这里插入图片描述
我们发现在open_autoware.launch里面打开了runtime_manager.launch,而且开启了机器人相关的东西。

控制车辆运动

根据文档提示:我们打开键盘控制小车的ros程序:

roslaunch wheeltec_robot_rc keyboard_teleop.launch

我么进入这个launch文件看看都有什么:
在这里插入图片描述
我们将这个文件直接丢给GPT4,给出的答案还挺准确的。。。
在这里插入图片描述
我们再直接去到turtlebot_teleop_key.py这个python文件,这里将这个文件的代码都po出来,大家想看的可以看看:

import rospy

from geometry_msgs.msg import Twist

import sys, select, termios, tty

msg = """
Control Your Turtlebot!
---------------------------
Moving around:
   u    i    o
   j    k    l
   m    ,    .

q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
space key, k : force stop
anything else : stop smoothly
b : switch to OmniMode/CommonMode
CTRL-C to quit
"""
Omni = 0 #全向移动模式

#键值对应移动/转向方向
moveBindings = {
        'i':( 1, 0),
        'o':( 1,-1),
        'j':( 0, 1),
        'l':( 0,-1),
        'u':( 1, 1),
        ',':(-1, 0),
        '.':(-1, 1),
        'm':(-1,-1),
           }

#键值对应速度增量
speedBindings={
        'q':(1.1,1.1),
        'z':(0.9,0.9),
        'w':(1.1,1),
        'x':(0.9,1),
        'e':(1,  1.1),
        'c':(1,  0.9),
          }

#获取键值函数
def getKey():
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key


speed = 0.2 #默认移动速度 m/s
turn  = 0.5   #默认转向速度 rad/s
#以字符串格式返回当前速度
def vels(speed,turn):
    return "currently:\tspeed %s\tturn %s " % (speed,turn)

#主函数
if __name__=="__main__":
    settings = termios.tcgetattr(sys.stdin) #获取键值初始化,读取终端相关属性
    
    rospy.init_node('turtlebot_teleop') #创建ROS节点
    pub = rospy.Publisher('~cmd_vel', Twist, queue_size=5) #创建速度话题发布者,'~cmd_vel'='节点名/cmd_vel'

    x      = 0   #前进后退方向
    th     = 0   #转向/横向移动方向
    count  = 0   #键值不再范围计数
    target_speed = 0 #前进后退目标速度
    target_turn  = 0 #转向目标速度
    target_HorizonMove = 0 #横向移动目标速度
    control_speed = 0 #前进后退实际控制速度
    control_turn  = 0 #转向实际控制速度
    control_HorizonMove = 0 #横向移动实际控制速度
    try:
        print(msg) #打印控制说明
        print(vels(speed,turn)) #打印当前速度
        while(1):
            key = getKey() #获取键值

            #切换是否为全向移动模式,全向轮/麦轮小车可以加入全向移动模式
            if key=='b':               
                Omni=~Omni
                if Omni: 
                    print("Switch to OmniMode")
                    moveBindings['.']=[-1,-1]
                    moveBindings['m']=[-1, 1]
                else:
                    print("Switch to CommonMode")
                    moveBindings['.']=[-1, 1]
                    moveBindings['m']=[-1,-1]
            
            #判断键值是否在移动/转向方向键值内
            if key in moveBindings.keys():
                x  = moveBindings[key][0]
                th = moveBindings[key][1]
                count = 0

            #判断键值是否在速度增量键值内
            elif key in speedBindings.keys():
                speed = speed * speedBindings[key][0]
                turn  = turn  * speedBindings[key][1]
                count = 0
                print(vels(speed,turn)) #速度发生变化,打印出来

            #空键值/'k',相关变量置0
            elif key == ' ' or key == 'k' :
                x  = 0
                th = 0
                control_speed = 0
                control_turn  = 0
                HorizonMove   = 0

            #长期识别到不明键值,相关变量置0
            else:
                count = count + 1
                if count > 4:
                    x  = 0
                    th = 0
                if (key == '\x03'):
                    break

            #根据速度与方向计算目标速度
            target_speed = speed * x
            target_turn  = turn * th
            target_HorizonMove = speed*th

            #平滑控制,计算前进后退实际控制速度
            if target_speed > control_speed:
                control_speed = min( target_speed, control_speed + 0.1 )
            elif target_speed < control_speed:
                control_speed = max( target_speed, control_speed - 0.1 )
            else:
                control_speed = target_speed

            #平滑控制,计算转向实际控制速度
            if target_turn > control_turn:
                control_turn = min( target_turn, control_turn + 0.5 )
            elif target_turn < control_turn:
                control_turn = max( target_turn, control_turn - 0.5 )
            else:
                control_turn = target_turn

            #平滑控制,计算横向移动实际控制速度
            if target_HorizonMove > control_HorizonMove:
                control_HorizonMove = min( target_HorizonMove, control_HorizonMove + 0.1 )
            elif target_HorizonMove < control_HorizonMove:
                control_HorizonMove = max( target_HorizonMove, control_HorizonMove - 0.1 )
            else:
                control_HorizonMove = target_HorizonMove
         
            twist = Twist() #创建ROS速度话题变量
            #根据是否全向移动模式,给速度话题变量赋值
            if Omni==0:
                twist.linear.x  = control_speed; twist.linear.y = 0;  twist.linear.z = 0
                twist.angular.x = 0;             twist.angular.y = 0; twist.angular.z = control_turn
            else:
                twist.linear.x  = control_speed; twist.linear.y = control_HorizonMove; twist.linear.z = 0
                twist.angular.x = 0;             twist.angular.y = 0;                  twist.angular.z = 0

            pub.publish(twist) #ROS发布速度话题

    #运行出现问题则程序终止并打印相关错误信息
    except Exception as e:
        print(e)

    #程序结束前发布速度为0的速度话题
    finally:
        twist = Twist()
        twist.linear.x = 0;  twist.linear.y = 0;  twist.linear.z = 0
        twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 0
        pub.publish(twist)

    #程序结束前设置终端相关属性
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

我们还是老办法,丢给GPT,让他提炼一下代码的作用,不然我们每个代码文件都看的话就太费事了:
在这里插入图片描述
这些就是GPT给我们提炼出来的信息,至此,我们知道了发布速度的话题是/cmd_vel (是不是很常规)

录制激光雷达的rosbag数据包

前面我们运行了

roslaunch turn_on_wheeltec_robot open_autoware.launch
roslaunch wheeltec_robot_rc keyboard_teleop.launch

这个时候我们就可以按照文档一步步的去录制数据包了:
录制 ROSBAG 主要是为了后面的建图以及生成导航的路径点文件需要。Autoware 建图方式是利用 rosbag 包进行离线建图:
在 Autoware 界面中,点击[ROSBAG]按钮,在弹出来的界面中点击[Ref]选 择 ROSBAG 的存储路径,然后勾选 imu 话题/imu_raw、雷达话题/points_raw、里程计话题 /vehicle/odom,然后点击“start”即可开始录制
在这里插入图片描述

rosbag格式解析

rosbag是一个非常重要的ROS工具,用于记录和播放ROS消息数据。它可以捕获在ROS主题(topics)上发布的数据,将这些数据保存到一个叫做"bag"的文件中。这些bag文件随后可以被用于回放,以此来复现原始数据流。这在开发和测试过程中特别有用,因为它允许开发者和研究人员重现和分析实时数据的具体情况。

这里笔者草草去网络上搜了一下,发现枯燥的要死,又感觉后续不需要接触这一部分,所以就没看下去,如果以后遇到了相关的问题的话我再回来填这个坑,下面我po一些相关的学习链接,大家有兴趣的可以去看看:
链接: ROS 机器人技术 - rosbag 详细使用教程!
链接: Rosbag格式分析

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值