爱折腾-创客智造实验室 - 搭建ros小车底盘b
type: channel
link: https://www.ncnynl.com/tag/搭建ros小车底盘b
items: 搭建ROS小车底盘B-目录
items: 搭建ROS小车底盘B-小车底盘的搭建
items: 搭建ROS小车底盘B-小车底盘控制
items: 搭建ROS小车底盘B-小车底盘与ROS的通信
items: 搭建ROS小车底盘B-通过ROS利用键盘控制小车移动
items: 搭建ROS小车底盘B-Kinect2驱动的安装和ROS下的测试
items: 搭建ROS小车底盘B-使用Kinect2获取激光数据
items: 搭建ROS小车底盘B-使用Kinect2建图
items: 搭建ROS小车底盘B-使用Kinect2导航

搭建ROS小车底盘B-目录
type: item
date: 2017-03-09T05:01:00+00:00
description: 搭建ROS小车底盘B-目录 说明： 介绍如何搭建stm32底盘的ros小车 作者： 昵称:Forrest 简介：ros爱好者 博客地址：http://blog.csdn.net/Forrest_Z 代码库: https://github.com/ncnynl/ros-car-stm32 目录： 搭建ROS小车底盘B-目录 搭建ROS小车底盘B-小车底盘的搭建 搭建ROS小车底盘B-小车底盘控制 搭建ROS小车底盘B-小车底盘与ROS的通信 搭建ROS小车底盘B-通过ROS利用键盘控制小车移动 搭建ROS小车底盘B-Kinect2驱动的安装和ROS下的测试 搭建ROS小车底盘B-使用Kinect2获取激光数据 搭建ROS小车底盘B-使用Kinect2建图 搭建ROS小车底盘B-使用Kinect2导航 参考： http://blog.csdn.net/Forrest_Z/article/details/54909463

搭建ROS小车底盘B-小车底盘的搭建
type: item
date: 2017-03-09T05:01:00+00:00
description: 搭建ROS小车底盘B-小车底盘的搭建 说明 本博文将介绍小车底盘的搭建需要的硬件和搭建过程 物品清单 亚克力板或者铝合金小车底板一套 小车轮子一对 带编码器减速电机一对 万向轮一个 12V充电电池一个 降压模块一个 电机驱动模块一个 STM32核心板一块,比如：STM32F407 Kinect2一个 工控机或者笔记本一个 搭建步骤 分别将电池，降压模块，电机，万向轮，电机驱动板，STM32核心板，Kinect2和工控机装好在底盘板上 将轮子分别装上电机 将电池电源引出两路，一路接在降压模块，一路接在电机驱动模块 将电机驱动线接到驱动模块 降压模块得到的5V给STM32核心板供电 将STM32核心板的串口接到工控机 将Kinect2的usb口接到工控机的USB3.0口 小车搭建完成

