初学ROS--"joy"包学习

joy包是支持所有的Linux的操作手柄的一个包。这个包有一个用来作为操作手柄到ROS的接口的节点:joy_node.里面包含有操作手柄的按键和轴的信息。
这个驱动会论询可以读的端口,这个端口里会发布操作手柄的状态信息。如果这个端口关闭或者读取失败,它会重新打开该端口。操作手柄的轴的信息范围在[-1,1],按钮的为0是关闭,1是开。

joy_node有一个“~autorepeat_rate”的参数,如果Linux的核心在自动重复的间隔内没有收到任何时间,它会自动重复执行上一次操作手柄传来的值。

用法:`$joy[standard ROS args]`

涉及的ROS主题
1.没有订阅主题;
2.发布主题:”joy/joy”:发布的是操作手柄的输出,轴是[-1,1],按键是0或1.

参数
“~dev”操作手柄的输入设备,默认为:/dev/input/js0
“~deadzone”当轴的值在该deadzone区间内,输出为0,范围是[-0.9,0.9],缺省是0.05,类似轴的灵敏度.
“~autorepeat_rate”如果无事件,按这个速率重复上一次的值,缺省为0.
“~coalesce_interval”:在这里设定的间隔内如果收到多个事件,只发出一个。缺省值是0.01.

之后wiki里还给了两个教程,一个是通过ROS配置和使用一个支持LInux手柄,另一个是为支持Linux的手柄写一个遥控节点。对于其他设备的教程也给了一个链接遥控手柄教程

接下里是第一个教程:通过ROS配置和使用一个支持LInux手柄

1.安装包$ sudo apt-get install ros-indigo-joy
2.配置手柄
将手柄连接电脑后,先查看Linux是否支持你的手柄。$ ls /dev/input
回到一个输入设备的列表类似这样的

by-id    event0  event2  event4  event6  event8  mouse0  mouse2  uinput
by-path  event1  event3  event5  event7  js0     mice    mouse1

支持该手柄设备的话,会有一个jsX,例如js0。
接下看手柄是否工作。$ sudo jstest /dev/input/jsX,会看到一个有关操作手柄的输出,移动操作手柄上轴或按键,看看输出的数据是否会改变。

接下来让手柄可以访问ROS 的joy节点。首先列出手柄的许可$ ls -l /dev/input/jsX.
会看到类似如下的内容crw-rw-XX- 1 root dialout 188, 0 2009-08-14 12:04 /dev/input/jsX
如果前面的权限信息里的XX是rw证明配置合适,如果是–则配置不合适,需要输入如下指令:$ sudo chmod a+rw /dev/input/jsX
3.为了让手柄的数据能通过ROS发布我们需要打开joy节点,告诉节点使用哪个手柄设备,这里的缺省是js0.

$ roscore 
$rosparam set joy_node/dev "/dev/input/jsX"

现在可以打开joy节点了:$ rosrun joy joy_node,会看到类似如下的信息:

[ INFO] 1253226189.805503000: Started node [/joy], pid [4672], bound on [aqy], xmlrpc port [33367], tcpros port [58776], logging to [/u/mwise/ros/ros/log/joy_4672.log], using [real] time

[ INFO] 1253226189.812270000: Joystick device: /dev/input/js0

[ INFO] 1253226189.812370000: Joystick deadzone: 2000

现在打开一个新终端,使用如下指令看手柄来的数据:$ rostopic echo joy
会输出类似下面的结果:

---
axes: (0.0, 0.0, 0.0, 0.0)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, 0.0, 0.12372203916311264)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, -0.18555253744125366, 0.12372203916311264)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, -0.18555253744125366, 0.34022033214569092)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, -0.36082032322883606, 0.34022033214569092)
buttons: (0, 0, 0, 0, 0)

下面是第二个教程为支持Linux的手柄写一个遥控节点
第一步在工作空间创建一个包,依赖项是roscpp joy turtlesim
第二步写一个简单的遥控节点:在刚才创建包的src中新建一个cpp源文件。

源文件中的代码如下:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <sensor_msgs/Joy.h>


class TeleopTurtle
{
public:
  TeleopTurtle();

private:
  void joyCallback(const sensor_msgs::Joy::ConstPtr& joy);

  ros::NodeHandle nh_;

  int linear_, angular_;
  double l_scale_, a_scale_;
  ros::Publisher vel_pub_;
  ros::Subscriber joy_sub_;

};


TeleopTurtle::TeleopTurtle():
  linear_(1),
  angular_(2)
{

  nh_.param("axis_linear", linear_, linear_);
  nh_.param("axis_angular", angular_, angular_);
  nh_.param("scale_angular", a_scale_, a_scale_);
  nh_.param("scale_linear", l_scale_, l_scale_);


  vel_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1);


  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);

}

void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
  geometry_msgs::Twist twist;
  twist.angular.z = a_scale_*joy->axes[angular_];
  twist.linear.x = l_scale_*joy->axes[linear_];
  vel_pub_.publish(twist);
}


int main(int argc, char** argv)
{
  ros::init(argc, argv, "teleop_turtle");
  TeleopTurtle teleop_turtle;

  ros::spin();
}

第三步:在CMakeLists.txt里添加下面两句

add_executable(turtle_teleop_joy src/turtle_teleop_joy.cpp)
target_link_libraries(turtle_teleop_joy ${catkin_LIBRARIES})

第四步:按之前的教程配置好手柄。
第五步:为了确定那个按键发布消息给ros joy 里的按键,可以通过下面命令查看

$roscore
$ rosparam set joy_node/dev "/dev/input/jsX"
$ rosrun joy joy_node
$ rostopic echo joy

第五步:为了打开所有节点写一个launch文件

<launch>
 <!-- Turtlesim Node-->
  <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

 <!-- joy node -->
  <node respawn="true" pkg="joy"
        type="joy_node" name="turtle_joy" >
    <param name="dev" type="string" value="/dev/input/jsX" />
    <param name="deadzone" value="0.12" />
  </node>

 <!-- Axes -->
  <param name="axis_linear" value="1" type="int"/>
  <param name="axis_angular" value="0" type="int"/>
  <param name="scale_linear" value="2" type="double"/>
  <param name="scale_angular" value="2" type="double"/>
  <node pkg="learning_joy" type="turtle_teleop_joy" name="teleop"/>
</launch>

以上都是个人对wiki上教程的认识,因为也是初学,有的东西只是一知半解,希望有大佬不吝赐教。

  • 12
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值