基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

ros机器小车运动控制 通过对小车的使用可以知道,在 ROS 中运行程序大多是通过系统启动完成后,使用 ssh 软件或者虚拟机的 ssh 命令连接小车,再通过远程终端输入指令,运行相应的launch 文件才能执行相关程序。我们此次使用的小车使用的是树莓派ros程序,其中EPRobot 使用的路径规划和导航算法为 TEB 算法,该算法针对于阿克曼底盘结构的小车。定义X1方向为小车的正方向,则为机器人的方向角,因此用一个三维向量就完全可以表示机器人的运动路径,机器人在平面上的位姿表述。 阅读详情
AI摘要

本文介绍如何在ROS平台上通过键盘控制移动小车,并发布里程计数据。首先需下载串口及键盘控制ROS包,创建base_controller包处理速度数据与里程计信息。文章详细讲解了配置步骤与运行流程。

基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

准备工作

1.下载串口通信的ROS包

(1)cd ~/catkin_ws/src
(2)git clone https://github.com/Forrest-Z/serial.git

2.下载键盘控制的ROS包

(1)cd ~/catkin_ws/src
(2)git clone https://github.com/Forrest-Z/teleop_twist_keyboard.git

进入下载好的ROS包的文件夹,选中 keyboard_teleop_zbot.py ,右键>属性>权限>勾选 允许作为程序执行文件。
最后一步:

(1)cd ~/catkin_ws
 (2)catkin_make

这样子我们的键盘控制包就能使用了。

3.新建 base_controller ROS 包

(1)cd ~/catkin_ws/src
(2)catkin_create_pkg base_controller roscpp

在新建好的ROS包文件夹下新建一个“src”的文件夹,然后进入该文件夹,新建一个base_controller.cpp文件,将本博文最后提供的代码粘贴进去,然后修改一下 CMakeLists.txt :

第一处修改

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  serial
  tf
  nav_msgs
)

第二处修改

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES base_controller
  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)

第三处修改

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${serial_INCLUDE_DIRS}
)

第四处修改

add_executable(base_controller src/base_controller.cpp)
target_link_libraries(base_controller ${catkin_LIBRARIES})

然后修改一下 package.xml :

<?xml version="1.0"?>
<package>
  <name>base_controller</name>
  <version>0.0.0</version>
  <description>The base_controller package</description>
email="siat@todo.todo">siat</maintainer>

  <license>TODO</license>
  <!--   <test_depend>gtest</test_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <build_depend>message_generation</build_depend> 
  <build_depend>tf</build_depend>
  <build_depend>nav_msgs</build_depend> 


  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>

  <run_depend>message_runtime</run_depend> 
  <run_depend>tf</run_depend>
  <run_depend>nav_msgs</run_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

控制原理

1.当我们按下键盘时,teleop_twist_keyboard 包会发布 /cmd_vel 主题发布速度

2.我们在 base_controller 节点订阅这个话题,接收速度数据,在转换成与底盘通信的格式,然后写入串口

3.我们在 base_controller 节点读取底盘向串口发来的里程计数据,然后进行处理再将里程计发布出去,同时更新tf

4.当小车底盘接收到串口发来的速度后,就控制电机运转,从而实现键盘控制小车的移动

运行

1.启动键盘节点

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

2.启动小车底盘控制节点

rosrun base_controller base_controller

注意事项

1.我们在启动小车底盘控制节点时,有可以启动不了,大多数是因为串口的端口号不对,在 base_controller.cpp 文件里,我用的是”/dev/ttyUSB0”串口端口号

2.我们在启动启动小车底盘控制节点前,应该查看一下我们底盘的串口号是否正确,查看指令如下:

ls -l /dev |grep ttyUSB

如果运行后显示的端口号和我们程序中的一样,那就没问题,如果不一样,我们将程序的代码改动一下便可。

————————————————————————————————————————————————————————————————

base_controller.cpp 完整代码:

