ros_arduino_bridge+arduino+l298n控制编码电机(Arduino uno)

2023-05-16

踩了许多坑,看了许多教程,终于成功用ros_arduino桥的方法实现了对电机的控制,希望大家能通过我的教训少走一些弯路。

注:本教程的所有代码可以进入我主页下载

step1:

ubuntu下安装arduino IDE(具体方法可直接搜索,这里就暂时略过)

step2:

利用arduino IDE将下位机代码烧录到arduino中,注意我使用的是arduino uno,而很多教程使用的是arduino mega2560,不同的板子应该对代码进行适当的修改,好,话不多说,我们来看看具体步骤。

step2.1:进入catkin_ws/src git下来官方的包

cd ~/catkin_ws/src

git clone https://github.com/hbrobotics/ros_arduino_bridge.git

然后回到catkin_ws并编译

cd ..

catkin_make

step2.2:将上一步下载的包中的下位机代码复制入arduino的库(libraries)中。

先进入到sketchbook的libraries目录下,一般都在home里,很好找

cd ~/sketchbook/libraries

\cp -rp ~/catkin_ws/src/ros_arduino_bridge/ros_arduino_firmware/src/libraries/ROSArduinoBridge -T ROSArduinoBridge

step2.3:根据所选用的驱动和板子修改ROSArduinoBridge及相关代码

#define USE_BASE      // Enable the base controller code
//#undef USE_BASE     // Disable the base controller code

/* Define the motor controller and encoder library you are using */
#ifdef USE_BASE
   /* The Pololu VNH5019 dual motor driver shield */
   //#define POLOLU_VNH5019

   /* The Pololu MC33926 dual motor driver shield */
   //#define POLOLU_MC33926

   /* The RoboGaia encoder shield */
   //#define ROBOGAIA
   
   /* Encoders directly attached to Arduino board */
   #define ARDUINO_ENC_COUNTER

   /* L298 Motor driver*/
   #define L298_MOTOR_DRIVER
#endif

主要就是这个地方需要修改,我都标蓝了,这里千万要修改对,看清楚哪里注释了哪里没有注释

修改之后电机ide左上方向左的箭头,进行烧录

step3:

下一步我们查看编码器以及电机的相关接口的定义,一定要按照这个来连线!

首先是编码器,编码器的两个信号反馈线按照下列方式直接连到uno上:

#ifdef ARDUINO_ENC_COUNTER
  //below can be changed, but should be PORTD pins; 
  //otherwise additional changes in the code are required
  #define LEFT_ENC_PIN_A PD2  //pin 2
  #define LEFT_ENC_PIN_B PD3  //pin 3
  
  //below can be changed, but should be PORTC pins
  #define RIGHT_ENC_PIN_A PC4  //pin A4
  #define RIGHT_ENC_PIN_B PC5   //pin A5
#endif

由于我只拿了一个电机做实验,所以只连接了2和3这两个

如果有两路电机,左侧电机的编码输出接D2,D3;右侧电机的编码输出接A4,A5

然后是电机

#ifdef L298_MOTOR_DRIVER
  #define RIGHT_MOTOR_BACKWARD 5
  #define LEFT_MOTOR_BACKWARD  6
  #define RIGHT_MOTOR_FORWARD  9
  #define LEFT_MOTOR_FORWARD   10
  #define RIGHT_MOTOR_ENABLE 12
  #define LEFT_MOTOR_ENABLE 13
#endif

可以看到 5 6 9 10是四个控制电机转动的输出口,我只连了5和6

其他都是供电线,该怎么连怎么连就行

step4:

调试,打开serial monitor 根据command.h里面的相关提示输入指令查看反馈,

一定要注意波特率调到57600

主要指令:

a    模拟读入        例如  a 3

b    获取波特率

c    设置某引脚状态

d    读取某引脚状态   例如  d 4

e

m    设定速度         例如  m 20 20

p   

r    复位

s    舵机写值

t    舵机读值

u    更新PID

w    数字写0/1

x    模拟写  

0

1

例如如果你想从模拟引脚pin3读取数据,你就可以使用这个命令:

a 3

