[002] ROS+罗技F710游戏手柄,实现小车遥控控制

  这段时间从底层软硬件搭好了一辆差速磁导寻迹小车,鉴于一些场地无法铺设磁道,需要别的控制设备给车轮电机驱动器发送运动指令,恰好实验室闲置一个罗技F710游戏手柄,而且该手柄在ROS环境下有相关的包可以调用。后来参考CSDN上两位博主的文章,终于实现小车的遥控控制。具体实现步骤如下:

<1> 安装ROS的joy包 和joystick_driver包,操作码如下:

sudo apt-get install ros-kinetic-joy
sudo apt-get install ros-kinetic-joystick-drivers

<2> 在电脑上插上手柄的USB信号接收器,使用ctr+alt+t打开一个cmd控制台窗口,使用roscore指令激活一个节点管理器master,再打开另一个窗口,输入如下代码,打开joy包的joy节点。

rosrun joy joy_node

  可以看到,打开节点后会报一些错误,但是并不影响使用。

<3> 使用rostopic echo指令打印joy话题的实时数据,手柄的按钮和遥杆每次被操作都会更新数据。

rostopic echo /joy

  从上图可以看出,手柄的按钮和摇杆数据被存储在两个数组中:12个元素的buttons数组(int类型)和6个元素的axes数组(float类型),那各数组位对应在手柄上的实际按钮或摇杆位置在哪里呢?经过一番测试,现把正确的按钮和摇杆序号展示如下(注意:网上一些标识是错误的,这个坑我栽过,你们就别再栽进去了)。

特别说明一下:

① 蓝色箭头和数字表示按钮(buttons),红色箭头和数字表示摇杆(axes);

② 按钮按下输出1,不按输出0。蓝色序号10和11按下是按钮,推动是摇杆;

③ 摇杆正推到位输出+1,反推到位输出-1。

④ 摇杆<2>和<3>可以在+1和-1之间无极调节(精确到小数点后18位),如下图,而其他摇杆只有三种状态输出:+1.0,0.0,-1.0。

<3> 写程序订阅“joy”话题,获取相关buttons和axes的数据,即可将手柄作为控制源,控制小车前行、后退、左转和右转,如果驱动器支持速度模式,还能实现小车的无极调速。如下,附上本项目的手柄控制源码:

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include <sensor_msgs/Joy.h>
#include<iostream>
using namespace std;
 
class Teleop
{
public:
    Teleop();
 
private:
    /* data */
    void callback(const sensor_msgs::Joy::ConstPtr& Joy);
    ros::NodeHandle n;
    ros::Subscriber sub ;
    ros::Publisher pub ;
    double vlinear,vangular;
    int axis_ang,axis_lin,ton;
};
 
Teleop::Teleop()
{
    n.param<int>("axis_linear",axis_lin,3);
    n.param<int>("axis_angular",axis_ang,2);
    n.param<double>("vel_linear",vlinear,0.08);
    n.param<double>("vel_angular",vangular,0.15);
    n.param<int>("button",ton,5);
    pub = n.advertise<geometry_msgs::Twist>("/velocity_controller/cmd_vel",1);
    sub = n.subscribe<sensor_msgs::Joy>("joy",10,&Teleop::callback,this);
}
 
void Teleop::callback(const sensor_msgs::Joy::ConstPtr& Joy)
{
    geometry_msgs::Twist v;

   if(Joy->buttons[ton])
     {
     v.linear.x =(Joy->axes[axis_lin])*vlinear;
     v.angular.z = - (Joy->axes[axis_ang])*vangular;
     ROS_INFO("linear:%.3lf   angular:%.3lf",v.linear.x,v.angular.z);
     pub.publish(v);
     }
}
 
int main(int argc,char** argv)
{
    ros::init(argc, argv, "joy");
    Teleop telelog;
    ros::spin();
    return 0;
}

  "/velocity_controller/cmd_vel"是本项目小车驱动器的速度接收话题,速度指令经过计算后 pub到这个话题中,驱动器接收指令就可以驱动电机运动。

  编译后,先运行joy包的joy_node节点,然后启动如上源码编译后的节点,就可以遥控小车了。但需要说明一下,这里做了一个防误操作设定,需要先按下5号按钮,然后再摇动2和3号摇杆,才能控制小车运动。

  最后,感谢这两位博主的文章,帮我解决了这个实际控制中遇到的问题。

  https://blog.csdn.net/u014587147/article/details/75673110

  https://blog.csdn.net/p942005405/article/details/86560145

要用PS4手柄控制ROS Arduino Bridge小车,您需要在ROS环境中运行一个节点来读取手柄的输入并将其转换为适当的ROS消息,然后将这些消息发送到Arduino板上运行的ROS节点。以下是大致的步骤: 1. 首先,确保您的PS4手柄可以与您的计算机配对,并且可以在Ubuntu中被识别为输入设备。您可以使用“jstest-gtk”命令来测试手柄是否被正确识别。 2. 安装“ros-kinetic-joy”软件包,以使ROS能够读取手柄的输入。您可以使用以下命令进行安装: ``` sudo apt-get install ros-kinetic-joy ``` 3. 启动ROS节点,以接收手柄输入并将其转换为ROS消息。您可以使用以下命令启动“joy_node”节点: ``` rosrun joy joy_node ``` 4. 创建一个ROS节点,该节点将订阅“joy_node”节点发布的手柄消息,并将其转换为适当的ROS消息。这个节点应该包含一些逻辑,以将手柄控制转换为适合控制小车的消息。例如,您可以将手柄的左摇杆控制转换为小车的方向控制,将手柄的右摇杆控制转换为小车的速度控制等。 5. 将这些消息通过ROS Arduino Bridge发送到Arduino板上运行的ROS节点。您可以使用“rosserial”软件包来实现此功能。安装“rosserial”软件包并将其添加到ROS环境中。 6. 在Arduino IDE中编写ROS节点,以接收由ROS节点发送的消息,并将其转换为控制小车的命令。例如,您可以使用ROS节点发送的消息来控制小车的电机或舵机。 7. 将Arduino板连接到您的小车,并确保所有电路都正确连接。然后将Arduino板上的ROS节点上传到板子中。 8. 最后,启动ROS节点和Arduino节点,以确保它们可以相互通信并正确控制小车。您可以使用“rostopic”命令和“rosrun”命令来测试节点是否正常运行,并且您可以使用手柄控制小车进行测试。 以上是大致的步骤,其中每个步骤都需要更多的细节和配置才能正常工作。您可以查阅ROS和Arduino的文档以获得更详细的信息和指导。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值