/******************************************************************
基于串口通信的ROS小车基础控制器,功能如下:
1.实现ros控制数据通过固定的格式和串口通信,从而达到控制小车的移动
2.订阅了/cmd_vel主题,只要向该主题发布消息,就能实现对控制小车的移动
3.发布里程计主题/odm

串口通信说明:
1.写入串口
(1)内容:左右轮速度,单位为mm/s
(2)格式:10字节,[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]
2.读取串口
(1)内容:小车x,y坐标,方向角,线速度,角速度,单位依次为:mm,mm,rad,mm/s,rad/s
(2)格式:21字节,[X坐标4字节][Y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]
*******************************************************************/
#include "ros/ros.h"  //ros需要的头文件
#include <geometry_msgs/Twist.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
//以下为串口通讯需要的头文件
#include <string>        
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <math.h>
#include "serial/serial.h"
/****************************************************************************/
using std::string;
using std::exception;
using std::cout;
using std::cerr;
using std::endl;
using std::vector;
/*****************************************************************************/
float ratio = 1000.0f ;   //转速转换比例,执行速度调整比例
float D = 0.2680859f ;    //两轮间距,单位是m
float linear_temp=0,angular_temp=0;//暂存的线速度和角速度
/****************************************************/
unsigned char data_terminal0=0x0d;  //“/r"字符
unsigned char data_terminal1=0x0a;  //“/n"字符
unsigned char speed_data[10]={0};   //要发给串口的数据
string rec_buffer;  //串口数据接收变量

//发送给下位机的左右轮速度,里程计的坐标和方向
union floatData //union的作用为实现char数组和float之间的转换
{
    float d;
    unsigned char data[4];
}right_speed_data,left_speed_data,position_x,position_y,oriention,vel_linear,vel_angular;
/************************************************************/
void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{
    string port("/dev/ttyUSB0");    //小车串口号
    unsigned long baud = 115200;    //小车串口波特率
    serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口

    angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/s
    linear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s

    //将转换好的小车速度分量为左右轮速度
    left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;
    right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;

    //存入数据到要发布的左右轮速度消息
    left_speed_data.d*=ratio;   //放大1000倍,mm/s
    right_speed_data.d*=ratio;//放大1000倍,mm/s

    for(int i=0;i<4;i++)    //将左右轮速度存入数组中发送给串口
    {
        speed_data[i]=right_speed_data.data[i];
        speed_data[i+4]=left_speed_data.data[i];
    }

    //在写入串口的左右轮速度数据后加入”/r/n“
    speed_data[8]=data_terminal0;
    speed_data[9]=data_terminal1;
    //写入数据到串口
    my_serial.write(speed_data,10);
}

int main(int argc, char **argv)
{
    string port("/dev/ttyUSB0");//小车串口号
    unsigned long baud = 115200;//小车串口波特率
    serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000));//配置串口

    ros::init(argc, argv, "base_controller");//初始化串口节点
    ros::NodeHandle n;  //定义节点进程句柄

    ros::Subscriber sub = n.subscribe("cmd_vel", 20, callback); //订阅/cmd_vel主题
    ros::Publisher odom_pub= n.advertise<nav_msgs::Odometry>("odom", 20); //定义要发布/odom主题

    static tf::TransformBroadcaster odom_broadcaster;//定义tf对象
    geometry_msgs::TransformStamped odom_trans;//创建一个tf发布需要使用的TransformStamped类型消息
    nav_msgs::Odometry odom;//定义里程计对象
    geometry_msgs::Quaternion odom_quat; //四元数变量
    //定义covariance矩阵,作用为解决文职和速度的不同测量的不确定性
    float covariance[36] = {0.01,   0,    0,     0,     0,     0,  // covariance on gps_x
                            0,  0.01, 0,     0,     0,     0,  // covariance on gps_y
                            0,  0,    99999, 0,     0,     0,  // covariance on gps_z
                            0,  0,    0,     99999, 0,     0,  // large covariance on rot x
                            0,  0,    0,     0,     99999, 0,  // large covariance on rot y
                            0,  0,    0,     0,     0,     0.01};  // large covariance on rot z 
    //载入covariance矩阵
    for(int i = 0; i < 36; i++)
    {
        odom.pose.covariance[i] = covariance[i];;
    }       

    ros::Rate loop_rate(10);//设置周期休眠时间
    while(ros::ok())
    {
        rec_buffer =my_serial.readline(25,"\n");    //获取串口发送来的数据
        const char *receive_data=rec_buffer.data(); //保存串口发送来的数据
        if(rec_buffer.length()==21) //串口接收的数据长度正确就处理并发布里程计数据消息
        {
            for(int i=0;i<4;i++)//提取X,Y坐标,方向,线速度,角速度
            {
                position_x.data[i]=receive_data[i];
                position_y.data[i]=receive_data[i+4];
                oriention.data[i]=receive_data[i+8];
                vel_linear.data[i]=receive_data[i+12];
                vel_angular.data[i]=receive_data[i+16];
            }
            //将X,Y坐标,线速度缩小1000倍
            position_x.d/=1000; //m
            position_y.d/=1000; //m
            vel_linear.d/=1000; //m/s

            //里程计的偏航角需要转换成四元数才能发布
      odom_quat = tf::createQuaternionMsgFromYaw(oriention.d);//将偏航角转换成四元数

            //载入坐标(tf)变换时间戳
            odom_trans.header.stamp = ros::Time::now();
            //发布坐标变换的父子坐标系
            odom_trans.header.frame_id = "odom";     
            odom_trans.child_frame_id = "base_footprint";       
            //tf位置数据:x,y,z,方向
            odom_trans.transform.translation.x = position_x.d;
            odom_trans.transform.translation.y = position_y.d;
            odom_trans.transform.translation.z = 0.0;
            odom_trans.transform.rotation = odom_quat;        
            //发布tf坐标变化
            odom_broadcaster.sendTransform(odom_trans);

            //载入里程计时间戳
            odom.header.stamp = ros::Time::now(); 
            //里程计的父子坐标系
            odom.header.frame_id = "odom";
            odom.child_frame_id = "base_footprint";       
            //里程计位置数据:x,y,z,方向
            odom.pose.pose.position.x = position_x.d;     
            odom.pose.pose.position.y = position_y.d;
            odom.pose.pose.position.z = 0.0;
            odom.pose.pose.orientation = odom_quat;       
            //载入线速度和角速度
            odom.twist.twist.linear.x = vel_linear.d;
            //odom.twist.twist.linear.y = odom_vy;
            odom.twist.twist.angular.z = vel_angular.d;    
            //发布里程计
            odom_pub.publish(odom);

            ros::spinOnce();//周期执行
      loop_rate.sleep();//周期休眠
        }
        //程序周期性调用
        //ros::spinOnce();  //callback函数必须处理所有问题时,才可以用到
    }
    return 0;
}
ROS机器人应用(5)—— 键盘和发布话题控制小车移动 1.小车开机,连接WIFI,密码:dongguan。,密码:dongguan。 阅读详情