如果你想改变数字引脚pin3的模式为OUTPUT,就发送这个命令:

c 3 1

要得到目前编码器的计数,你可以用这个命令:

e

把机器人以每秒20个encoder ticks的速度向前移动,可以使用命令:

m 20 20

之后你会看到反馈到了数据,这样说明目前为止没有问题

对了,多说一句,arduino和你的主控连接的串口一定要搞明白 是usb0还是acm0

可以通过插拔检查

step5:

接下来我们试一下上位机用ros节点的方式与arduino通信,注意 这时一定要关闭刚才的monitor

配置ros_arduino_python节点

既然你的Arduino已经可以按要求运行sketch了,那么现在你就可以在你的PC上把它配置为ROS节点。你可以在通过编辑ros_arduino_python/config路径下的YAML文件定义的机器人尺寸,PID参数,以及传感器配置信息。所以首先进入到这个路径中:

$ roscd ros_arduino_python/config
  •  

你可以把这个提供的配置文件拷贝一份然后再修改(名字可以自定义):

$ cp arduino_params.yaml my_arduino_params.yaml
  •  

现在你可以使用任何你所喜欢的编辑器来编辑这个配置文件的副本(my_arduino_params.yaml),打开之后应该是这个样子:

# For a direct USB cable connection, the port name is typically
# /dev/ttyACM# where is # is a number such as 0, 1, 2, etc
# For a wireless connection like XBee, the port is typically
# /dev/ttyUSB# where # is a number such as 0, 1, 2, etc.

port: /dev/ttyUSB0
baud: 57600
timeout: 0.1

rate: 50
sensorstate_rate: 10

use_base_controller: False
base_controller_rate: 10

# For a robot that uses base_footprint, change base_frame to base_footprint
base_frame: base_link

# === Robot drivetrain parameters
#wheel_diameter: 0.146
#wheel_track: 0.2969
#encoder_resolution: 8384 # from Pololu for 131:1 motors
#gear_reduction: 1.0
#motors_reversed: True

# === PID parameters
#Kp: 10
#Kd: 12
#Ki: 0
#Ko: 50
#accel_limit: 1.0

# === Sensor definitions.  Examples only - edit for your robot.
#     Sensor type can be one of the following:
#     * Ping
#     * GP2D12
#     * Analog
#     * Digital
#     * PololuMotorCurrent
#     * PhidgetsVoltage
#     * PhidgetsCurrent (20 Amp, DC)


sensors: {
  #motor_current_left:   {pin: 0, type: PololuMotorCurrent, rate: 5},
  #motor_current_right:  {pin: 1, type: PololuMotorCurrent, rate: 5},
  #ir_front_center:      {pin: 2, type: GP2D12, rate: 10},
  #sonar_front_center:   {pin: 5, type: Ping, rate: 10},
  onboard_led:           {pin: 13, type: Digital, rate: 5, direction: output}
}

# Joint name and configuration is an example only
joints: {
    head_pan_joint: {pin: 3, init_position: 0, init_speed: 90, neutral: 90, min_position: -90, max_position: 90, invert: False, continuous: False},
    head_tilt_joint: {pin: 5, init_position: 0, init_speed: 90, neutral: 90, min_position: -90, max_position: 90, invert: False, continuous: False}
}
  •  

NOTE:不要在你的.yaml文件里使用tab,否则的话这个语法解析器会无法加载它。如果你要缩进的话必须用空格代替tab键。

ALSO:当定义你的传感器参数时,列表中的最后一个传感器的行尾(花括号后面)后没有逗号,但是其余的行尾必须有逗号。

现在让我们一起浏览一下这个文件的每一部分。

接口设置

这个接口要么是/dev/ttyACM0,要么是/dev/ttyUSB0,视情况而定,而且前面我们也已经提到过这个。

其中MegaRobogaiaPololu的Arudino sketch默认是以57600的波特率连接的。

轮询速率

跳出ROS loop运行的速率主要就取决于这个速率参数(默认为50Hz),这个默认值足以满足大多数情况。在任何情况下,它应该至少与你的传感器的最大速率(下面我们会说到)一样快才行。

