ROS 罗技手柄控制机器人(仿真和实体机器人)
20210615更新
测试的时候发现一个问题,之前代码的逻辑是每次按一下摇柄就发一个命令,但是如果一直按着摇柄往一个方向,也是发送一次命令,摇柄转到其他方向,信号发生变化才再次发送一个速度命令,这点其实在仿真里面没有问题。
但是,在实际控制机器人时,就会出现,比如要机器人往前,把摇杆推前,并保持,这时发送一个速度指令可能让机器人走一个loop的时间,然后就停下,这个问题也跟实际机器人的底层控制有关,如果这个机器人是接收到一个命令就一直执行,就不会有这个问题,但是实体机器人一般不会这样做控制,也太危险了。理想情况应该是,当我们控制摇杆往不同方向时,应该一直在发送速度指令,让机器人一直执行不同的指令。
综上所述,改了一下代码,如下:
#include<ros/ros.h>
#include<string>
#include<iostream>
#include<geometry_msgs/Pose.h>
#include<nav_msgs/Odometry.h>
#include<sensor_msgs/Joy.h>
#include<geometry_msgs/Twist.h>
#include<time.h>double vlinear,vangular;
int axis_ang,axis_lin_x,axis_lin_y,ton;
double vx, vy, vtheta_z;
/*
class Teleop
{
public:Teleop();private: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_x,axis_lin_y,ton;
};Teleop::Teleop()
{n.param<int>("axis_linear_x",axis_lin_x,7);n.param<int>("axis_linear_y",axis_lin_y,6);n.param<int>("axis_angular",axis_ang,3);n.param<double>("vel_linear",vlinear,0.15);n.param<double>("vel_angular",vangular,0.25);n.param<int>("button",ton,4);pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",1);sub = n.subscribe<sensor_msgs::Joy>("joy",10,&Teleop::callback,this);
}
*/
void callback(const sensor_msgs::Joy::ConstPtr& Joy)
{geometry_msgs::Twist v;if(Joy->buttons[ton]){vx =(Joy->axes[axis_lin_x])*vlinear;vy =(Joy->axes[axis_lin_y])*vlinear;vtheta_z = (Joy->axes[axis_ang])*vangular;ROS_INFO("linear x y:%.3lf %.3lf angular:%.3lf",vx,vy,vtheta_z);// pub.publish(v);}
}int main(int argc,char** argv)
{ros::init(argc, argv, "joy");ros::NodeHandle n;ros::Subscriber sub ;ros::Publisher pub ;ros::Rate r(20);n.param<int>("axis_linear_x",axis_lin_x,7);n.param<int>("axis_linear_y",axis_lin_y,6);n.param<int>("axis_angular",axis_ang,3);n.param<double>("vel_linear",vlinear,0.15);n.param<double>("vel_angular",vangular,0.25);n.param<int>("button",ton,4);sub = n.subscribe<sensor_msgs::Joy>("joy",10,callback);pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",1);while(n.ok()){geometry_msgs::Twist v;// if(Joy->buttons[ton])// {v.linear.x =vx;v.linear.y =vy;v.angular.z = vtheta_z;// ROS_INFO("linear x y:%.3lf %.3lf angular:%.3lf",v.linear.x,v.linear.y,v.angular.z);pub.publish(v);// }ros::spinOnce();r.sleep();}return 0;
}
这个就可以满足控制真实机器人时的需求。
机器人在实际使用中,经常需要通过外设来控制它完成一些简单的任务。
可以使用键盘,也可以使用罗技的手柄,手柄比较方便。键盘的代码就不放了,太多了。记录一下手柄控制方法。
要控制的对象是一个全向轮小车,所以会有一个y方向的横移,以及绕z轴自转。不管是holonomic还是non-holonomic的小车,就差一个y方向。
Mehtod:
安装手柄驱动:
sudo apt-get install ros-melodic-joy
sudo apt-get install joystick
根据实际ROS版本,选择安装包查看手柄串口号
ls -l /dev/input/js0
测试手柄信号
sudo jstest /dev/input/js0
运行ROS节点
rosrun joy joy_node
查看手柄发出的信号
rostopic echo joy
按几下手柄,看看输出的信号对不对
axes和buttons中的数值都在-1到1之间,然后搞清楚每个axes和buttons对应手柄上的按钮就可以开始写代码了,先看下面几张图:
写一个订阅手柄信息和发布/cmd_vel指令的node
先上代码:
#include<ros/ros.h>
#include<string>
#include<iostream>
#include<geometry_msgs/Pose.h>
#include<nav_msgs/Odometry.h>
#include<sensor_msgs/Joy.h>
#include<geometry_msgs/Twist.h>
#include<time.h>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_x,axis_lin_y,ton;
};Teleop::Teleop()
{n.param<int>("axis_linear_x",axis_lin_x,7);n.param<int>("axis_linear_y",axis_lin_y,6);n.param<int>("axis_angular",axis_ang,3);n.param<double>("vel_linear",vlinear,0.15);n.param<double>("vel_angular",vangular,0.25);n.param<int>("button",ton,4);pub = n.advertise<geometry_msgs::Twist>("/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_x])*vlinear;v.linear.y =(Joy->axes[axis_lin_y])*vlinear;v.angular.z = (Joy->axes[axis_ang])*vangular;ROS_INFO("linear x y:%.3lf %.3lf angular:%.3lf",v.linear.x,v.linear.y,v.angular.z);pub.publish(v);}
}int main(int argc,char** argv)
{ros::init(argc, argv, "joy");Teleop telelog;ros::spin();return 0;
}
代码中设定的初始速度比较低,成功测试后可以适当调高vlinear
和vangular
。
需要用到多少个按钮,就根据实际情况定就好了,这里写的控制逻辑是,每次发送指令时都是按住左上角的LB
键,然后在按遥感A和B来发送速度指令,这也是为了安全,防止使用时不小心碰到遥感使机器人撞到其他东西。
完成上述部分后,就可以写一个launch文件和一个shell文件,以后就能一个指令启动,不用一次次打开多个文件。
先写一个名叫handle_control.launch
文件:
<?xml version = "1.0"?>
<launch><node name="base_node_serial" pkg="gazebo_mobile_manipulator" type="base_node_serial" />
<node name="handle_control" pkg="gazebo_mobile_manipulator" type="handle_control" /></launch>
其中的pkg
名字,根据自己的package修改
然后建一个名为handle_control.sh
的shell文件:
#!/bin/bash
# This is our first script.rosnode kill --all;
echo 'Handle control Start!'gnome-terminal --tab --title="joy" --command="bash -c 'rosrun joy joy_node; $SHELL'"gnome-terminal --tab --title="handle control" --command="bash -c 'source catkin_ws/devel/setup.bash; roslaunch gazebo_mobile_manipulator handle_control.launch; $SHELL'"
之后使用时,只需要在terminal中输入bash handle_control.sh
即可
- 测试
1)启动shell后,先rostopic echo /cmd_vel
看看,输出的速度大小是否合适。
2)然后就可以启动自己的gazebo模型,当然,需要这个model是速度控制的。
3)同理,真实的机器人也是这样。
以上,都是亲测可行。
REFERENCES
- ros使用罗技f710无线控制手柄:
https://www.cnblogs.com/cj2014/p/3989784.html
ROS 罗技手柄控制机器人(仿真和实体机器人)相关推荐
- Ubuntu系统下使用ROS(moveit )连接ABB实体机器人(irb120)(1.控制仿真)
前言: 经过两天的踩坑,终于将ROS与ABB连接成功,可以通过rviz的gui界面拖动机械臂来控制实体ABB机械臂进行运动,因为网络上的教程(几位博主和ROS WIKI等)个别步骤的不完整,所以走了很 ...
- Webots 机器人仿真平台(四) 机器人基础控制器
新建环境模型 1 控制器结构 2 操作函数 2.1 初始化函数 2.2 距离传感器操作函数 2.3 ground_sensors 操作函数 2.4 激光雷达传感器操作函数 2.5 LED灯作函数 2. ...
- 基于C#的机器人仿真平台和机器人运动学算法实现
一.平台搭建 1.利用wpf自带的库进行机器人各关节导入 相关代码段: <Grid.ColumnDefinitions><ColumnDefinition Width="0 ...
- Webots 机器人仿真平台(三) 新建环境模型
新建环境模型 1 新建世界模型 2 添加机器人模型 3 添加机器人控制器 参考资料 这篇博客介绍如何在webot中新建一个世界并在该环境中加入障碍物.机器人等元素,并添加机器人对应的控制器.这可以帮助 ...
- 机器人仿真控制(以ABB为例)
说明:本次内容基于本博客四篇文章<基于C#的机器人仿真平台和机器人运动学算法实现>.<六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)--C#实现+ABB为例(规划直接下发离线程序运 ...
- Webots 机器人仿真平台(五) 新建四轮小车模型
新建机器人模型 1 添加机器人本体 1.1 添加Body 1.2 添加机器人轮子 2 添加距离传感器 3 小结 参考资料 下图为我们这篇博客创建的小车效果,接下来我们一步一步的实现在webots中搭建 ...
- ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真
ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...
- ROS探索总结(四)——简单的机器人仿真
置顶2013年04月30日 21:21:41 阅读数:38889 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程 ...
- ROS中阶笔记(四):机器人仿真—Gazebo物理仿真环境搭建(重点)
ROS中阶笔记(四):机器人仿真-Gazebo物理仿真环境搭建(重点) 文章目录 1 ros_control 1.1 ros_control安装 2 Gazebo仿真步骤(重点) 2.1 配置物理仿真 ...
最新文章
- sysbench0.5 mysql_sysbench 0.5 安装及 MySQL 基准测试
- 高通 MSM8K bootloader 之三: LK
- hadoop整合纪要
- 构造函数和实例对象之间的关系 构造函数创建对象带来的问题 原型
- python发邮件给女朋友代码_python发邮件的代码
- 我与C++的不解情缘
- [剑指offer]面试题8:旋转数组的最小数字
- 处理JAX-RS中的自定义异常类型
- UI设计和UX设计有什么区别?
- 深度相机_深度相机(TOF)的工作原理
- sizeof和strlen的简单使用方法和区别
- Keil开发环境安装教程
- 毕设——基于SpringBoot的电影荐评系统
- 痛苦的挣扎--msp430g2553我恨你!
- 产品读书《社群经济:移动互联网时代未来商业驱动力》
- [转载]1986年吴图南 马岳梁 吴英华 孙剑云等名家大師
- 更改会话语言oracle,alter session 修改的参数值在会话中如何回退
- RT-Thread学习1-tcp_modbus
- 【JY】橡胶支座精细化模拟与有限元分析注意要点
- 微信多开服务器,PC端微信多开