4.通过串口修改IMU扩展板设置

0x00 简介

现在我们的树莓派IMU扩展板的芯片进行了升级,芯片上加了屏蔽罩,这样可以增加抗干扰性能,防止外界环境影响芯片的正常数据输出。同时还自带温漂补偿算法,有效降低芯片本身温度变化造成输出数据的不稳定,新板子如下所示:

芯片带屏蔽罩的IMU板

根据一些使用树莓派IMU扩展板用户的反馈,最近我们集中更新了串口控制IMU扩展板的代码,新增了不少功能,主要增加功能如下:

  • 新增通过话题方式来将yaw角度归零,话题方式比较简单,但是没办法得知执行结果;
  • 新增通过服务调用方式将yaw角度归零,服务方式可以得知是否已经正确执行了yaw归零;
  • 新增通过服务调用的方式获取当前yaw角度信息,当前已经有了通过话题发布yaw的功能;
  • 新增通过服务调用方式修改串口通信波特率,可以修改为9600,57600,115200三种通信波特率,一般默认使用57600就可以了;
  • 新增通过服务调用方式来控制D0-D4共4个引脚输出数字高低电平信号,这里的高电平为3.3V;

当然除了这些功能,我们后续还会扩展增加其他功能,有需要额外增加的功能的话,大家也可以给我们发消息。同时我们也将IMU代码开源了,放在了我们自己的代码服务器上,代码仓库地址如下:

https://code.corvin.cn/corvin_zhang/rasp_imu_hat_6dof

imu代码仓库截图

0x01 将yaw角度归零

这里将yaw角度归零有两种方式,我们这里分开介绍,首先来看使用向话题中发消息的方式来将yaw归零。当然为了将yaw归零,前提是先需要启动发布imu数据的launch文件,启动命令如下:

roslaunch serial_imu_hat_6dof serial_imu_hat.launch

启动命令后,可以通过rostopic list查看到当前的话题列表中有/yaw_zero_topic,这个话题就是可以将yaw角度归零的话题。这里话题的消息类型为std_msgs/Empty,所以我们在发送消息的时候是不需要向话题中发送具体内容的,只需要发一个空的消息就可以将yaw角度归零了。这里可以使用rostopic pub来向话题中发布消息将yaw归零,也可以使用c++或python代码向/yaw_zero_topic中发消息将yaw归零。简单的用法就是直接在终端里使用rostopic pub命令,完整命令如下:

rostopic pub -1 /yaw_zero_topic std_msgs/Empty "{}"

使用话题将yaw归零

除了使用话题方式,我们还可以使用服务调用的方式来将yaw归零。这样大家就可以根据需要来选择使用话题还是服务方式,这里的服务名是/yaw_zero_service。该服务的消息类型是serial_imu_hat_6dof/setYawZero,调用该服务时,请求字段是空的,只有反馈字段。反馈字段就是为了表明yaw归零操作是否成功,反馈0表示执行成功,反馈其他负值表示执行失败。在终端里可以使用rosservice call的方式来调用该服务,完整命令如下:

rosservice call /yaw_zero_service "{}"

调用服务将yaw归零

介绍了两种方式可以将yaw角度归零,现在可以来查看下面视频来看下实际执行的效果:

使用话题和服务方式将yaw归零

0x02 使用服务调用方式获取yaw数据

现在已经有了发布yaw数据的话题/yaw_data,但是如果不想通过订阅该话题方式获取到yaw当前数据,也可以通过发送服务请求方式来得到yaw数据。提供yaw数据的服务名为/imu_node/GetYawData,该服务请求字段为空,只有一个响应字段就是当前的yaw数据。通过服务调用方式来得到yaw数据,每调用一次服务就可以得到一次当前的yaw数据,完整命令如下:

rosservice call /imu_node/GetYawData

要想获取到yaw话题中的数据的话,就可以通过rostopic echo /yaw_data来获取。这个可以实时获取到当前的yaw数据,不像调用服务那样,调用一次才能得到一次数据。

服务调用方式获取yaw数据

0x03 修改串口波特率

目前IMU扩展板的串口默认波特率为57600,如果你将IMU板恢复出厂设置了,那波特率就改为9600了。此时若想修改波特率就可以使用这里提供的服务了,目前我们支持修改三种波特率,分别是9600、57600、115200,基本上这三种波特率就够用了,平时用57600波特率就没问题的。修改波特率的服务名是/baud_update_service,在调用该服务时,需要有请求字段,该字段支持3个整型数据,分别是1:代表修改波特率为9600,2:代表修改波特率为57600,3:代表修改波特率为115200(如果输入不是1,2,3这3个数字,其他数字将默认修改波特率为57600)。响应字段为0,说明修改波特率成功,响应字段为负值,表明修改波特率失败了。完整的服务调用命令如下,我们可以通过修改index后面的数字来修改为对应的波特率(3代表修改波特率为115200):

rosservice call /baud_update_service "index: 3"

调用服务来修改串口波特率

当串口波特率成功修改后,此时就好发现当前模块输出的数据都停止了。那是因为波特率修改了,需要断开当前连接,使用新波特率连接imu板才能获取到数据。修改连接波特率可以在rasp_imu_hat_6dof/serial_imu_hat_6dof/cfg/param.yaml中修改,具体修改字段如下图所示:

修改配置文件中连接的波特率参数

0x04 控制引脚输出高低电平信号

在我们IMU板的下方有4个3pin的排针,他们可以连接4个数字传感器。目前我们可以控制其输出高低电平信号,高电平为3.3V。排针位置如下图所示:

可编程引脚位置

可以控制这4路引脚输出高低电平的服务为/pin_outHL_service,该服务的请求字段为4个值,分别对应D0、D1、D2、D3四个引脚的高低电平,如果对应位置设置为1,说明输出高电平,设置为0,设置输出电平为低。由于我这里没有合适的传感器,我就外接了3个按钮,这个按钮上带一个小led灯。我们通过控制对应引脚的高低,来打开或关闭这个led灯。这里接的时候需要注意3个引脚的顺序,最上面是信号线,中间是电源,最下面是接地,可以查看下面视频来看下效果:

使用服务控制引脚输出高低电平的演示

0x05 注意事项

[1].当调用服务修改了波特率后,一定要通过修改配置文件中参数重新连接IMU板,这样才能重新获取到数据。

[2].新增的这些话题和服务,不仅可以在终端里使用rosservice call或rostopic echo来获取到数据,也可以编写相应的代码来获取数据。

[3].由于我们代码会不断的更新,可能上述提到的一些服务名或话题,会随着代码更新而修改,大家需要注意本篇文章发布时间。

发表评论