sensorstate_rate决定了多久发布一个所有传感器的集合列表,每个传感器也以各自的速率在各自的主题上发布消息。

use_base_controller参数默认为False。你可以把它设置为True(假设你有文中所要求的硬件设施)。下面你将必须设置PID参数。

base_controller_rate参数决定了多久发布一次里程计读取信息。

定义传感器

sensors参数按照定义了传感器的名字和参数的字典。(你可以给你的传感器起任何你喜欢的名字,但是你必须要知道传感器的名字也会成为那个传感器所对应主题的名字。

这四个最重要的参数分别是:pintyperatedirectionrate定义了你每秒想轮询一次那个传感器多少次。例如,一个电压传感器可能每秒仅仅被轮询一次(或者仅仅每两秒一次),而一个声呐传感器可能每秒被轮询20次。type必须是列表中被列出来的(注意区分大小写!)。direction默认是input,所以如果你想将它定义为output,就将这个direction单独设为output。在上面的例子中,Arduino LED(pin13)将会以每秒两次的速率被点亮或熄灭。

设置Drivetrain(驱动系统)和PID参数

为了使用基础控制器(base controller),你必须去掉它的注释并且设置机器人的drivetrain和PID参数。示例中drivetrain参数是直径6英寸的驱动轮,距离11.5英寸。注意在ROS中使用米作为距离单位,所以一定要换算单位。示例中的编码器的分辨率(每转的tick数)规格来自于Pololu 131:1电动机。为你的电动机/编码器组合设置合理的数值。如果你的轮子向后转的话,那么就把motors_reversed设置为true,否则的话就设置为False。

PID参数比较难设置,你可以先按照示例中的值设置。但是在你第一次发送转弯命令的时候,一定要把你的机器人放在小块儿上。

启动ros_arduino_python节点

你现在看一下路径ros_arduino_python/launch下的文件arduino.launch。正如你所看到的,它指向一个名叫my_arduino_params.yaml的文件(之前创建的)。

<launch>
   <node name="arduino" pkg="ros_arduino_python" type="arduino_node.py" output="screen" clear_params="true">
      <rosparam file="$(find ros_arduino_python)/config/my_arduino_params.yaml" command="load" />
   </node>
</launch>
  •  

如果你的配置文件命名不同,那么就把这里的文件名参数(my_arduino_params.yaml)修改成你的配置文件的名字。

当你连接好Arduino并运行MegaRobogaiaPololu sketch时,使用下面的参数来启动 ros_arduino_python node节点:

$ roslaunch ros_arduino_python arduino.launch
  •  

NOTE:启动之前,千万不要打开Arduino IDE 的串口监视器,因为串口监视器会与该节点争夺串口资源。

你应该看到下面这样的输出:

process[arduino-1]: started with pid [6098] 
Connecting to Arduino on port /dev/ttyUSB0 … 
Connected at 57600 
Arduino is ready. 
[INFO] [WallTime: 1355498525.954491] Connected to Arduino on port / > dev/ttyUSB0 at 57600 baud 
[INFO] [WallTime: 1355498525.966825] motor_current_right {‘rate’: 5, > ‘type’: ‘PololuMotorCurrent’, ‘pin’: 1} 
[INFO] 
etc

如果你在你的机器人上装的有Ping声呐而且你也在配置文件里面定义了它们,它们就会闪一下来告诉你已经连接成功。

查看传感器数据

你可以回显传感器状态主题来查看所有传感器的数据:

$ rostopic echo /arduino/sensor_state
  •  

回显相应传感器的主题名字你就可以查看任何指定的传感器数据:

rostopic echo /arduino/sensor/sensor_name
  •  

例如,你有一个叫做 
ir_front_center的传感器,那么你可以运行下面的命令来查看相应的数据:

$ rostopic echo /arduino/sensor/ir_front_center
  •  

你也可以使用rqt_plot来将这系列数据用图像的形式表示出来:

$ rqt_plot  /arduino/sensor/ir_front_center/range

 

如上图所示那么恭喜你成功一半了,下来我们要根据你的底盘和编码器信息修改my_arduino_params.yaml文件

# For a direct USB cable connection, the port name is typically
# /dev/ttyACM# where is # is a number such as 0, 1, 2, etc
# For a wireless connection like XBee, the port is typically
# /dev/ttyUSB# where # is a number such as 0, 1, 2, etc.

port: /dev/ttyUSB0
baud: 57600
timeout: 0.1

rate: 50
sensorstate_rate: 10

use_base_controller: True
base_controller_rate: 10

# For a robot that uses base_footprint, change base_frame to base_footprint
base_frame: base_link

# === Robot drivetrain parameters
wheel_diameter: 0.146
wheel_track: 0.2969
encoder_resolution: 8384 # from Pololu for 131:1 motors
gear_reduction: 1.0
motors_reversed: True

# === PID parameters
Kp: 10
Kd: 12
Ki: 0
Ko: 50
accel_limit: 1.0

# === Sensor definitions.  Examples only - edit for your robot.
#     Sensor type can be one of the follow (case sensitive!):
#      * Ping
#      * GP2D12
#      * Analog
#      * Digital
#      * PololuMotorCurrent
#      * PhidgetsVoltage
#      * PhidgetsCurrent (20 Amp, DC)

sensors: {
  #motor_current_left:   {pin: 0, type: PololuMotorCurrent, rate: 5},
  #motor_current_right:  {pin: 1, type: PololuMotorCurrent, rate: 5},
  #ir_front_center:      {pin: 2, type: GP2D12, rate: 10},
  #sonar_front_center:   {pin: 5, type: Ping, rate: 10},
  arduino_led:          {pin: 13, type: Digital, rate: 5, direction: output}
}

 

 

发送Twist命令与查看里程计数据

把你的机器人放到块上使轮子悬空,然后发布一个Twist命令:

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{ angular: {z: 0.5} }'
  •  

两个轮子的转动方向应该是一致的,都是逆时针转动(右轮前进,左轮后退)。如果它们转动方向相反,那么就将motors_reversed 参数改为与之前相反的值,然后用ctrl+c 停止该节点,然后重新启动arduino.launch文件。

使用下面的命令可以使机器人停止:

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}'
  •  

