多次测试,发现只能在室内平地建图,在地面不平的停车场运行carto,无论用机器人的odom还是carto的,odom
坐标系会严重漂移,原因不明。
修改记录
2020.12.24 xqserial_no_odom.launch
: 将base_link和base_footprint之间的变换的注释去掉
编译问题
将/home/xiaoqiang/Documents/ros/src/ORB_SLAM2
中的CMakeLists大部分内容都注释掉了,目前还用不到它.
注释xqserial_server/CMakeLists.txt
的57行,否则出现下面情况:
nav_test
不需要特别编译,它全是py文件,没有cpp。但是需要从网上下载rbx1
工程,这是一本教程里用到的,只把其中的rbx1_nav
放到当前工作空间里,编译通过。nav_squared.py需要它
将startup.launch
注释掉一部分,比如摄像头节点等等。
robot_pose_ekf
包很奇怪,它应当是在/home/xiaoqiang/Documents/ros/src/navigation
,但是修改相应源码,执行launch没有效果。最后发现实际使用的是R50_Release
中的robot_pose_ekf
。删掉后者就报错找不到了,可见xiaoqiang中的那个没有生效,不像个package,但是rospd又能找到,很奇怪。
运动部分
odom
和IMU
话题的频率都是50Hz
小强有时不移动,可能是IMU在重启,因为此时的IMU数据除了四元数的 w 为1,其他全是0
/xqserial_server/Twist
疑似无用,只有/motor_driver
在一直发布它
xqserial_server/Pose2D
的消息是(x,y,theta),是相对里程计坐标系原点的位姿
里程计模型也是速度积分的二轮差速,使用编码器读数获得极小时间内的位移,以左右轮的编码器增量的均值计算。
要开启红外功能,必须使用命令 rostopic pub -r 12 /barDetectFlag std_msgs/Bool "data: true"
,但红外检测距离太短了,目前被摄像头挡住了,实际不生效
control.py
就是从键盘获取方向键,发布速度命令到cmd_vel
话题,订阅了/xqserial_server/Odom
话题,但是实际没用到。
xqserial_server
命名空间包括StatusPublisher
和DiffDriverController
两个类
xiaoqiang_log
话题对应的LogRecored.msg
如下,只有缺少串口设备时才发布,record是json形式1
2
3string collection_name
time stamp
string record
xiaoqiang_tts/text
话题对应语音提示信息,也是在缺少串口设备时才发布
startup.launch
开机启动的launch文件是startup
包中的startup.launch1
2
3
4
5
6
7
8
9
10
11
12
13<launch>
<node pkg="xqserial_server" type="xqserial_server" name="motor_driver" respawn="true" respawn_delay="10">
<param name="debug_flag" value="false"/>
<param name="wheel_separation" value="0.360"/>
<param name="wheel_radius" value="0.0625"/>
<param name="port" value="/dev/ttyUSB001"/>
<param name="r_min" value="1.0"/>
</node>
<node pkg="tf" type="static_transform_publisher" name="baselink_broadcaster" args="0 0 0.15 0 0 0 1 base_footprint base_link 50">
</node>
<node pkg="tf" type="static_transform_publisher" name="imulink_broadcaster" args="-0.1 -0.03 0 0 0 0 1 base_link imu 50"/>
</launch>
主要是xqserial_server,然后是静态发布tf变换: base_footprint --> base_link --> imu
urdf
rviz显示问题
尝试在远程机上同时启动xiaoqiang_udrf.launch
和rviz,先尝试加载urdf.rviz
,这种情况下的tf变换都是正常的
但是常用方式是远程机启动launch,本地机启动rviz,rviz里做好配置后,发现终端会报错:找不到所需要的所有STL文件,这几个文件在/home/xiaoqiang/Documents/ros/src/xiaoqiang_udrf/meshes
。这是因为rviz在本机找这些文件,
launch文件里加载了xiaoqiang_udrf.URDF
,这个文件又加载STL文件,语句是这样的:1
<mesh filename="package://xiaoqiang_udrf/meshes/base_link.STL" />
也就是说本地机需要一个名为xiaoqiang_udrf的package,自己新建一个。
这时再打开rviz就不会报错了,但还是有问题,整个模型透明发白,这是因为rivz中的全局坐标系“fixed frame”设置的不合适,将map改成base_link后即可正常显示。
结果机器人并不能动,rviz里仍显示几个wheel和odom没有tf变换,但是rosrun tf tf_echo
有正常结果,结果发现就是显示的问题,重启rviz就好了
坐标系冲突
现在urdf中的坐标系叫做lidar_urdf
,static_transform_publisher
定义的是base_link和laser的关系,在a2.launch
里。
可以看到二者的坐标关系有所不同,如果把lidar_urdf
也改成laser
,那么在rviz可以看到laser
坐标系会不断旋转跳动,这是存在两个tf变换造成的。由于urdf只是个显示功能,所以还是用两个坐标系。base_link
和laser
之间的关系可能不精确,这就需要标定了
tf变换
无地图状态下,以odom为固定坐标系,移动机器人时,base_link会相对移动。但是用rviz里的Odometry
可以表达base_link在odom坐标系下的运动
使用伽利略客户端
使用最新版本,一开始总连接不成功,最后发现是公用网络的防火墙造成的,但是不知为什么,防火墙已经将它添加例外了,无法修改,只好把防火墙关了
建图
gmapping建图: roslaunch gmapping a2.launch
,对应rplidar_a2_test.rviz