初学ROS

您所在的位置:网站首页 joy主题 初学ROS

初学ROS

2024-07-12 07:01| 来源: 网络整理| 查看: 265

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 #include #include 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("turtle1/cmd_vel", 1); joy_sub_ = nh_.subscribe("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文件

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3