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:

  1. 安装手柄驱动:
    sudo apt-get install ros-melodic-joy
    sudo apt-get install joystick
    根据实际ROS版本,选择安装包

  2. 查看手柄串口号
    ls -l /dev/input/js0

  3. 测试手柄信号
    sudo jstest /dev/input/js0

  4. 运行ROS节点
    rosrun joy joy_node

    查看手柄发出的信号
    rostopic echo joy
    按几下手柄,看看输出的信号对不对

    axes和buttons中的数值都在-1到1之间,然后搞清楚每个axes和buttons对应手柄上的按钮就可以开始写代码了,先看下面几张图:

  5. 写一个订阅手柄信息和发布/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;
}

代码中设定的初始速度比较低,成功测试后可以适当调高vlinearvangular

需要用到多少个按钮,就根据实际情况定就好了,这里写的控制逻辑是,每次发送指令时都是按住左上角的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. 测试
    1)启动shell后,先rostopic echo /cmd_vel看看,输出的速度大小是否合适。
    2)然后就可以启动自己的gazebo模型,当然,需要这个model是速度控制的。
    3)同理,真实的机器人也是这样。
    以上,都是亲测可行。

REFERENCES

  1. ros使用罗技f710无线控制手柄:
    https://www.cnblogs.com/cj2014/p/3989784.html

ROS 罗技手柄控制机器人(仿真和实体机器人)相关推荐

  1. Ubuntu系统下使用ROS(moveit )连接ABB实体机器人(irb120)(1.控制仿真)

    前言: 经过两天的踩坑,终于将ROS与ABB连接成功,可以通过rviz的gui界面拖动机械臂来控制实体ABB机械臂进行运动,因为网络上的教程(几位博主和ROS WIKI等)个别步骤的不完整,所以走了很 ...

  2. Webots 机器人仿真平台(四) 机器人基础控制器

    新建环境模型 1 控制器结构 2 操作函数 2.1 初始化函数 2.2 距离传感器操作函数 2.3 ground_sensors 操作函数 2.4 激光雷达传感器操作函数 2.5 LED灯作函数 2. ...

  3. 基于C#的机器人仿真平台和机器人运动学算法实现

    一.平台搭建 1.利用wpf自带的库进行机器人各关节导入 相关代码段: <Grid.ColumnDefinitions><ColumnDefinition Width="0 ...

  4. Webots 机器人仿真平台(三) 新建环境模型

    新建环境模型 1 新建世界模型 2 添加机器人模型 3 添加机器人控制器 参考资料 这篇博客介绍如何在webot中新建一个世界并在该环境中加入障碍物.机器人等元素,并添加机器人对应的控制器.这可以帮助 ...

  5. 机器人仿真控制(以ABB为例)

    说明:本次内容基于本博客四篇文章<基于C#的机器人仿真平台和机器人运动学算法实现>.<六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)--C#实现+ABB为例(规划直接下发离线程序运 ...

  6. Webots 机器人仿真平台(五) 新建四轮小车模型

    新建机器人模型 1 添加机器人本体 1.1 添加Body 1.2 添加机器人轮子 2 添加距离传感器 3 小结 参考资料 下图为我们这篇博客创建的小车效果,接下来我们一步一步的实现在webots中搭建 ...

  7. ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真

    ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...

  8. ROS探索总结(四)——简单的机器人仿真

    置顶2013年04月30日 21:21:41 阅读数:38889 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程 ...

  9. ROS中阶笔记(四):机器人仿真—Gazebo物理仿真环境搭建(重点)

    ROS中阶笔记(四):机器人仿真-Gazebo物理仿真环境搭建(重点) 文章目录 1 ros_control 1.1 ros_control安装 2 Gazebo仿真步骤(重点) 2.1 配置物理仿真 ...

最新文章

  1. sysbench0.5 mysql_sysbench 0.5 安装及 MySQL 基准测试
  2. 高通 MSM8K bootloader 之三: LK
  3. hadoop整合纪要
  4. 构造函数和实例对象之间的关系 构造函数创建对象带来的问题 原型
  5. python发邮件给女朋友代码_python发邮件的代码
  6. 我与C++的不解情缘
  7. [剑指offer]面试题8:旋转数组的最小数字
  8. 处理JAX-RS中的自定义异常类型
  9. UI设计和UX设计有什么区别?
  10. 深度相机_深度相机(TOF)的工作原理
  11. sizeof和strlen的简单使用方法和区别
  12. Keil开发环境安装教程
  13. 毕设——基于SpringBoot的电影荐评系统
  14. 痛苦的挣扎--msp430g2553我恨你!
  15. 产品读书《社群经济:移动互联网时代未来商业驱动力》
  16. [转载]1986年吴图南 马岳梁 吴英华 孙剑云等名家大師
  17. 更改会话语言oracle,alter session 修改的参数值在会话中如何回退
  18. RT-Thread学习1-tcp_modbus
  19. 【JY】橡胶支座精细化模拟与有限元分析注意要点
  20. 微信多开服务器,PC端微信多开

热门文章

  1. Python—docx 批量生成 docx 文件
  2. android之资源颜色汇总
  3. erp系统有哪些功能模块?
  4. activiti+testng批量测试用例-请假流程
  5. Raspberry - 解决中兴(ZTE)摄像头无法使用密码访问树莓派上的samba共享(NAS)
  6. 利用威胁建模防范金融和互联网风险
  7. 用html做成的音频播放器,HTML5制作酷炫音频播放器插件图文教程
  8. 基于Hadoop豆瓣电影数据分析(综合实验)
  9. 超声波测距1602显示程序
  10. java sci论文,SCI论文中那些容易被混淆的部分!你写错过吗?