键盘控制六自由度的ABB机械臂,根据 ROS-I 的 course 2.5b 修改的。
key_teleop_node
创建 key_teleop_node 节点,实现的功能是获取键盘指令,并转化为joint的运动信息,然后通过发送 joint_states message,控制机械臂各关节的运动。
course 2.5b里的代码实现的是GUI bar拖动控制abb关节运动。对于launch文件需要修改的地方:注释掉原launch文件中的 joint_state_publisher 节点,然后自己写一个key_teleop_node 发布消息,消息类型是sensor_msgs::JointState 话题名称:/joint_states。
key_teleop_node 的源码已上传。几个地方稍微解释一下:
-
launch文件中
<param name="use_gui" value="false"/>
设置为true,则表示打开bar控制条。 -
key_teleop_node.cpp中:
#define KEYCODE\_Q 0x71 // 定义按键值 (按键输入时, shift+字母键,可以获取大写字母,即游戏中的加速功能)
- key_teleop_node.cpp中:
sensor_msgs::JointState cmdjs_;
cmdjs_.header.stamp= ros::Time::now();
pub_.publish(cmdjs_);定义了一个消息变量,这个joint_state的消息,其中position变量是vector类型,每次发布前,一定要加上时间戳,否则接收节点不会识别为有效关节信息。
-
key_teleop_node.cpp 整体结构是添加了一个线程监听键盘事件,然后匀速修改关节位置,其中每个关节的位置都有最大最小限制(可以在robot的urdf文件中查看到关节的位置范围),然后将修改好的六个关节的位置赋值到msg中,并添加时间戳,最终用/joint_states 发送出去。然后 launch文件中运行的robot_state_publisher节点会接收话题信息,并完成对robot 的控制,在rviz中显示出来。
- 调试工具:
$ rqt_graph
$ rostopic echo /joint_states
参考资料:
- http://wiki.ros.org/joint_state_publisher
- http://docs.ros.org/jade/api/sensor_msgs/html/msg/JointState.html
- http://blog.csdn.net/hcx25909/article/details/9004617