big_uncle

Results 105 issues of big_uncle

前段时间利用GitHub的教育优惠包褥羊毛,花了5美金搞了个谷歌服务器,主要想用来搞深度学习,打算弄一个Jupyter Notebook,这样就可以通过浏览器写代码,然后在远程服务器上运行了,哪怕训练十几天都不怕(~~反正不是我自己的电脑算~~) 褥羊毛的教程很多,百度一下就可以找到,比如这一篇:[从领取Github教育礼包到DigitalOcean购买服务器](https://www.jianshu.com/p/c5e7721d886c?tdsourcetag=s_pctim_aiomsg) # 安装Jupyter ```bash sudo apt install jupyter ``` Jupyter Notebook默认只能通过本地访问,也就是`http://localhost:8888`,通过远程访问的话会提示拒绝连接。 ![image](https://user-images.githubusercontent.com/35989223/79032379-7556da00-7bd8-11ea-8c5f-1b5476bf1dd5.png) 所以需要配置远程访问。 # 生成默认配置文件 ```bash jupyter notebook --generate-config ``` 执行之后会生成`jupyter_notebook_config.py`文件,命令行会输出文件路径。 # 生成密钥 首先安装`ipython3`(因为我的环境是python3) ```bash sudo apt install...

AI

上周末硬件组的人说想搞个无线下载器,就用ARM开源的CMSIS-DAP协议,结果就这一句话我自闭了四五天,终于在一篇非常棒的文章里找到了方法,因为写的太好了,所以这里我直接把原文翻译成中文,英文原文见:[usb_express:cmsis-dap [Geniekits]](http://wiki.geniekits.com/doku.php?id=usb_express:cmsis-dap) # 在STM32F103C8上实现CMSIS-DAP * 本工程的相关代码已经上传至[Github](https://github.com/GenieKits/CMSIS-DAP_on_STM32_with_EmBitz),你也可以从我的[下载页面](http://wiki.geniekits.com/downloads)获取到源文件。 --- 如果你想在主流的MCU上进行嵌入式开发,一般来说你需要一个JTAG来连接单片机和电脑。对于ARM的MCU来说,[J-Link](https://www.segger.com/products/debug-probes/j-link/)是一个非常有名的设备,它可以提供JTAG协议将单片机个电脑连接起来。CMSIS-DAP是一个由ARM公司发布的一款类似的设备。DAP和J-Link最主要的区别在于DAP使开源的,而J-Link是一个付费产品。另外,CMSIS-DAP是基于USB HID的,所以你不需要额外安装一个固件驱动就能使用。 CMSIS-DAP 2.0.0的源码在[CMSIS V5](https://github.com/ARM-software/CMSIS_5)的GitHub仓库里。在源码里还有两个基于[LPC-Link-II](https://www.nxp.com/design/microcontrollers-developer-resources/lpc-microcontroller-utilities/lpc-link2:OM13054)的示例。这两个示例使用的是[Keil MDK](http://www.keil.com/)的[RTE组件和USB库](http://www.keil.com/support/man/docs/uv4/uv4_ca_swcomponents.htm)。在源码中还有一个叫做`USB_CM3.lib`的库文件。正因为这些,官方提供的这个示例很不方便(即非ARM的平台就没法用)。作为一个开源的狂热粉丝,我决定以完全自由的方式实现CMSIS-DAP。 STM32F103是一款非常受欢迎,非常便宜的MCU,它有着ARM Cotex-M3的内核,由[STMicroelectronics](https://www.st.com/)设计。正巧我手里有一些叫做[Bluepill](https://satoshinm.github.io/blog/171212_stm32_blue_pill_arm_development_board_first_look_bare_metal_programming.html)的最小系统板,它上面搭载了一片小巧的STM32F103C8T6芯片,并且上面也没有多余的无用的外设组件。这块开发板的唯一不足是连接在USB D+引脚的上拉电阻是10K,但按照标准它应该是1.5K,不过它的USB依然能够正常工作,没有出什么问题。 ![image](https://user-images.githubusercontent.com/35989223/67093398-1fcee100-f1e4-11e9-95f5-dec024a62408.png) 给STM32创建一个完整的嵌入式开发环境是非常简单的。在ST的官网上,我们可以下载一些免费软件,其中最重要的是[STM32CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html)。这是一个图形化配置工具,帮助用户选择单片机引脚的功能,并自动生成外设初始化代码。我配置了USB、SPI1和USART1,并选择了USB的Custom HID middleware模式。GPIOB10到GPIO15被配置为JTAG调试需要的引脚。GPIOC13用于驱动单片机上的LED灯。但是我不知道怎么在STM32CubeMX中配置[CoreDebug](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/CEGFHDBB.html)和[DWT](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/CEGJGDCJ.html),它能在软件里面配置吗? ![image](https://user-images.githubusercontent.com/35989223/67093719-d5019900-f1e4-11e9-9f24-8568092cff59.png) ST公司也开发了他们自己的JTAG调试器——[STLink](https://www.st.com/en/development-tools/st-link-v2.html)。当然它并不是必要的,你也可以使用J-Link或者其他种类的调试器。STLink的驱动和程序可以在[ST官网](https://www.st.com/en/development-tools/stsw-link004.html)上下载。在网站里还有一个基于[Eclipse开发环境](https://www.eclipse.org/)开发的[IDE](https://www.st.com/en/development-tools/truestudio.html),STM32CubeMX也被包含其中。我选择的IDE是基于[CodeBlocks](http://www.codeblocks.org/)的[Embitz](https://www.embitz.org/),IDE中的[arm_none_eabi_gcc](https://launchpad.net/gcc-arm-embedded)版本是5.4.1。在我完成我的CMSIS-DAP之前,我必须使用STLink来调试我的代码。现在我在使用新做出来的CMSIS-DAP结合[OpenOCD](http://openocd.org/)进行日常的开发。 # 从CMSIS-DAP的源码开始 CMSIS V4 和 V5 中都有CMSIS-DAP的源码,我从[Github](https://github.com/ARM-software/CMSIS_5)上下载了CMSIS_5。CMSIS-DAP的核心文件有五个,但示例其实比核心代码更重要。我将从示例V1的头文件开始分析。 *...

RM
other

> 版权声明:本文为CSDN博主「阿飞__」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/afei__/article/details/81201039 # 一、Cmake 简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 # 二、常用命令 ## 1. 指定 cmake 的最小版本 ```cmake cmake_minimum_required(VERSION 3.4.1) ``` 这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。 ##...

ROS

不得不在家办公,给电脑装了个Ubuntu虚拟机跑ROS,结果在编译的时候遇到了问题: ![image](https://user-images.githubusercontent.com/35989223/75855227-c252ce00-5e2c-11ea-997b-f062d6278ece.png) 原因是没有足够的运行内存给编译程序用,我参考这篇博客:[Linux虚拟机增加内存后增加swap空间](http://blog.chinaunix.net/uid-12427199-id-3474464.html),成功扩大了内存。 其实swap空间就是把硬盘上的空间用来当内存使用,是一种折中的处理方法。 ## 1. 用dd命令创建一个2G的文件(2G=1024×1024×2=2097152) ```bash sudo dd if=/dev/zero of=/var/swapfile bs=1024 count=2097152 ``` ## 2. 将它创建为Linux Swap虚拟交换文件 ```bash sudo mkswap /var/swapfile ``` ## 3. 激活并使用/var/swapfile交换文件 ```bash sudo swapon...

ROS

# 新建功能包 ```bash mkdir src cd src catkin_create_pkg learning_communication std_msgs rospy roscpp cd ../ catkin_make source devel/setup.bash ``` # 创建Publisher ```cpp // ROS节点初始化 ros::init(argc, argv, "talker"); // 创建节点句柄 ros::NodeHandle n;...

ROS

3D立体画是裸眼3D的一种,最初是由一些极具创意的画家在街道或平地上创作的,后来又有了在纸上的绘制的作品。我的第一幅3D立体画是高二上画的: ![image](https://user-images.githubusercontent.com/35989223/73521186-530a4880-4440-11ea-802d-723247c23eb6.png) 然后上大学后许久没有画过了。 近期武汉新型冠状病毒肺炎疫情严重,只能呆在家,闲来无事想写一个能直接生成3D立体画的程序。 思路很简单,我们的目的是在相机的图像中将需要显示的物体放置在纸面上,还是放出这个世界坐标和图像坐标的关系: ![image](https://user-images.githubusercontent.com/35989223/72493552-6d4b0080-385c-11ea-8081-a508eec71bb1.png) 首先定义一个相机: ```javascript // 模拟相机类 var Camera = function() { var arr = [[1000, 0, 400], [0, 1000, 300], [0, 0, 1]]; this.intrinsic = new...

web

# OLED简介 我平时最喜欢玩的是中景园的0.96寸的单色OLED,有IIC通信和SPI通信两款,上面的驱动芯片是SSD1306,用起来非常方便。 ![image](https://user-images.githubusercontent.com/35989223/67146192-44e25300-f2bb-11e9-9c64-d85bdd8d0179.png) 该OLED的分辨率是128×64,显示内容时纵坐标上都是以页(page)为单位进行操作,所以这个0.96寸的OLED纵向为8个page。若有一个图标占用了2个page,那么在这个图标2个page的上下空白部分,不能显示其它内容。因为要在这个page的空白部分显示其它内容的话,会擦除这个page上已存在的内容。 有一种方法可以实现在空白部分显示其它内容,就是用并行接口去控制点阵屏,并行接口可以读取屏RAM的显示内容。我们进行写page之前,先把page里面的数据读出来,进行或操作之后再写,这样就保留了之前的图标内容。这种方法会占用MCU很多的IO口。更关键的是,我并没有并行接口,我只有IIC或者SPI,不支持读取屏上某一点的显示内容。 # GUI 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。目前网上已经有很多成熟的专门针对嵌入式系统的GUI,比如emWIN,MicroWindows,MiniGui,ZLG AWTK等。 实现GUI的基础就是实现画点、画线、画圆、画矩形、填充、显示文字等操作,所以下面我就具体讲怎么实现这些基本功能。 # OLED GUI 我使用的办法是在MCU里面创建一个和屏大小相同的数组,不过因为OLED屏上每一个像素点只有两个状态,亮或不亮,所以我完全可以用一位二进制数来表示,所以我使用了128×8的数组来存储OLED的像素点数据。所有的GUI操作均是直接操作这个数组,最后再统一将这个数组传给OLED显示出来,效率也提高了不少。 ```c uint8_t OLED_GRAM[128][8]; ``` ## 操作点 直接上代码 ```c //画点 //x:0~127 //y:0~63 //t:1...

other

因为商用激光雷达频率多在10~15Hz之间,当机器人快速运动时可能会出现激光雷达数据变形的情况,这会在一定程度上影响机器人的定位和路径规划。因此对激光雷达数据的纠正很关键。 我参考了[激光雷达移动状态下的数据矫正](https://www.cnblogs.com/wenhust/p/8735390.html)这篇文章,其中基本上是一篇论文的中文翻译,论文也在这篇文章中给出了。 我根据论文中的内容使用ROS和OpenCV搭建了一个仿真环境,在这个仿真程序中,雷达数据为10Hz,里程计数据为100Hz,使用键盘控制机器人的前后左右旋转。雷达一圈采集360个点。纠正的大体思路如下: 因为激光雷达数据频率较低,但每一帧中有360个数据,所以激光雷达的每一个数据时间间隔是小于里程计的。首先我们需要构建一个队列存储最近20帧里程计数据,然后在激光雷达数据回调函数中,针对每一个数据的时间戳找到对应的里程计近似数据,最后将这些里程计位姿对齐到最后一帧里程计数据(因为原始数据中只有最后一个雷达数据是准确的。) 程序有四个文件,直接上代码,关键部分有注释: * keyboard.h ```cpp // 作者:谢胜 // 功能:读取键盘输入(无需回车),可用于模拟程序中机器人控制的输入信号 #ifndef KEYBOARD_H #define KEYBOARD_H #include #include #include #include #include #include #include class Keyboard { public: Keyboard() { kfd...

RM
ROS

源码地址:https://github.com/RoboMaster/RoboRTS/tree/ros/roborts_planning --- 该节点包含两部分:全局路径规划和局部路径规划,全局路径规划使用A*算法,局部路径规划使用TEB算法,分别在`global_planner`和`local_planner`中。 # 全局路径规划节点代码结构详解 ## 1.文件目录 ```bash global_planner ├── CMakeLists.txt ├── global_planner_algorithms.h #包含实现具体算法类的头文件 ├── global_planner_base.h #全局规划算法的抽象类 ├── global_planner_test.cpp #全局规划的测试节点 ├── global_planner_node.cpp #全局规划核心功能执行的节点和Main函数 ├── global_planner_node.h ├── a_star_planner #A*全局规划算法实现 │ ├──...

RM

源码地址:https://github.com/RoboMaster/RoboRTS/tree/ros/roborts_base --- ## 1.文件目录 ```bash roborts_base ├── CMakeLists.txt ├── cmake_module │ └── FindGlog.cmake ├── chassis #底盘模块ROS接口封装类 │ ├── chassis.cpp │ └── chassis.h ├── gimbal #云台模块ROS接口封装类 │ ├── gimbal.cpp │ └──...

RM