控制kobuki 运行一个矩形: 类的形式写ROS节点程序
来源:互联网 发布:算法之美 中文版 pdf 编辑:程序博客网 时间:2024/04/30 10:39
控制kobuki运行一个rect_width_ x rect_height_ 的矩形.
订阅 /odom 里程信息
发布/mobile_base/commands/velocity 控制速度信息
// 头文件velcontrol.h#ifndef VELCONTROL_H#define VELCONTROL_H#include <ros/ros.h>#include <geometry_msgs/Twist.h> // for velocity commands#include <geometry_msgs/TwistStamped.h> // for velocity commands#include <nav_msgs/Odometry.h>#include "tf/LinearMath/Matrix3x3.h"#include "geometry_msgs/Quaternion.h"#define CV_PI 3.1415926535897932384626433832795#include <iostream>#include <stdlib.h>using namespace std ;typedef struct roPos{ double x; double y; double theta; void init(double x1, double x2, double x3) { x = x1; y = x2; theta = x3; }} roPos;class velControl{public: velControl(); roPos start_pos_; roPos curr_pos_;protected: void odomCallback(const nav_msgs::Odometry::ConstPtr& msg);private: double rect_width_; double rect_height_; double offset_xy_; double offset_theta_; double vel_line_; double vel_angle_; int state_; bool Is_Fininsh_; ros::NodeHandle handle_; ros::Publisher vel_pub_ ; ros::Subscriber sub_ ; geometry_msgs::Twist controlVel_;private: double angleWrap(double angle); bool init(); bool velocityControl(); int vel_pub_speed_;};#endif // VELCONTROL_H
//执行文件 velcontrol.cpp#include "velcontrol.h"velControl::velControl(){ init(); vel_pub_ = handle_.advertise<geometry_msgs::Twist>("/mobile_base/commands/velocity",1); sub_ = handle_.subscribe("/odom", 1, &velControl::odomCallback,this);}bool velControl::init(){ start_pos_.init(0.0, 0.0, 0.0); curr_pos_.init(0.0, 0.0, 0.0); rect_width_ = 1.0; rect_height_ = 1.0; offset_xy_ = 0.0001; offset_theta_ = 1.0/360*CV_PI; vel_line_ = 0.33; vel_angle_ = 0.2; vel_pub_speed_ = 5; state_ = 0; Is_Fininsh_ = true;}void velControl::odomCallback(const nav_msgs::Odometry::ConstPtr& msg){ static int count = 0; geometry_msgs::Quaternion orientation = msg->pose.pose.orientation; tf::Matrix3x3 mat(tf::Quaternion(orientation.x, orientation.y, orientation.z, orientation.w)); double yaw, pitch, roll; mat.getEulerYPR(yaw, pitch, roll); curr_pos_.x = msg->pose.pose.position.x; curr_pos_.y = msg->pose.pose.position.y; curr_pos_.theta = yaw; if(Is_Fininsh_) { start_pos_.x = curr_pos_.x; start_pos_.y = curr_pos_.y; start_pos_.theta = curr_pos_.theta; } count++; if( count %= vel_pub_speed_ ) { velocityControl(); }}bool velControl::velocityControl(){ geometry_msgs::Twist controlVel_; switch (state_) { case 0: //前进1米 if ( abs(curr_pos_.x - start_pos_.x) < rect_width_ ) { cout<<"0 curr_pos_x "<<abs(curr_pos_.x - start_pos_.x) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = vel_line_; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"0 curr_pos_x "<<abs(curr_pos_.x - start_pos_.x) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 1; Is_Fininsh_ = true; } break; case 1: //原地转90° if ( abs(angleWrap(curr_pos_.theta - start_pos_.theta)) < CV_PI/2 ) { cout<<"1 curr_pos_theta "<<curr_pos_.theta - start_pos_.theta<<endl; controlVel_.angular.z = vel_angle_; controlVel_.linear.x = 0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"1 curr_pos_theta "<<curr_pos_.theta - start_pos_.theta<<endl; ROS_INFO(" %d ",curr_pos_.theta - start_pos_.theta); controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 2; Is_Fininsh_ = true; } break; case 2: //前进0.5米 if ( abs(curr_pos_.y - start_pos_.y ) < rect_height_ ) { cout<<"2 curr_pos_y "<<abs(curr_pos_.y - start_pos_.y ) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = vel_line_; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"2 curr_pos_y "<<abs(curr_pos_.y - start_pos_.y ) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 3; Is_Fininsh_ = true; } break; case 3: //原地转90° if ( abs(angleWrap(curr_pos_.theta - start_pos_.theta)) < CV_PI/2 ) { cout<<"3 curr_pos_theta "<< abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = vel_angle_; controlVel_.linear.x = 0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"3 curr_pos_theta "<<abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 4; Is_Fininsh_ = true; } break; case 4: //前进1米 if ( abs(curr_pos_.x - start_pos_.x) < rect_width_ ) { cout<<"4 curr_pos_x "<<abs(curr_pos_.x - start_pos_.x) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = vel_line_; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"4 curr_pos_x "<<abs(curr_pos_.x - start_pos_.x) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 5; Is_Fininsh_ = true; } break; case 5: //原地转90° if ( abs(angleWrap(curr_pos_.theta - start_pos_.theta)) < CV_PI/2 ) { cout<<"5 curr_pos_theta "<<abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = vel_angle_; controlVel_.linear.x = 0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"5 curr_pos_theta "<<abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 6; Is_Fininsh_ = true; } break; case 6: //前进0.5米 if ( abs(curr_pos_.y - start_pos_.y) < rect_height_ ) { cout<<"6 curr_pos_y "<<abs(curr_pos_.y - start_pos_.y) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = vel_line_; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"6 curr_pos_y "<<abs(curr_pos_.y - start_pos_.y) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 7; Is_Fininsh_ = true; } break; case 7: //原地转90° if ( abs(angleWrap(curr_pos_.theta - start_pos_.theta)) < CV_PI/2 ) { cout<<"7 curr_pos_theta "<<abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = vel_angle_; controlVel_.linear.x = 0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = false; } else { cout<<"7 curr_pos_theta "<<abs(angleWrap(curr_pos_.theta - start_pos_.theta)) <<endl; controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; state_ = 0; Is_Fininsh_ = true; } break; default: controlVel_.angular.z = 0.0; controlVel_.linear.x = 0.0; controlVel_.linear.y = 0; controlVel_.linear.z = 0; Is_Fininsh_ = true; break; } vel_pub_.publish(controlVel_);}double velControl::angleWrap(double angle){ ///这个函数用来实现把角度规划到-pi至pi之间 if (angle>=CV_PI) while (angle >= CV_PI) { angle = angle-2*CV_PI;} else if (angle < -1.0*CV_PI) while (angle < -1.0*CV_PI) { angle = angle+2*CV_PI;} return angle;}int main(int argc,char** argv){ ros::init(argc,argv,"odompub"); velControl odom_vel_; ros::spin(); return 0;}
cmake文件
cmake_minimum_required(VERSION 2.8)project(ar_localization)include_directories(${catkin_INCLUDE_DIRS})find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation nav_msgs cv_bridge image_transport sensor_msgs std_msgs tf geometry_msgs visualization_msgs ) generate_messages( DEPENDENCIES std_msgs)catkin_package()add_executable(velControl ${AR_SOURCE_DIR}/qrslam/pub/velcontrol.cpp ${AR_SOURCE_DIR}/qrslam/pub/velcontrol.h)target_link_libraries(velControl ${catkin_LIBRARIES} )
0 0
- 控制kobuki 运行一个矩形: 类的形式写ROS节点程序
- 用串口控制kobuki, 绕过ROS系统
- ROS学习记录(2)--控制Kobuki
- 自己写一个ROS程序
- ROS学习记录(3)--Kobuki控制大合集
- ROS的初步学习(六)---写一个简单程序
- ROS(一) 写自己的节点
- ROS节点与运行
- ROS学习笔记(一):自己动手写一个ROS程序
- ROS学习笔记(一):自己动手写一个ROS程序
- 自己动手写一个ROS程序 标签: ROS入门
- 创建一个ROS节点
- kobuki 学习笔记for ROS
- ROS机器人操作系统分布式控制的节点 配置方法
- 获取一个节点包括子节点的(以字符串形式)
- 控制kobuki底盘(一)
- 控制kobuki底盘(二)
- ROS(二)自己动手写一个简单的发布(Publisher)、订阅(Subscriber)程序
- JSON需要的jar包和和String类型转JSON
- 【精】从入门到高深,史上最全的Spark综合帖
- contentObserver内容观察者,血泪史,擦,气死人啊
- MySQL 库操作
- jsp编码及url请求中文乱码、图片上传文件名乱码
- 控制kobuki 运行一个矩形: 类的形式写ROS节点程序
- iOS开发-runtime获取设备电池电量
- java枚举enum
- DIV+CSS实操四:经管系网页内容模块内容添加(一)
- 看kali教程的一些总结(i春秋上的kali吧教程)
- XDU-1015 无聊的Light Light (贪心)
- 看!数据分析领域中最为人称道的七种降维方法
- 谈下自己编程的能力和一些项目
- 用CHI检验提取文本特征词