要查看里程数据可以运行:

$ rostopic echo /odom
  •  

或者使用图形界面显示:

$ rxplot -p 60 /odom/pose/pose/position/x:y, /odom/twist/twist/linear/x, /odom/twist/twist/angular/z
  •  

ROS服务

ros_arduino_python功能包也定义了一些ROS服务,如下所示:

digital_set_direction-设置数字引脚的方向

$ rosservice call /arduino/digital_set_direction pin direction
  •  

这里pin是引脚数字,direction为0代表输入,1代表输出。

digital_write-给数字引脚发送高低电平(LOW为0,HIGH为1)

$ rosservice call /arduino/digital_write pin value
  •  

同样,这里pin是引脚数字,value是电平高低(LOW为0,HIGH为1)。

servo_write-设置伺服机位置

$ rosservice call /arduino/servo_write id pos
  •  

这里id是伺服机的索引号(定义在Arduino sketch中的servos.h)并且pos是以弧度为单位(0-3.14),头文件servos.h中具体是这样写的:

byte servoInitPosition [N_SERVOS] = { 90, 90 }; // [0, 180] degrees
  •  

servo_read -读取伺服机的位置

$ rosservice call /arduino/servo_read id
  •  

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros_arduino_bridge+arduino+l298n控制编码电机(Arduino uno) 的相关文章

  • Arduino 中的字符串比较

    我正在开发基于网络的家庭自动化系统 因此我的Arduino向服务器发送请求并在串行监视器中获得以下响应以及 loneOn 这是由于Serial println r 陈述 HTTP 1 1 200 OK Date Mon 13 Oct 201
  • Arduino“SerialEvent”示例代码无法在我的 Arduino Nano 上运行。我无法接收串行数据。为什么?

    我正在按照教程进行操作串行事件 https www arduino cc en Tutorial BuiltInExamples SerialEvent我正在尝试这段代码 然而 当我发送我的Arduino 纳米 https en wikip
  • 批处理文件:从串口接收数据并将其写入txt文件

    我正在尝试通过 USB 串行端口从 Arduino 提取一些数据并将其写入 txt 文件 因此 我使用批处理文件 Windows 7 普通cmd 它发送例如 d 从 Arduino 请求所需的数据 收到 d 后 Arduino 开始向 PC
  • Arduino:字符串到整数得到奇怪的值

    我想转换一个String to an int 我所能找到的就是你必须将 String 转换为 char 数组 然后将该数组转换为int 但我的代码产生奇怪的值 我无法弄清楚问题是什么 void ledDimm String command
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • 如何将 ASCII char 转换为其 ASCII int 值?

    我想将 char 转换为它的ASCII http en wikipedia org wiki ASCIIint 值 我可以用所有可能的值填充一个数组并与其进行比较 但这对我来说似乎不正确 我想要类似的东西 char mychar k pub
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 使用串口通过 Arduino 将多个值发送到 Raspberry

    我有一个关于 Arduino 和 Raspberry Pi 之间串行通信的问题 事实上 我想使用 Arduino 将 2 个变量发送到 Raspberry Pi 并以不同的方式使用它们 这是我的 Arduino 草图 int one 1 i
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • 将浮点数转换为字节数组的 C 函数

    我正在尝试创建一个函数来接受浮点变量并将其转换为字节数组 我找到了一段有效的代码片段 但如果可能的话 希望在函数中重用它 我也在使用 Arduino 环境 但我知道它接受大多数 C 语言 目前工作 float variable 1 11 b
  • 使用 Java 控制 Arduino

    我正在寻找一个LED http en wikipedia org wiki Light emitting diode用Java程序打开和关闭 我用 C 完成了这个项目大约 5 分钟 但用 Java 似乎更具挑战性 我让 Arduino 等待
  • 在声明对象之前在全局函数中使用类的成员函数

    我有一个事件处理函数 在该函数中调用了类的成员函数 事件处理函数在类 cpp 文件中声明 但不是类的一部分 它不是成员函数 当我编译代码时 编译器表示该函数在范围内 因为它正在调用全局事件处理函数中的成员函数 我的问题如下 有没有办法在全局
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c

