在无人机仿真中,IMU(惯性测量单元)消息频率对于路径规划和感知的仿真至关重要。然而,在使用PX4+Gazebo+MAVROS+ROS进行仿真时,可能会遇到频率受限的情况。本文将介绍如何提高IMU消息频率。
通过以下命令可以查看到IMU消息的发布频率
rostopic hz /mavros/imu/data_raw
通常情况下固定在50Hz。
然而,通过gz topic --hz /gazebo/default/iris/imu
命令查看到在Gazebo仿真环境中,IMU消息的频率可能会达到800~1000Hz,远高于ROS中的消息频率。
经过查询资料发现需要通过调整MAVROS节点的参数来提高IMU消息的发布频率(https://github.com/mavlink/mavros/issues/1455)。具体步骤如下:
- 首先,我们需要知道IMU消息在MAVLink中的ID。通过查询MavLink文档(https://mavlink.io/en/messages/common.html),我们可以得知IMU对应的ID为HIGHRES_IMU (#105)。
- 使用rosservice call /mavros/set_message_interval命令来设置消息发布频率。例如,要将IMU消息的频率修改为200Hz,可以执行以下命令:
rosservice call /mavros/set_message_interval 105 200
执行完上述命令后,如果终端显示success: True
,表示设置成功。
- 最后,通过rostopic hz /mavros/imu/data_raw命令再次查看IMU消息的频率,应该会看到频率已经提高。
通过第三部可以成功提高IMU消息的发布频率,但是我的电脑上显示频率为125Hz,并非200Hz。
我试了多组数值,如果设置/mavros/set_message_interval
为150或者180,IMU频率可以到达148Hz左右,如果设置为500或者100,IMU频率可以到达230Hz左右。这一点具体的原因还没有查明,如果有懂的大佬可以在评论区留言交流。
注:若要修改/mavros/imu/data的频率,修改ATTITUDE_QUATERNION ( #31 )的interval即可。
鉴于每次重启仿真,都需要重新执行指令,会比较麻烦,所以可以写成脚本,并且加入launch文件中。
#!/usr/bin/env python
import rospy
from mavros_msgs.srv import MessageInterval
def set_message_interval():
rospy.init_node('set_message_interval_client')
rospy.wait_for_service('/mavros/set_message_interval')
try:
set_interval = rospy.ServiceProxy('/mavros/set_message_interval', MessageInterval)
resp = set_interval(105, 1000)
print("Set /mavros/imu/data_raw message interval: %s" % resp.success)
resp = set_interval(31, 1000)
print("Set /mavros/imu/data message interval: %s" % resp.success)
except rospy.ServiceException as e:
print("Service call failed: %s" % e)
if __name__ == "__main__":
set_message_interval()
在仿真启动的launch文件添加下面的内容(将package换成自己的名称)
<launch>
<node name="set_message_interval_node" pkg="YOUR_PACKAGE_NAME" type="set_message_interval.py" output="screen"/>
</launch>