rqt_plot

本文通过使用ROS系统记录机械臂的关节状态数据,并利用rqt_plot及Matlab进行数据分析与绘图,展示了如何分析机械臂的运动轨迹。文章详细介绍了从数据记录、绘图到深入分析的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


显示命令到terminal中,然后等到动作结束,用鼠标拷贝出来到txt文件,而且,最重要的问题是,由于滚屏,你只能拷贝部分运动信息,很快就舍弃这种做法了。

后来,就想起以前用命令行重定向将信息保存到了文本中,于是就很好的解决了数据保存问题。

  1. rostopic echo /joint_states > record2.txt  
  2. 1. 背景

    因为在为youbot添加FollowJointTrajectory 的client之后,仿真环境中的动作与实际有出入,因此想看看机械臂的实际动作曲线。而在ROS中,内置的rqt_plot是可以提供绘图功能的,而后来发现rqt_plot的功能比较简单,随着数据量的增大,查看起来比较费劲。于是就有了后来的导入matlab中分析的部分。

    2.rqt_plot绘图

    照例,我们找到官网的相关部分,有个基础理解:http://wiki.ros.org/rqt_plot

    1. rqt_plot /turtle1/pose/x:y:z  
    2. rqt_plot /turtle1/pose/x /turtle1/pose/y /turtle1/pose/z  

    特别注意上面的第一句,它就是下面的简写,同一个topic下的直接冒号就好,不用输入那么多的文字。

    在这里我为了避免每次要去动机械臂,将joint_states这个topic的信息已经保存为了bag文件,录的动作是我上一篇文章,actionlib中的动作的一部分,大概是从home到伸直的一部分。使用指令(参看《a gentle introduction to ROS》P135页)

    1. rosbag record -O youbot_action2.bag /joint_states  
    -O(是字母O, 并非数字0,它表示输出文件(output),后面跟的是你的输出文件的名字,我这里是youbot_action2.bag),下面是我的bag的一些基本信息:

    一共21.1s,包含了861条信息

    我们查看一下数据内容


    然后开启一个terminal,回放数据rosbag play youbot_action2.bag --clock,--clock表示使用simulate time,具体可以参考http://wiki.ros.org/Clock 。再打开另外一个,开启rqt_plot,用命令

    1. rqt_plot /joint_states/velocity[0]:velocity[1]:velocity[2]:velocity[3]:velocity[4]  

    因为,youbot机械臂是五个自由度,这里我们用标号0-4来引用每一个(用QwtPlot画出来的)

    用MatPlot画出来的,可以看出他们刚好是左右颠倒的,我们的这个bag文件,有大概20s。右键按住鼠标上下或左右滑动进行缩放。


    同理,我们也可以找出各个关节的一些信息:

    1. rqt_plot /joint_states/position[0]:position[1]:position[2]:position[3]:position[4]  

    得到的图像


    图像很好看,但是实际分析起来是很头疼的,它只能是看个大概过程,了解基本曲线的动作和大概的规律,比如速度曲线的不平滑,关节位置曲线的大概变动范围(起始位置并不是0,依次是0.11,0.11,-0.11,0.11,0.12 rad)

    3.Matlab绘图

    其实,这个地方我也走了点弯路的,当时我用命令

    1. rostopic echo /joint_states  

    显示命令到terminal中,然后等到动作结束,用鼠标拷贝出来到txt文件,而且,最重要的问题是,由于滚屏,你只能拷贝部分运动信息,很快就舍弃这种做法了。

    后来,就想起以前用命令行重定向将信息保存到了文本中,于是就很好的解决了数据保存问题。

    1. rostopic echo /joint_states > record2.txt  

    将txt文件拷贝出来到windows上,导入excel文件,然后借助Matlab分析(这里主要是用到了seq,position和velocity)

    有同学可能就会问了,明明文件中有时间信息,人家还精确到了ns,干嘛不用呢,这里有个小插曲,当时用matlab读取的时候,由于Linux系统中的时间戳信息是从1970年的秒数开始计算的,数据长度很大,导致Matlab处理的时候直接用科学计数法来统计,后面的几位数都直接给过滤掉了,因而导致画出来的图明显不符合逻辑,一个时间点对应多个关节值。

    因此,由于每个数据点都有自己的标号,我就简化为关节信息和点序号的对应信息了。

    4. 总结

    这里只是把自己的一些过程展示出来,抛砖引玉,具体的数据分析,后面还有待进一步深入。我还没有找其他的机械臂对比一下速度曲线,youbot的跟我预想的不太一样,也可能是由于参数信息的设置导致的,后面我会继续深入下去。

    另外,借助于ROS本身的rqt_plot,我们看到数据图像,与matlab基本相同,对于,只是想看看大概规律来说,功能也够用了。


    ————————————————————————

    2016.03更新

    ————————————————————————


    1. %%  
    2. %Analysis for youbot joint states created by torque control service.  
    3. %%  
    4. clear;  
    5. clc;  
    6. clf;  
    7.   
    8. filename = 'ik_service.txt';  
    9. startRow = 2;  
    10.  ALL_LINES = 1296 ;   
    11.   endRow = ALL_LINES + 1; % all line +1  
    12. INTERVAL = 4;  
    13.   
    14.  ikserviceori = importfile(filename, startRow, endRow);  
    15.   
    16. t_index_colume = 1: INTERVAL : ALL_LINES;  
    17. t_value = ikserviceori(t_index_colume, 1) ;  
    18.   
    19. q_start_line = 2;  
    20. j1_rank =q_start_line: INTERVAL: ALL_LINES;  
    21. j1_pos_index =  ikserviceori ( j1_rank, 5) ;  
    22.   
    23. j2_rank = q_start_line: INTERVAL: ALL_LINES;  
    24. j2_pos_index =  ikserviceori ( j2_rank, 4) ;  
    25.   
    26. j3_rank = q_start_line: INTERVAL: ALL_LINES;  
    27. j3_pos_index =  ikserviceori ( j3_rank, 3) ;  
    28. j4_rank = q_start_line: INTERVAL: ALL_LINES;  
    29. j4_pos_index =  ikserviceori ( j4_rank, 2) ;  
    30.   
    31. j5_rank = q_start_line: INTERVAL: ALL_LINES;  
    32. j5_pos_index =  ikserviceori ( j5_rank, 1) ;  
    33.   
    34. subplot(3,1,1);  xlabel('Time'); ylabel('q');  
    35. % grid on;  
    36.   
    37. plot(t_value, j1_pos_index);  
    38. hold on;  
    39.   
    40. plot(t_value, j2_pos_index);  
    41. hold on;  
    42.   
    43. plot(t_value, j3_pos_index);  
    44. hold on;  
    45.   
    46. plot(t_value, j4_pos_index);  
    47. hold on;  
    48.   
    49. plot(t_value, j5_pos_index);  
    50. hold on;  
    51. legend('J1','J2','J3''J4','J5','location','northeast');  
    52. %%  
    53. qd_start_line = 3;  
    54. j1_qd_rank = qd_start_line: INTERVAL: ALL_LINES;  
    55. j1_qd_index =  ikserviceori ( j1_qd_rank, 5) ;  
    56.   
    57. j2_qd_rank = qd_start_line: INTERVAL: ALL_LINES;  
    58. j2_qd_index =  ikserviceori ( j2_qd_rank, 4) ;  
    59.   
    60. j3_qd_rank = qd_start_line: INTERVAL: ALL_LINES;  
    61. j3_qd_index =  ikserviceori ( j3_qd_rank, 3) ;  
    62.   
    63. j4_qd_rank = qd_start_line: INTERVAL: ALL_LINES;  
    64. j4_qd_index =  ikserviceori ( j4_qd_rank, 2) ;  
    65.   
    66. j5_qd_rank = qd_start_line: INTERVAL: ALL_LINES;  
    67. j5_qd_index =  ikserviceori ( j5_qd_rank, 1) ;  
    68.   
    69. subplot(3,1,2);  xlabel('Time'); ylabel('qd');  
    70. % grid on;  
    71. plot(t_value, j1_qd_index);  
    72. hold on;  
    73.   
    74. plot(t_value, j2_qd_index);  
    75. hold on;  
    76.   
    77. plot(t_value, j3_qd_index);  
    78. hold on;  
    79.   
    80. plot(t_value, j4_qd_index);  
    81. hold on;  
    82.   
    83. plot(t_value, j5_qd_index);  
    84.   
    85. legend('J1_qd','J2_qd','J3_qd''J4_qd','J5_qd','location','northeast');  
    86. %%  
    87. qdd_start_line = 4;  
    88. j1_qdd_rank = qdd_start_line: INTERVAL: ALL_LINES;  
    89. j1_qdd_index =  ikserviceori ( j1_qdd_rank, 5) ;  
    90.   
    91. j2_qdd_rank = qdd_start_line: INTERVAL: ALL_LINES;  
    92. j2_qdd_index =  ikserviceori ( j2_qdd_rank, 4) ;  
    93.   
    94. j3_qdd_rank = qdd_start_line: INTERVAL: ALL_LINES;  
    95. j3_qdd_index =  ikserviceori ( j3_qdd_rank, 3) ;  
    96.   
    97. j4_qdd_rank = qdd_start_line: INTERVAL: ALL_LINES;  
    98. j4_qdd_index =  ikserviceori ( j4_qdd_rank, 2) ;  
    99.   
    100. j5_qdd_rank = qdd_start_line: INTERVAL: ALL_LINES;  
    101. j5_qdd_index =  ikserviceori ( j5_qdd_rank, 1) ;  
    102.   
    103. subplot(3,1,3);  xlabel('Time'); ylabel('qdd');  
    104. % grid on;  
    105. plot(t_value, j1_qdd_index);  
    106. hold on;  
    107.   
    108. plot(t_value, j2_qdd_index);  
    109. hold on;  
    110.   
    111. plot(t_value, j3_qdd_index);  
    112. hold on;  
    113.   
    114. plot(t_value, j4_qdd_index);  
    115. hold on;  
    116.   
    117. plot(t_value, j5_qdd_index);  
    118.   
    119. legend('J1_qdd','J2_qdd','J3_qdd''J4_qdd','J5_qdd','location','northeast');  


