song liu

robotics

Simscape (一)

由于机器人的实际系统是用的simulink搭建,所以仿真也自然的使用的simulink的simscape,实际发现这货可以做到ros control的效果(即仿真与实际机器人可以只使用一个控制程序代码) 实现simscape的简易流程: 1. 使用smimport导入urdf,然后在人工修改结构,使它的结构达到最简。(虽然simscape可以直接由solidwork这类的软件导出,我尝试了一下,生成的文件的居然产生了上千个link。。。) 2. 构造接触, 我使用的Simscape Multibody Contact Forces Library [https://www.mathworks.com/matlabcentral/fileexchange/47417-simscape-multibody-contact-forces-library] 然后参数都是默认的。 3. 构造用于电机与传感器的总线信号,然后在matlab system里面实现控制程序。(最后我初始化化总线型号的脚本,成功的突破了300行)。 4. 构造合适的初始化位置(特别是base
1 min read
robotics

Simulink Realtime(一)

最近做的几个机器人的控制系统都是用Slrt搭建的,这里记录一下遇见的几个坑: 1. slrt 从matlab 2018a后不在支持普通的电脑,所以我们选择了2017b作为我们的matlab版本,然后vs要选择2015,系统才能正常工作。 2. matlab 2017b的slrt不支持太新的intel cpu,我们最后选择i7 四代作为机器人的主控板。 3. 机器人的通信系统使用ethercat(个人感觉应该是最方便的通信),网络芯片使用i210(淘宝上唯一能买到的被支持的rtnet的网卡,同时也有mini pcie的i210)。 4. ethercat的接口的电机驱动器可能会挑运行twincat的网卡,所以在开发机上也使用i210。 5. 如果simulink的总线信号出现报错,可能是因为总线的定义数据的顺序有问题。 6. ethercat分支器可以直接自己画电路板实现。 7. 急停加在从站上受主站控制,可以更快的保护机器人。 8. 电机驱动运行在PT模式下比CST模式更加稳定(可能是通信速度不够快) 9. 配置elmo电机驱动的pdo的时候,修改了它的上一
1 min read
robotics Featured

PMSM控制-前言

原因 大约在2018年年中的时候看见了ben katz [http://build-its-inprogress.blogspot.com/p/about.html] 的博客,对他上面的hopper机器人比较感兴趣,所以开始计划自己实现一个。到了9月份的时候,我开始看SLIP的论文,居然发现那个hopper机器人就是最简单的一维SLIP模型。10月份,在IROS会议上, Sangbae Kim 神秘发布mini cheetah的视频 ,当时还要求大家不要拍照。然后到了2019年1月份我看见了ben的硕士论文,才知道mini cheetah 是他的硕士毕业论文。顺便这个时候,我结束了hzd与slip算法的学习与实现,于是决定从底层开始做起。开始想先做一个跑阻抗控制的永磁同步电机的电机驱动器。 元件的选择 mcu的选择 一开始,我想用ti的一套实现,原因是我们这里的电机驱动用的MCU为ti的28069,电机驱动IC用的drv8301。我也买了28069和DRV8305 ,后来玩了2天,感觉不能习惯它的IDE,于是又改回了stm32。然后看见f3为了st主推的用于电机驱动的mcu,就买了
2 min read
robotics

bebop2 + ros (1)

1. 按照 prgumd [https://github.com/prgumd/Parrot-Bebop2-Setup] 的文档 操作软件部分。 2. 按照bebop_autonomy [https://bebop-autonomy.readthedocs.io/en/latest/] 文档启动,唯一需要修改的是 bebbebop_driver/launch/bebop_nodelet.launch 下面的 drone_type  设置为  `bebop2` 3. 然后可以使用ros命令操作bebop,发送 takeoff 指令后,bebop会起飞,并保持在一定高度(1m?)。 4. 我是到这个时候才知道获取odom的频率是5hz(图片为30hz)且并没有原始传感器数据输出。可能会对某些slam算法有影响(可能的解决方案 1.tx2的载版带imu 2.tx2的载版在外挂一个imu)
1 min read
robotics

xenomai3 (1)

xenomai 安装流程 大体按照 rtt-lwr [http://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai3.html] 的流程走(xenomai 3.0.6 在2018年4月24日时会编译失败, 然而从git上面拉的最新代码能够正常编译)。然后我们需要增加2个选项。 1. RTnet的驱动要选上INTEL 82575(igb)(我们使用的I210网卡基于这个) 2. 在Xenomai的driver选项下选择Real-time IPC drivers(用于实时与非实时线程的通信)。 安装之后的操作 1. ~将/usr/xenomai拥有者和group使用chown命令修改为自己与xenomai组。 2. 修改ripc权限: 1. sudo vim 99-ripc.rules(/etc/udev/rules.d/) 2. 输入 KERNEL=
1 min read

基于位置的阻抗控制(一)

目的 本文主要介绍一个机器人的阻抗控制器的实现。阻抗控制作为一种与外部环境交互的控制算法,它主要借鉴了bond图的思想,然后假定系统处于平衡状态,从而对系统进行线性化操作,使线性叠加成为可能。 bond图 这个我主要看的是Das, Shuvra. Mechatronic modeling and simulation using bond graphs. New York: CRC Press, 2009.这本书的前几章,感觉只要熟悉了flow effort 的概念和不同的基本元件就够了。 过程 bond图主要描述功率在同一系统不同子环节中传递过程,在它的描述中,一个系统的功率可以由 flow和effort的乘积得到。而在机械系统中 flow 为速度或角速度,effort 为力或力矩。然后存在几种元件去执行传递,比如弹簧(电容),它接收位移(速度的积分)传化为力,阻尼(电阻)纯消耗功率电,惯性(电感)接收动量(力的积分)转化为速度,
3 min read

实时闭环控制系统(四)

目的 在实现完了自己的控制器后,然后想通过ControllerManager去load自己的的控制器。发现按照自己取的名字,并不能load控制,于是仔细看了一下 ros_control源码中,它去 load controller的流程。 流程 launch文件和命令行 根据官网的文档介绍 [http://wiki.ros.org/controller_manager] load或者其他操作一共有2个方法 1. Command-line tools 2. Creating launch files 然后,我找到了Command-line tools的源码 [https://github.com/ros-controls/ros_control/blob/kinetic-devel/controller_manager/scripts/controller_manager] (当然 launch文件的解析程序 也在它同目录下)然后这货在调用controller_manager(这应该是一个python包)
2 min read

trac-ik 的使用

安装 sudo apt install ros-kinetic-trac-ik(因为使用的是ubuntu 16.04) 一 大体上感觉和kdl库的使用方法差不多,所以可以先参考一下kdl [http://www.orocos.org/kdl/usermanual/geometric-primitives#toc20] 库的用法,不过唯一感觉到神奇的是kdl的frame(就是用来描述座标系变换的矩阵),它说的从a到b的变换,实际是b在a座标系中的座标,和我之前学的相反。还有 KDL::JntArray这货虽然表现得像矩阵一样,不过它的colums一直为1,所以还是一个一维数组,求它的长度用rows()。 二 具体的使用见它的例子 [https://bitbucket.org/traclabs/trac_ik/src/a5008432774126586063a74661b86eb1bcefdc9c/trac_ik_examples/src/ik_tests.cpp?at=master&
1 min read

搬砖记录(一)

我大概是2年前开始自学数学-物理的吧。。。 主要是那个时候感觉撸代码没有意思。。。想重新去玩控制。 数学 最开始复习了一下 高数-线代-概率 然后去看了Princeton Lectures in Analysis的第一卷 然后就被虐了。。。 在去寻找某些学校的上课计划,发现它前面是 rudin的 Principles of Mathematical Analysis,然后rudin前面是 Calculus With Analytic Geometry 。所以顺便把他们看了(用了一年时间吧)。然后在看分析的同时也在看代数,代数的第一本书看的 线性代数应该这样学, 第二本看的线性代数(原书第9版)[美] 史蒂文 J.利昂 著;张文博 译第三本看的代数学导论(正在看第二卷)第四本看Michael Artin的代数(正在看)。常微分方程看的 Braun的 Differential Equations And Their Applications (阿诺尔德的常微分方程看着吃力)。下一步计划看看微分几何。
3 min read

实时闭环控制系统(三)

目的 在理解ros_controller [https://github.com/ros-controls/ros_controllers/]的源码中。发现 joint_trajectory_controller [https://github.com/ros-controls/ros_controllers/blob/kinetic-devel/joint_trajectory_controller/include/joint_trajectory_controller/joint_trajectory_controller.h] 中存在着一个类型为 realtime_tools::RealtimeServerGoalHandle<control_msgs::FollowJointTrajectoryAction> 的类型。感觉这个名字很神奇,因为从名字上面来说它是一个action的goal,goal是action server的主要管理对象(详细介绍见 actionlibDetailedDescription [http:
1 min read

实时闭环控制系统(二)

目的 在实现自己的闭环ros_control的cotroller的中,我们需要在cotroller获取几个的具体的interface的数据,而在ros_control 中controller的默认的init函数中已经变成具体的interface,所以需要去overrideinit的上一层函数initRequest 的实现,从而达到自己的目标。 ros_controller中的资源管理 这个问题来源于对controller_interface::Controller [https://github.com/ros-controls/ros_control/blob/kinetic-devel/controller_interface/include/controller_interface/controller.h] 的initRequest的观察。在它的120行~128行出现了相关的使用。 hw->clearClaims(); if (!init(hw, controller_nh) || !init(hw, root_nh, controller_nh)) { RO
3 min read

实时闭环控制系统(一)

ros_control 架构 ros_control的基础结构 一个ros_control最基础的部分包括四大部分: 1. controller_manager::ControllerManager 2. controller 3. hardware_interface::RobotHW 4. hardware_interface 其他的Interface 然后下面我们从最外面开始介绍。 controller_manager::ControllerManager controller_manager::ControllerManager [https://github.com/ros-controls/ros_control/blob/kinetic-devel/controller_manager/src/controller_manager.cpp] 这个作为ros_control最核心的部件,它主要的作用就是 1. 管理controller,包括load与switch等等 2. 建立hardware_
3 min read