随机推荐

  • (超简单)Ubuntu/linux上搭建pytorch-gpu环境

    xff08 超简单 xff09 Ubuntu linux上搭建pytorch gpu环境 1 下载miniconda conda 1 下载miniconda conda conda和miniconda可选择在清华镜像源中下载 xff0c 这
  • GAN训练中遇到的mode collapse(模式崩塌)

    1 梯度 loss爆炸 xff08 NaN xff0c Inf xff09 这两天一直在训练自己的GAN模型 xff0c 训练过程中鉴别器极其不稳定 xff0c 训练的几个epoch之后经常出现NAN xff0c 在加入WGAN中的梯度惩罚
  • 如何训练GAN?能够让GAN work的方法和技巧

    如何训练GAN xff1f 能够让GAN work的方法和技巧 尽管在生成对抗网络 xff08 GAN xff09 中的研究继续改善了这些模型的基本稳定性 xff0c 但我们使用了许多技巧来训练它们并使它们日复一日地稳定 xff08 翻译自
  • batch size,学习率(learning rate),and training time

    batch size 学习率 xff08 learning rate xff09 and training time 1 batch size和leaning rate的关系 现在深度学习中的绝大多数算法采用梯度下降法来进行训练 xff0c
  • torch.optim.lr_scheduler:pytorch必须掌握的的4种学习率衰减策略

    梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子 xff0c 常用的学习率有0 01 0 001以及0 0001等 xff0c 学习率越大则权重更新 一般来说 xff0c 我们希望在训练初期学习率大一些 xff0c 使得网络收敛
  • 虚拟内存与物理内存,自己理解,删除了一些细节,更容易懂

    其实虚拟内存就是字面意思 xff0c 虚拟保存在磁盘中的 xff0c 我们知道32为操作系统下一个进程是4g大小空间 xff0c 我们物理内存 xff08 也就是我们说的内存条 xff09 xff0c 假如我们以8g内存条定义 假如我们没有
  • 轻量型神经网络 shufflenet V1和shufflenet V2

    1 shufflenet V1 ShuffleNet是旷视科技 Face 43 43 提出的一种计算高效的CNN模型 xff0c 其和MobileNet和SqueezeNet等一样主要是想应用在移动端 所以 xff0c ShuffleNet
  • 详解C++中的const关键字

    1 const修饰指针 const修饰指针有三种情况 const修饰指针 常量指针 const修饰常量 指针常量 const即修饰指针 xff0c 又修饰常量 int main int a 61 10 int b 61 10 const修饰
  • CMake教程及使用案例

    1 CMake教程及使用案例 2 CMake Tutorial 3 https www cnblogs com crazyang p 14371953 html
  • gcc/g++编译选项&动态/静态库

    1 gcc g 43 43 编译选项 amp 动态 静态库
  • 外围设备对飞控的作用

    以下是我对外围设备的理解 xff08 如果理解有误 xff0c 请大佬们指正 xff09 桨叶 xff08 必须 xff09 xff1a 动力装置 电机 必须 xff1a 为无人机提供动力输出 电调ESC 必须 xff1a 电子调速器 控制
  • 飞控外围设备选型的注意事项

    合适的选型 xff08 如电机 43 桨叶 43 电池 xff09 可以兼顾无人机的航时和稳定性 xff0c 可将航时和稳定性发挥到极致 桨叶 xff1a 螺距和长度 桨叶的选择会影响无人机的航时和稳定性 xff0c 选的好航时和稳定性可以
  • STM32CubeMX学习笔记——FreeRTOS_任务创建与删除

    STM32CubeMX学习笔记 FreeRTOS 任务创建与删除 Github简介任务创建可视化创建方式代码创建方式 任务删除 Github https github com HaHaHaHaHaGe Planof2019 half tre
  • 关于串口发送的几个标志位

    首先了解STM32串口发送数据的简单过程 xff0c 如下图所示 发送 xff1a 软件将数据写到USARTx gt DR里面 xff0c 硬件自动把USARTx gt DR里面的数据并行转移到 发送移位寄存器 xff0c 然后硬件自动将发
  • TCP三步握手,以及相关问题

    三次握手是 TCP 连接的建立过程 在握手之前 xff0c 主动打开连接的客户端结束 CLOSE 阶段 xff0c 被动打开的服务器也结束 CLOSE 阶段 xff0c 并进入 LISTEN 阶段 随后进入三次握手阶段 xff1a 首先客户
  • HTTP digest认证

    HTTP的basic认证是通过明文来传输用户名和密码 xff0c 安全性不够 xff0c 因此HTTP又推出了摘要认证的方式来验证用户名和密码 流程和Basic认证差不多 1 浏览器访问服务端受保护的资源 xff0c 服务端返回401 同时
  • SLAM【十】回环检测

    SLAM 十 回环检测 回环检测的作用及意义作用意义 回环检测方法准确率和召回率词袋模型 字典字典的结构字典的创建相似度计算相似度评分的处理关键帧的处理检测之后的验证 参考 回环检测的作用及意义 作用 问题 xff1a 为了解决整个SLAM
  • ubuntu下切换默认python版本

    ubuntu下切换默认python版本 以 root 身份登录 xff0c 首先罗列出所有可用的python 替代版本信息如果出现以上所示的错误信息 xff0c 则表示 Python 的替代版本尚未被update alternatives
  • AVL分析飞机气动特性

    AVL xff0c 全称为Athena Vortex Lattice xff0c 是MIT的Mark Drela教授开发的一个气动分析程序 程序最初由Harold Youngren 1988年为MIT Athena TODOR航空软件集编写
  • ros_arduino_bridge+arduino+l298n控制编码电机(Arduino uno)

    踩了许多坑 xff0c 看了许多教程 xff0c 终于成功用ros arduino桥的方法实现了对电机的控制 xff0c 希望大家能通过我的教训少走一些弯路 注 xff1a 本教程的所有代码可以进入我主页下载 step1 ubuntu下安装