关于rostopic pub 发布JointState消息让机器人在rviz中运动的问题

写在前面

当初次接触rviz的时候,roslaunch display.launch
会有一个rviz界面出现,并且会有ui的控制界面
在这里插入图片描述

于是笔者受joint_states_publisher_gui启发,于是思考是否可以在命令行直接rostopic pub发布/jointstates话题去控制机器人呢?

经过一番踩坑,发现

1.无论是通过编程创建发布者,还是直接命令行rostopic pub,都不能进行速度和力矩控制
意思就是发速度或者力矩的话,不会产生任何运动。

这是因为rviz只是一个状态显示的软件,并不是仿真软件,里面不能显示关节的速度状态和受力状态
其次,/jointstates这个话题也是用来表示机器人的状态,一般不作为控制指令。
参照
https://answers.ros.org/question/344320/rostopic-pub-command-doesnt-work-as-expected-probably-quote-command-line-argument-issue/
所以大家这块不要深究了,可以换另外两条路子
(1)还是发位置,每次发的位置是上一次位置+速度循环发布的时间间隔
pos=pos+Vel
dt
(2)在gazebo里用roscontroller去控制速度和力

2.发命令和创建发布者会与原有自带的joint_state_publisher冲突
这会导致(1)若你发布的话题频率低于joint_state_publsher,那机器人一般不会动joint_state_publsher会一直发布当前滑动条表示的机器人状态,频率是10HZ
(2)若你发布的话题频率较高超过10HZ,关节角度会来回跳动。
解决:直接在launch文件中删掉或注释掉joint_state_publisher_gui节点
原launch文件

<launch>
  <arg
    name="model" />
  <arg
    name="gui"
    default="Ture" />
  <param
    name="robot_description"
    textfile="/home/sky/timon_sim/src/timon/urdf/timon.urdf" />
  <param
    name="use_gui"
    value="$(arg gui)" />
  <node
    name="joint_state_publisher_gui"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d /home/sky/timon_sim/src/timon/urdf.rviz" />
</launch>

改成

<launch>
  <arg
    name="model" />
  <param
    name="robot_description"
    textfile="/home/sky/timon_sim/src/timon/urdf/timon.urdf" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d /home/sky/timon_sim/src/timon/urdf.rviz" />
</launch>

但这中情况下再打开display.launch会看见rviz模型位置错乱,找不到base_link
这就必须通过编写发布者,编写新节点的形式来让他找到base_link。换言之,若是在launch文件中删除节点,得重新补一个发布joint_states消息的节点,rostopic pub命令行输入的这种形式不可用

所以还是推荐用杀死节点的方式
打开原launch文件
rosnode kill /joint_state_publisher_gui
之后发布消息

rostopic pub -r 10 /joint_states sensor_msgs/JointState '{header: auto, name: ['joint1','joint2','joint3','joint4','joint5','joint6'], position: [0,0.1,0,0.5,0.1,0.1], velocity: [], effort: []}'

rviz中机器人会变化到目标位置,当然写一个节点发布此消息也是可行的。这里就不放代码了
注意!这种情况下rostopic pub还有一种形式

rostopic pub -r 10 /joint_states sensor_msgs/JointState "header:
  seq: 0
  stamp: {secs: 0, nsecs: 0}
  frame_id: ''
name: ['joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6']
position: [1.0, 0.0, 1.625, 1.5, 0.0, 0.0, 0.0]
velocity: []
effort: []" 

后一种会出现时间戳不对的情况,尽量不要使用,请用前者。

总结

rviz中用jointstates改变关节状态
只可改变位置
用时间步长*速度去改变位置来间接显示速度
launch文件中删除gui节点
杀死gui节点
写新的节点发布joint_states
rostopic pub命令行直接发布
gazebo仿真roscontroller控制速度
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页