搭建ROS小车底盘B-小车底盘控制
type: item
date: 2017-03-09T05:02:00+00:00
description: 搭建ROS小车底盘B-小车底盘控制 说明 本博文将介绍小车底盘控制的原理，如PID控制，控制程序的编写等。 小车控制思想 控制电机转动 电机的控制我们分为两部分，一部分为电机转动方向的控制，另一个为电机转速的控制。 电机转动的方向我们用两个MCU引脚来控制，假如PIN_A=1，PIN_B=0 时，电机正转；PIN_A=0，PIN_B=1 时，电机反转；PIN_A=0，PIN_B=0 时，电机停止。 电机速度的控制则需要一个PWM输出引脚，我们通过控制输出不同的PWM值来控制电机转动的速度。 PID控制 如果我们想控制小车以一米每秒的速度做直线，但由于地面的摩擦阻力的影响，会造成左右轮速度与我们想控制的速度不同，所以会走不直，这时我们就需要加入PID控制。 PID控制的思想就是我实时的把轮子真正的速度采集回来和控制的速度对比，差则补，多则减。 这样基本就可以实现理想控制。详细PID介绍查看。 小车转弯控制。 一般我们要是想控制小车以多少的速度前进或者后退，我们只需要PID控制两个轮子的速度一致就可以基本做到。 但如果要想控制小车以多少的角速度转弯，我们需要做一定的计算，如图所示： 我们可以得到左右轮速度和线速度角速度之间的关系如下： 通过以上的公式我们就可以控制小车的任意行走了. 程序结构 以下为我的STM32工程主要文件 （1）main.c 接收和发送串口数据，控制电机 /*********************************************** 说明 ***************************************************************** * * 1.串口接收 * （1）内容：小车左右轮速度,单位:mm/s（所有数据都为 float型，float型占4字节） * （2）格式：10字节 [右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节] * * 2.串口发送 * （1）内容：里程计（x,y坐标、线速度、角速度和方向角，单位依次为：mm,mm,mm/s,rad/s,rad，所有数据都为float型，float型占4字节） * （2）格式：21字节 [x坐标4字节][y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节] * ************************************************************************************************************************/ #include "stm32f10x.h" #include "stm32f10x_it.h" #include "delay.h" #include "nvic_conf.h" #include "rcc_conf.h" #include "usart.h" #include "encoder.h" #include "contact.h" #include "gpio_conf.h" #include "tim2_5_6.h" #include "odometry.h" #include "tim2_5_6.h" #include "stdbool.h" #include <stdio.h> #include "string.h" #include "math.h" /*********************************************** 输出 *****************************************************************/ char odometry_data[21]={0}; //发送给串口的里程计数据数组 float odometry_right=0,odometry_left=0;//串口得到的左右轮速度 /*********************************************** 输入 *****************************************************************/ extern float position_x,position_y,oriention,velocity_linear,velocity_angular; //计算得到的里程计数值 extern u8 USART_RX_BUF[USART_REC_LEN]; //串口接收缓冲,最大USART_REC_LEN个字节. extern u16 USART_RX_STA; //串口接收状态标记 extern float Milemeter_L_M…

搭建ROS小车底盘B-小车底盘与ROS的通信
type: item
date: 2017-03-09T05:02:00+00:00
description: 搭建ROS小车底盘B-底盘与ROS的通信 说明： 介绍小车底盘与ROS通讯方式 ROS平台与底盘通信协议 ROS平台与小车底盘的通信一般是通过串口或者CAN总线。 我这里采用的是串口，以下为我自定义的通信数据格式： （1）底盘串口部分 串口接收 （1）内容：小车左右轮速度,单位:mm/s（所有数据都为 float型，float型占4字节） （2）格式：10字节 [右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节] 串口发送 （1）内容：里程计（x,y坐标、线速度、角速度和方向角，单位依次为：mm,mm,mm/s,rad/s,rad，所有数据都为float型，float型占4字节） （2）格式：21字节 [x坐标4字节][y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节] （2）ROS平台串口节点部分 写入串口 （1）内容：左右轮速度，单位为mm/s （2）格式：１０字节,[右轮速度４字节][左轮速度４字节][结束符"\r\n"２字节] 读取串口 （1）内容：小车x,y坐标，方向角，线速度，角速度，单位依次为：mm,mm,rad,mm/s,rad/s （2）格式：２１字节，[Ｘ坐标４字节][Ｙ坐标４字节][方向角４字节][线速度４字节][角速度４字节][结束符"\n"１字节] 串口通信处理程序 （1）小车底盘串口处理程序。 底盘串口处理的程序主要写在了 main.c 文件中。 底盘向串口发送里程计代码： if(main_sta&0x01)//执行发送里程计数据步骤 { //里程计数据获取 x_data.odoemtry_float=position_x;//单位mm y_data.odoemtry_float=position_y;//单位mm theta_data.odoemtry_float=oriention;//单位rad vel_linear.odoemtry_float=velocity_linear;//单位mm/s vel_angular.odoemtry_float=velocity_angular;//单位rad/s //将所有里程计数据存到要发送的数组 for(j=0;j<4;j++) { odometry_data[j]=x_data.odometry_char[j]; odometry_data[j+4]=y_data.odometry_char[j]; odometry_data[j+8]=theta_data.odometry_char[j]; odometry_data[j+12]=vel_linear.odometry_char[j]; odometry_data[j+16]=vel_angular.odometry_char[j]; } odometry_data[20]='\n';//添加结束符 //发送数据要串口 for(i=0;i<21;i++) { USART_ClearFlag(USART1,USART_FLAG_TC); //在发送第一个数据前加此句，解决第一个数据不能正常发送的问题 USART_SendData(USART1,odometry_data[i]);//发送一个字节到串口 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送结束 } main_sta&=0xFE;//执行计算里程计数据步骤 } 底盘接收串口发来的速度代码： if(USART_RX_STA&0x8000) // 串口1接收函数 { //接收左右轮速度 for(t=0;t<4;t++) { rightdata.data[t]=USART_RX_BUF[t]; leftdata.data[t]=USART_RX_BUF[t+4]; } //储存左右轮速度 odometry_right=rightdata.d;//单位mm/s odometry_left=leftdata.d;//单位mm/s USART_RX_STA=0;//清楚接收标志位 } （2）ROS平台串口处理程序 ROS平台串口处理程序主要写在 base_controller.cpp 文件中。 ROS平台向串口发送速度代码： 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::Timeou…

