写在前面
当初次接触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+Veldt
(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: []"
后一种会出现时间戳不对的情况,尽量不要使用,请用前者。