Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9393188
  • 博文数量: 1747
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20060
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1747)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2019-07-18 17:53:23

Ubuntu18.docx
ROS_Serial_Keil.zip

在Ubuntu 18.04 (bionic) 部署ROS. 主要是测试 intel realsense D435的SLAM性能.

1. 安装 ROS

sudo sh -c '. /etc/lsb-release && echo "deb $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt update
sudo apt install ros-melodic-desktop-full
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo apt-get install -y python-rosdep ninja-build
# apt search ros-melodic 用来查找所有相关的ROS包
sudo rosdep init
rosdep update 
部署系统环境
### sudo vi /etc/environment  ? ADD
source /opt/ros/melodic/setup.bash
source /work/BIG/Waffle/install_isolated/setup.bash
source /work/BIG/Sensors/install_isolated/setup.bash
export ROS_MASTER_IP=127.0.0.1
export ROS_MASTER_URI={ROS_MASTER_IP}:11311
export ROS_HOSTNAME=127.0.0.1
export GIT_SSL_NO_VERIFY=1


### sudo vi ~/.bashrc  ? ADD
source /etc/environment
alias sw='cd /work/BIG/Sensors'
alias ss='cd /work/BIG /Sensors/src'
alias sm='cd /work/BIG/Sensors && catkin_make_isolated --install --use-ninja'
alias gw='cd /work/BIG/Waffle'
alias gs='cd /work/BIG/Waffle/src'
alias gm='cd /work/BIG/Waffle && catkin_make_isolated --install --use-ninja'
2. 创建自己的ROS工作空间.
mkdir –p /work/BIG/Waffle/src; 
cd /work/BIG/Waffle
catkin_make_isolated --install --use-ninja
3. 创建ROS程序包
cd /work/BIG/Waffle
catkin_create_pkg big_core std_msgs rospy roscpp
下面自定义 big_core内的文件内容.
4. 单片机支持ROS内容. 
sudo apt install ros-melodic-rosserial-client ros-melodic-rosserial
cd /work/BIG/Sensors/src
git clone
修改rosserial_stm32/src/ros_lib/STM32Hardware.h 为自己的STM32Fx系列的头文件. 这个文件在补丁打过之后还要再修改, 主要添加 TIM 以及 串口句柄的设定
修改 rosserial_stm32/src/rosserial_stm32/make_libraries.py 
STM32支持 double 类型
'float64' : ('double', 8, PrimitiveDataType, []),
在某个临时目录中, 执行 rosrun rosserial_stm32 make_libraries.py .  
处理一下空行和 virtual的问题. 看看 doit.sh的内容.
则在当前目录下产生 Src Inc目录, 把这些目录下的文件放到 Keil的工程中. 先编译过再说.


点击(此处)折叠或打开

  1. 产生的 H 文件一般在 Keil 中编译时会出现问题。主要是
  2. 1. 文件末尾没有出现空行。
  3.     for file in `find ./Inc -type f`; do
  4.       echo "" >> $file;
  5.     done;
  6.     
  7. 2. getType/getMD5 需要声明为 virtual, 例如
  8.     virtual const char * getType(){ return "big_msgs/ChassisBuzzer"; };
  9.     virtual const char * getMD5(){ return "ab6d0bc19e896bab4d45e3cd705be2f1"; };
  10.    
  11.     sed -i 's/const char \* getType/virtual const char \* getType/' $file;
  12.     sed -i 's/const char \* getMD5/virtual const char \* getMD5/' $file;
  13.     
  14. 3. 一般还要调整

  15. ROS/node_handle.h 中实际 publisher/subcriber 的实际数量。
  16. /* Node Handle */
  17. template<class Hardware,
  18.          int MAX_SUBSCRIBERS = 10,
  19.          int MAX_PUBLISHERS = 10,
  20.          int INPUT_SIZE = 512,
  21.          int OUTPUT_SIZE = 1024> 缓冲区大小也很重要, 否则造成 ROSSerial 失败。


  22. 以及 STM32Hardware.h : 主要是因为采用 USB CDC 而 不是物理串口进行通讯的。
  23. /*********************************************************************************************************************************/

  24. #ifndef ROS_STM32_HARDWARE_H_
  25. #define ROS_STM32_HARDWARE_H_

  26. #include <string.h>

  27. #include "stm32f4xx_hal.h"

  28. #include "usbd_cdc_if.h"

  29. extern "C" {
  30.     void reset_buf_VCPFSRecveived(void);
  31.     uint16_t read_buf_VCPFSRecveived(void);
  32.     uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
  33. }

  34. class STM32Hardware {
  35.   protected:

  36.   public:
  37.     STM32Hardware() {
  38.     }
  39.   
  40.     void init(){
  41.       reset_rbuf();
  42.     }

  43.     void reset_rbuf(void){
  44.                 reset_buf_VCPFSRecveived();
  45.     }

  46.     int read(){
  47.       int c = -1;
  48.             uint16_t ch;
  49.       ch = read_buf_VCPFSRecveived();
  50.             if (ch != 0xFFFF)
  51.                 c = ch & 0xff;
  52.       return c;
  53.     }

  54.     void flush(void){
  55.             //do nothing.
  56.     }
  57.     
  58.     void write(uint8_t* data, int length)
  59.         {    
  60.             while (CDC_Transmit_FS(data, length) != USBD_OK);        
  61.     }

  62.     unsigned long time()
  63.         {
  64.             return HAL_GetTick();
  65.         }
  66. };

  67. #endif


点击(此处)折叠或打开

  1. $ cat ROS_Serial_Keil/doit.sh
  2. #!/bin/bash

  3. if [ -d Inc ]; then
  4.   mkdir Inc
  5. fi
  6. rm -rf Inc/*

  7. rosrun rosserial_stm32 make_libraries.py ./

  8. for file in `find ./Inc -type f`; do
  9.   echo "" >> $file;
  10.   sed -i 's/const char \* getType/virtual const char \* getType/' $file;
  11.   sed -i 's/const char \* getMD5/virtual const char \* getMD5/' $file;
  12. done;

  13. echo "Generate Inc For stm32@keil5 OK."


阅读(5898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~