搭建ROS小车底盘B-通过ROS利用键盘控制小车移动
type: item
date: 2017-03-09T05:02:00+00:00
description: 搭建ROS小车底盘B-通过ROS利用键盘控制小车移动 说明： 介绍如何通过键盘控制小车运动 准备工作 下载串口通信的ROS包 $ cd ~/catkin_ws/src $ git clone https://github.com/ncnynl/serial.git 下载键盘控制的ROS包 cd ~/catkin_ws/src git clone https://github.com/ncnynl/teleop_twist_keyboard.git 进入下载好的ROS包的文件夹，选中 keyboard_teleop_zbot.py ，右键->设为可执行文件。 最后一步： $ cd ~/catkin_ws $ catkin_make 这样子我们的键盘控制包就能使用了。 新建 base_controller ROS 包 创建base_controller $ cd ~/catkin_ws/src $ catkin_create_pkg base_controller roscpp 在新建好的ROS包文件夹下新建一个“src”的文件夹，然后进入该文件夹，新建一个base_controller.cpp文件，将本博文最后提供的代码粘贴进去: $ mkdir src $ touch src/base_controller.cpp $ vim src/base_controller.cpp base_controller.cpp代码： /****************************************************************** 基于串口通信的ROS小车基础控制器，功能如下： 1.实现ros控制数据通过固定的格式和串口通信，从而达到控制小车的移动 2.订阅了/cmd_vel主题，只要向该主题发布消息，就能实现对控制小车的移动 3.发布里程计主题/odm 串口通信说明： 1.写入串口 （1）内容：左右轮速度，单位为mm/s （2）格式：１０字节,[右轮速度４字节][左轮速度４字节][结束符"\r\n"２字节] 2.读取串口 （1）内容：小车x,y坐标，方向角，线速度，角速度，单位依次为：mm,mm,rad,mm/s,rad/s （2）格式：２１字节，[Ｘ坐标４字节][Ｙ坐标４字节][方向角４字节][线速度４字节][角速度４字节][结束符"\n"１字节] *******************************************************************/ #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 …

搭建ROS小车底盘B-Kinect2驱动的安装和ROS下的测试
type: item
date: 2017-03-09T05:02:00+00:00
description: 搭建ROS小车底盘B-Kinect2驱动的安装和ROS下的测试 说明 我们这里要测试的对象是Kinect2 实物如图： 驱动安装 首先git下载代码，很快下载好，放到~下面 $ git clone https://github.com/OpenKinect/libfreenect2.git 然后安装依赖项如下,最好事先编译安装好OpenCV sudo apt-get install build-essential cmake pkg-config libturbojpeg libjpeg-turbo8-dev mesa-common-dev freeglut3-dev libxrandr-dev libxi-dev 然后安装libusb。此处需要添加一个PPA sudo apt-add-repository ppa:floe/libusb sudo apt-get update sudo apt-get install libusb-1.0-0-dev 接着运行下面的命令，安装GLFW3 sudo apt-get install libglfw3-dev 如果没有成功的话，使用下面的命令，来代替上面的 cd libfreenect2/depends sh install_ubuntu.sh sudo dpkg -i libglfw3*_3.0.4-1_*.deb 接着编译库 cd .. mkdir build && cd build cmake .. make sudo make install 测试 需要把libfreenect2文件夹下面的rules里面的一个90开头的文件复制到/etc/udev/rules.d/下面 sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/ 插上kinect2，此时黄灯变成白色的，表示有驱动。 注意：只能用于USB3的接口 在中断进入刚才上面新建的build文件夹里的bin文件夹，运行： ./bin/Protonect 不出意外的话就可以看到显示的图像了。 ROS驱动包 安装iai-kinect2 ROS包 cd ~/catkin_ws/src/ git clone https://github.com/code-iai/iai_kinect2.git cd iai_kinect2 rosdep install -r --from-paths . cd ~/catkin_ws catkin_make -DCMAKE_BUILD_TYPE="Release" rospack profile 运行测试 启动kinect2驱动 roslaunch kinect2_bridge kinect2_bridge.launch 启动显示界面 rosrun kinect2_viewer kinect2_viewer 如果能显示出画面的话就没问题了 注意事项 Kinect2只能用于USB3的接口！！！