相关推荐

【ROS】移动机器人导航仿真(1)——3D建模与简单移动

前期基本按着ROS wiki 和《ROS by example vol1 indigo 》走了一遍,但是感觉对ROS还是似懂非懂的,有好多问题仍然不明白。一直在想ROS到底是怎样用在机器人上的。所以干脆从3D建模、传感器信息采集到SLAM、路径规划等把机器人的整个导航过程捋一遍。 本节主要实现移动机器人的3D建模,激光和相机的信息采集以及在gazebo仿真环境中简单地移动机器人。完整代码见百度云:

子非鱼的博客 1万+

ROS里程计消息nav_msgs/Odometry的可视化方法

ROS中里程计的消息类型为nav_msgs/Odometry,可以利用geometry_msgs::PoseStamped消息,将其转化为nav_msgs/Path消息,从而在rviz中可视化

showing1998的博客 1万+

阿克曼结构移动机器人的gazebo仿真(三)

阿克曼结构移动机器人的gazebo仿真(三) 第三章、让小车动起来 1.配置controller 在tianracer_description功能包新建config文件夹,通过一个yaml文件smart_control_config.yaml来声明我们所需要的controller,以及对应的参数,PID增益和 控制器设置必须保存在yaml文件中,然后通过 launch文件加载到param服务器上: tianracer: # controls the rear two tires based on indiv

qq_48427527的博客 7914

【思维导图】nav_msgs/Odometry 消息的构成及订阅

导航功能包要求机器人 能够通过里程计信息源发布包含速度信息的里程计nav_msgs/Odometry 消息; 本篇整理了nav_msgs/Odometry消息的具体结构,更加清晰一点,以及如果订阅这种类型的topic时应该如何获取数据; 了解了具体的结构后来看一下简单一点的订阅实例: typedef struct { float x; float y; float th; } POSE2D; vector<POSE2D> odom_poses; void

1万+

ROS探索篇(一)在Gazebo中实现移动机器人仿真与环境搭建

$x+y=z$

weixin_52029211的博客 4621

ROS探索篇(三)基于turtlebot3实现SLAM建图及自主导航仿真