### 使用 `rqt_plot` 绘制 IMU 数据 在 ROS 中,`rqt_plot` 是一种非常方便的工具,用于可视化动态参数的变化情况。对于 IMU 数据而言,它通常包含了加速度计、陀螺仪以及可能的方向数据等多维信息。以下是关于如何使用 `rqt_plot` 来绘制 IMU 数据的具体方法。 #### 启动 `roscore` 为了能够运行任何 ROS 节点或工具,必须先启动 `roscore`[^1]。 ```bash roscore ``` #### 发布 IMU 数据 确保有一个节点正在发布 IMU 数据到某个话题上。常见的 IMU 数据消息类型为 `sensor_msgs/Imu`。如果尚未有 IMU 数据流,则可以模拟一个简单的 IMU 数据发布器来测试功能[^2]。 以下是一个简单的 Python 脚本示例,用于发布假想的 IMU 数据: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Imu from geometry_msgs.msg import Quaternion, Vector3 import math def imu_publisher(): rospy.init_node('imu_publisher', anonymous=True) pub = rospy.Publisher('/imu/data', Imu, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): imu_msg = Imu() imu_msg.header.stamp = rospy.Time.now() # 假设角速度 (rad/s) 和线性加速度 (m/s^2) imu_msg.angular_velocity = Vector3(x=math.sin(rospy.get_time()), y=math.cos(rospy.get_time()), z=0.0) imu_msg.linear_acceleration = Vector3(x=9.8 * math.sin(rospy.get_time() / 2), y=9.8 * math.cos(rospy.get_time() / 2), z=-9.8) pub.publish(imu_msg) rate.sleep() if __name__ == '__main__': try: imu_publisher() except rospy.ROSInterruptException: pass ``` 保存上述脚本并赋予可执行权限后运行该脚本即可生成 `/imu/data` 主题下的 IMU 数据流。 #### 运行 `rqt_plot` 打开一个新的终端窗口,并输入以下命令以启动 `rqt_plot` 工具: ```bash rqt_plot ``` 一旦界面加载完成,在顶部菜单栏中点击 **Plot** -> **Add Signal...** ,然后选择要绘图的数据字段。例如,假设 IMU 的话题名称为 `/imu/data`,可以选择如下信号路径之一进行监控: - 加速度分量:`/imu/data/linear_acceleration/x`, `/imu/data/linear_acceleration/y`, `/imu/data/linear_acceleration/z` - 角速度分量:`/imu/data/angular_velocity/x`, `/imu/data/angular_velocity/y`, `/imu/data/angular_velocity/z` 通过这种方式,可以在图形界面上实时观察各个维度上的变化趋势。 #### 高级选项 - 多重绘图支持 如果需要更复杂的多重绘图需求,还可以考虑安装第三方插件如 `rqt_multiplot` 插件[^3]。此插件允许在一个视窗内显示多个二维图表,从而更好地对比不同传感器之间的关系或者长时间序列的行为模式。 --- ### 注意事项 尽管 `rqt_plot` 提供了一个简单易用的方式来快速查看数值型时间序列数据的表现形式,但它并不适合处理高频率更新或是复杂结构化的大型数据集。在这种情况下,建议采用其他专门设计用来处理科学计算与可视化的软件包,比如 Matplotlib 或 PlotJuggler 等替代方案。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值