搭建ROS小车底盘B-使用Kinect2获取激光数据
type: item
date: 2017-03-09T05:03:00+00:00
description: 搭建ROS小车底盘B-使用Kinect2获取激光数据 说明： 此教程我们将利用KinectV2在ROS平台上将KinectV2获得的深度图片转化为激光数据，以便我们下面的建图和导航。 安装驱动 我们这里需要一个将深度图转为激光数据的包 $ cd ~/catkin_ws/src $ git clone https://github.com/ros-perception/depthimage_to_laserscan.git 我这里新建了一个bringup的包来专门存放launch 文件 $ cd ~/catkin_ws/src $ catkin_create_pkg bringup roscpp 在 bringup包内我们新建一个launch文件夹，然后在launch文件夹里添加 kinect2_depthimage_to_laserscan_rviz_view.launch文件 $ cd ~/catkin_ws/src/bringup $ mkdir launch $ touch launch/kinect2_depthimage_to_laserscan_rviz_view.launch $ vim launch/kinect2_depthimage_to_laserscan_rviz_view.launch 内容如下： <launch> <include file="$(find kinect2_bridge)/launch/kinect2_bridge.launch"> <arg name="base_name" value="kinect2"/> <arg name="sensor" value=""/> <arg name="publish_tf" value="true"/> <arg name="base_name_tf" value="kinect2"/> <arg name="fps_limit" value="-1.0"/> <arg name="calib_path" value="$(find kinect2_bridge)/data/"/> <arg name="use_png" value="false"/> <arg name="jpeg_quality" value="90"/> <arg name="png_level" value="1"/> <arg name="depth_method" value="default"/> <arg name="depth_device" value="-1"/> <arg name="reg_method" value="default"/> <arg name="reg_device" value="-1"/> <arg name="max_depth" value="12.0"/> <arg name="min_depth" value="0.1"/> <arg name="queue_size" value="5"/> <arg name="bilateral_filter" value="true"/> <arg name="edge_aware_filter" value="true"/> <arg name="worker_threads" value="4"/> </include> <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" output="screen"> <remap from="image" to="/kinect2/qhd/image_depth_rect"/> <remap from="camera_info" to="/kinect2/qhd/camera_info" /> <remap from="scan" to="/scan" /> </node> <node pkg="tf" type="static_transform_publisher" name="base_footprint_to_base_link" args="0 0 0.5 0 0 0 base_footprint base_link 50" /> <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0 0 0.5 0 0 0 base_link laser 50" /> <node pkg="tf" type="static_transform_publisher" name="base_li…