0、turtlebot3简介 TurtleBot3是一个小型,低成本,完全可编程,基于ROS的移动机器人。它旨在用于教育,研究,产品原型和爱好应用的目的。TurtleBot3的目标是大幅降低平台的尺寸和价格,而不会牺牲性能,功能和质量。由于提供了不同可选,如底盘,计算机和传感器,TurtleBot3可以通过各种方式进行定制。 1、安装turtlebot3 sudo apt-get install ros-melodic-turtlebot3-* //安装gmapping建图算法依赖 apt-get ins

weixin_52029211的博客 8699

[转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

原文出处: https://blog.youkuaiyun.com/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/src (2)git clone https://github.com/Forrest-Z/serial.git 1 2 3 2.下载键盘控制的ROS包 (1)cd ~/...

weixin_34216196的博客 1046

教程 | 阿克曼结构移动机器人的gazebo仿真(六)

第六章、配置controller并用键盘控制节点让小车动起来 1前言 上一节用xacro对urdf文件进行一个优化,并且配置好小车gazebo仿真所需的插件,以及传感器的插件。这一节通过配置controller让小车能够在gazebo仿真环境中真正动起来,并且能够用键盘控制节点来做一个控制。 2 配置racebot_control功能包 在工作空间下新建racebot_control功能包,并在功能包中新建如下文件夹: ros_control是ROS为开发者提供的机器人控制中间件,...

TIANBOT的博客 2964

基于ROS平台的移动机器人-目录

基于ROS平台的移动机器人-目录说明本系列博文将介绍基于ROS平台的移动机器人的搭建,包括小车的底盘的制作,控制和与上位机的通信。目录 基于ROS平台的移动机器人-1-小车底盘的搭建 基于ROS平台的移动机器人-2-小车底盘控制 基于ROS平台的移动机器人-3-小车底盘与ROS的通信 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动 基于ROS平台的移动机器人-5-Kinect2驱动的

Forrest's Space 1万+

无人驾驶(三)---teleop_twist_keyboard控制底盘运动

底盘控制文件启动后,可以通过teleop_twist_keyboard 和 cmd_vel 控制底盘运动

weixin_51157015的博客 7104

Ubuntu20.04 + ROS Noetic 移动机器人Gazebo仿真从模型加载到键盘控制全指南

移动机器人仿真开发中,Ubuntu20.04与ROS Noetic的组合凭借成熟的生态和丰富的社区支持,成为入门与预研的首选环境。Gazebo作为开源物理仿真平台,通过URDF模型描述、ros_control控制框架以及diff_drive_controller差速控制器,构建起从速度指令到轮子转动的完整数据链路。理解link、joint、transmission与物理插件的协作原理,是让仿真机器人动起来的关键。这套技术栈广泛适用于SLAM、导航算法验证、多传感器融合等工程场景。当模型加载成功但小车纹丝不动

weixin_42520025的博客 276

ROS+Gazebo仿真差速小车并实现控制

利用xacro描述文件创建差速小车模型,通过gazebo仿真此模型,然后利用libgazebo_ros_diff_drive.so插件控制小车的运动,最后实现了通过键盘按键,控制gazebo环境中的小车运动。

个人博客 1万+

FPGA 上的 YOLOv8 实时目标检测:从模型优化到硬件加速全解析

本文全面解析了将YOLOv8目标检测模型部署到FPGA进行硬件加速的完整流程。通过模型裁剪、混合精度量化等优化手段,结合HLS设计专用计算引擎与数据流,实现了高能效比的实时推理。文章深入探讨了软硬协同部署、性能调试与优化技巧,为追求极致实时性与低功耗的边缘AI应用提供了从算法到硬件的实战指南。

weixin_29031161的博客 604

基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人

一、所需工具包 1.ROS键盘包:teleop_twist_keyboard 2.ROS串口通讯包:serial $ cd ~/catkin_ws/src $ git clone https://github.com/Forrest-Z/teleop_twist_keyboard.git $ git clone https://github.com/Forre...

工大机器人工作室 4736

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 206

《基于Yolo算法的火灾检测系统设计与实现》开题报告

在消防安全领域,火灾对生命财产安全构成严重威胁。传统的火灾检测手段存在诸多不足,如误报率高、检测范围有限、响应速度慢等。基于 Yolo 算法的火灾检测系统能够利用深度学习技术,实现对火灾的高效、精准检测,具有重要的现实意义。         从社会安全角度看,该系统可以广泛应用于各类公共场所、工业厂房和居民住宅,实时监测火灾隐患,及时发出警报,为人员疏散和消防救援争取宝贵时间,有效降低火灾造成的人员伤亡和财产损失,保障社会公共安全。

m0_69704149的博客 1384

《ROS移动机器人从0到1》长篇小说第一章----《ROS移动小车整体框架详解》

欢迎收看《ROS移动机器人从0到1》长篇小说第一章----《ROS移动小车整体框架详解》! 下图是小说目前的目录,后续会根据同学们的建议进行增加或修改。 也请大家能及时提供反馈,共同进步。 ROS移动小车整体框架介绍 STM32和jetson nano通讯协议 mpu6050和ADC的配置以及数据读取 电机驱动和编码器数据读取 PID控制轮子转速 jetson_nano和STM32串口绑定和通讯测试 ROS小车功能包安装 雷达串口绑定和测试,RVIZ上显示 PS2

weixin_39401142的博客 1607

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

ROS 移动机器人 STM32 Kinect2 智能车

基于ROS平台的移动机器人-目录 说明 本系列博文将介绍基于ROS平台的移动机器人的搭建,包括小车的底盘的制作,控制和与上位机的通信,建图和导航。 目录 基于ROS平台的移动机器人-1-小车底盘的搭建 基于ROS平台的移动机器人-2-小车底盘控制 基于ROS平台的移动机器人-3-小车底盘与ROS的通信 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动 基于ROS平台的...

uunubt的专栏 4009

冷门但实用:Python爬取微信公众号历史文章,突破微信反爬限制(2025有效)

2025年微信公众号爬取的核心是「冷门方法+指纹伪装」,而非常规接口破解,itchat-uos+Playwright组合是突破设备指纹的关键;登录态持久化、动态Token实时获取、频率严格控制是避免被封禁的三大核心;文章内容解析需解决2025新增的编码混淆问题,chardet+BeautifulSoup是冷门但有效的方案;合规是前提,爬取频率、数据用途需严格遵守平台/法律规则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3777

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

基于ROS和python,通过TCP通信协议,完成键盘无线控制移动机器人运动

一、所需工具包 1.ROS键盘包:teleop_twist_keyboard 2.TCP通讯包:socket $ cd ~/catkin_ws/src $ git clone https://github.com/Forrest-Z/teleop_twist_keyboard.git $ catkin_make 3.在ubuntu的ros中建立一个r...

工大机器人工作室 6143

实验二 离散控制系统的性能分析(时域/频域)

1.掌握离散闭环系统的动态性能时域参数的分析与计算方法; 2.掌握离散系统稳定性的频域典型参数分析与计算方法。 MATLAB 软件( 2022a); 1.在 Matlab 语言平台上,通过给定的闭环离散系统,深刻理解时域参数的物理意义与计算方法,内容包括如下: 阻尼比参数分析:Z 平面与 S 平面的极点相互转换编程实现;分析 S/Z 两个平面域特殊特性(水平线、垂直线、斜线、圆周等)的极点轨迹相互映射方法;系统阶跃响应参数:上升时间和超调量等。 2. 采用频域分析方法,通过编程计算,进一步理解离散系统的稳定

m0_51738372的博客 2479

ROS2小车避坑指南:从键盘控制到话题发布的完整调试过程

本文详细介绍了ROS2小车的完整调试流程,从键盘控制到话题发布的实战指南。涵盖环境配置、键盘控制实现、话题发布方法及性能优化技巧,帮助开发者快速掌握ROS2机器人控制的核心技术,解决常见调试问题。

weixin_30689307的博客 342

tun虚拟网卡没有安装解决之道

目录 描述 过程 一、sstap 会提示你虚拟网卡没有安装; 二、还有会是这样的:病毒和威胁防护中无法启动;引擎不可以用等等,以及会显示需要IT管理员去处理;等等报错的信息; 系统升级地方会显示:Windows Defender Antivirus 的安全智能更新 - KB2267602 (版本 1.305.2147.0) - 错误 0xc8000442 Windows Defender报错; 三、还有就是会出现你搜自己家的WIFI搜不到,电脑端都不会显示WIFI名字; 解决方...

战神/calmness的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 基于ROS平台的移动机器人-3-小车底盘与ROS的通信
下一篇: 基于ROS平台的移动机器人-5-Kinect2驱动的安装和ROS下的测试
Forrest-Z
博客等级 码龄11年 661粉丝 20原创
评论 34
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forrest-Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值