小强机器人的补充说明

多次测试,发现只能在室内平地建图,在地面不平的停车场运行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又能找到,很奇怪。

运动部分

odomIMU话题的频率都是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命名空间包括StatusPublisherDiffDriverController两个类

xiaoqiang_log话题对应的LogRecored.msg如下,只有缺少串口设备时才发布,record是json形式

1
2
3
string collection_name
time stamp
string record

xiaoqiang_tts/text话题对应语音提示信息,也是在缺少串口设备时才发布

startup.launch

开机启动的launch文件是startup包中的startup.launch

1
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变换都是正常的
加载urdf并显示小强机器人.png

但是常用方式是远程机启动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_urdfstatic_transform_publisher定义的是base_link和laser的关系,在a2.launch里。
urdf中的base_link和laser的关系.png
static_transform_publisher中base_link和laser的关系.png
可以看到二者的坐标关系有所不同,如果把lidar_urdf也改成laser,那么在rviz可以看到laser坐标系会不断旋转跳动,这是存在两个tf变换造成的。由于urdf只是个显示功能,所以还是用两个坐标系。base_linklaser之间的关系可能不精确,这就需要标定了

tf变换

开机启动下的tf关系图.png

odom和base_foot坐标系低于地图

雷达扫描的轨迹和地图边缘有一定差距

LaserScan未正常显示,但tf正常

无地图状态下,以odom为固定坐标系,移动机器人时,base_link会相对移动。但是用rviz里的Odometry可以表达base_link在odom坐标系下的运动

使用伽利略客户端

使用最新版本,一开始总连接不成功,最后发现是公用网络的防火墙造成的,但是不知为什么,防火墙已经将它添加例外了,无法修改,只好把防火墙关了
防火墙.png
关闭串口.png

建图

gmapping建图: roslaunch gmapping a2.launch,对应rplidar_a2_test.rviz