搭建ROS小车底盘B-使用Kinect2建图
type: item
date: 2017-03-09T05:03:00+00:00
description: 搭建ROS小车底盘B-使用Kinect2建图 说明： 此教程我将利用KinectV2得到的激光数据和Gmapping来建图 利用之前搭建的stm32底盘和kinect2 安装依赖包 安装Gmapping包 $ cd ~/catkin_ws/src $ git clone https://github.com/ros-perception/slam_gmapping.git $ cd ~/catkin_ws $ catkin_make $ rospack profile 在我们之前的建的bringup/launch/下新建kinect2_gmapping.launch文件 $ cd ~/catkin_ws/bringup/launch/ $ touch kinect2_gmapping.launch $ vim kinect2_gmapping.launch 代码如下： <?xml version="1.0"?> <launch> <include file="$(find kinect2_bridge)/launch/kinect2_bridge.launch"> <arg name="base_name" value="kinect2"/> <arg name="sensor" value=""/> <arg name="publish_tf" value="true"/> <arg name="base_name_tf" value="kinect2"/> <arg name="fps_limit" value="-1.0"/> <arg name="calib_path" value="$(find kinect2_bridge)/data/"/> <arg name="use_png" value="false"/> <arg name="jpeg_quality" value="90"/> <arg name="png_level" value="1"/> <arg name="depth_method" value="default"/> <arg name="depth_device" value="-1"/> <arg name="reg_method" value="default"/> <arg name="reg_device" value="-1"/> <arg name="max_depth" value="12.0"/> <arg name="min_depth" value="0.1"/> <arg name="queue_size" value="5"/> <arg name="bilateral_filter" value="true"/> <arg name="edge_aware_filter" value="true"/> <arg name="worker_threads" value="4"/> </include> <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" output="screen"> <remap from="image" to="/kinect2/qhd/image_depth_rect"/> <remap from="camera_info" to="/kinect2/qhd/camera_info" /> <remap from="scan" to="/scan" /> </node> <node pkg="gmapping" type="slam_gmapping" name="simple_gmapping" output="screen"> </node> <node name="base_controller" pkg="base_controller" type="base_controller"/> <node pkg="tf" type="static_transform_publisher" name="base_footprint_to_base_link" args="0 0 0.5 0 0 0 base_footprint base_link 50" /> <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0 0 0.5 0 0 0 base_link laser 50" /> <node pkg="tf" type="static_transform_publisher" name="…

搭建ROS小车底盘B-使用Kinect2导航
type: item
date: 2017-03-09T05:03:00+00:00
description: 搭建ROS小车底盘B-使用Kinect2导航 说明： 介绍利用kinect2实现自主导航 安装依赖包 安装一下所需的包 $ cd ~/catkin_ws/src $ git clone -b indigo-devel https://github.com/ros-planning/navigation $ cd ~/catkin_ws $ catkin_make $ rospack profile 在我们之前的建的bringup/下，新建nav_config文件夹,然后新建四个文件 $ cd ~/catkin_ws/bringup/ $ mkdir nav_config $ touch base_local_planner_params.yaml $ touch costmap_common_params.yaml $ touch global_costmap_params.yaml $ touch local_costmap_params.yaml 这四个文件主要用于导航配置 （1）base_local_planner_params.yaml文件内容： controller_frequency: 2.0 recovery_behavior_enabled: false clearing_rotation_allowed: false TrajectoryPlannerROS: max_vel_x: 0.3 min_vel_x: 0.05 max_vel_y: 0.0 # zero for a differential drive robot min_vel_y: 0.0 min_in_place_vel_theta: 0.5 escape_vel: -0.1 acc_lim_x: 2.5 acc_lim_y: 0.0 # zero for a differential drive robot acc_lim_theta: 3.2 holonomic_robot: false yaw_goal_tolerance: 0.1 # about 6 degrees xy_goal_tolerance: 0.15 # 10 cm latch_xy_goal_tolerance: false pdist_scale: 0.8 gdist_scale: 0.6 meter_scoring: true heading_lookahead: 0.325 heading_scoring: false heading_scoring_timestep: 0.8 occdist_scale: 0.1 oscillation_reset_dist: 0.05 publish_cost_grid_pc: false prune_plan: true sim_time: 2.5 sim_granularity: 0.025 angular_sim_granularity: 0.025 vx_samples: 8 vy_samples: 0 # zero for a differential drive robot vtheta_samples: 20 dwa: true simple_attractor: false （2）costmap_common_params.yaml文件 obstacle_range: 2.5 raytrace_range: 3.0 robot_radius: 0.30 inflation_radius: 0.15 max_obstacle_height: 0.6 min_obstacle_height: 0.0 observation_sources: scan scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0} （3）global_costmap_params.yaml文件 global_costmap: global_frame: /map robot_base_frame: /base_link update_frequency: 1.0 publish_frequency: 0 static_map: true rolling_window: false resolution: 0.01 transform_tolerance: 0.5 map_type: costmap （4）local_costmap_params.yaml文件 local_costmap: global_frame: /odom robot_base_frame: /base_link update_f…