目标:
本篇文章记录我使用autoware内置rosbag激光雷达数据包录制功能的录制方法,当然,如果只掌握了怎么录制,对于我而言是远远不够的,我将复习丢掉已久的ROS知识并且适度挖掘这其中的相关技术
内容:
- 网络配置
- 启动Autoware
- 控制车辆运动
- 录制激光雷达的rosbag数据包
- 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),}#获取键值函数defgetKey():
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#以字符串格式返回当前速度defvels(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 =0print(vels(speed,turn))#速度发生变化,打印出来#空键值/'k',相关变量置0elif key ==' 'or key =='k':
x =0
th =0
control_speed =0
control_turn =0
HorizonMove =0#长期识别到不明键值,相关变量置0else:
count = count +1if count >4:
x =0
th =0if(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格式分析
版权归原作者 R_ichun 所有, 如有侵权,请联系我们删除。