日月重光

~~~~~~~~~~~~~~~~~

robotics

Simscape (一)

由于机器人的实际系统是用的simulink搭建,所以仿真也自然的使用的simulink的simscape,实际发现这货可以做到ros control的效果(即仿真与实际机器人可以只使用一个控制程序代码) 实现simscape的简易流程: 使用smimport导入urdf,然后在人工修改结构,使它的结构达到最简。(虽然simscape可以直接由solidwork这类的软件导出,我尝试了一下,生成的文件的居然产生了上千个link。。。)构造接触, 我使用的Simscape Multibody Contact Forces Library 然后参数都是默认的。构造用于电机与传感器的总线信号,然后在matlab system里面实现控制程序。(最后我初始化化总线型号的脚本,成功的突破了300行)。构造合适的初始化位置(特别是baselink的6个自由度),要使接触点在初始化的时候高于地面。未来的计划: 在仿真与实际机器人上面实现wbc~

robotics

Simulink Realtime(一)

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

robotics

PMSM控制-前言

原因 大约在2018年年中的时候看见了ben katz的博客,对他上面的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,就买了一个f303re的Nucleo-64板子,开始实现foc的算法。大约花了一周的时间实现完了所有程序,然后测试发现,由于f303的主频太低,导致我想在低端导通的的时候adc采样占用了太长的时间影响了pwm的占空比范围,于是我又换成h743,不过我用它调试了2天,发现它的adc的控制,达不到我想要的效果,于是我换成了f446。 电机驱动ic的选择 我买了几种电机驱动ic,比如drv8305,drv8353,drv8301 ,drv8302。

robotics

bebop2 + ros (1)

按照 prgumd 的文档 操作软件部分。按照  bebop_autonomy 文档启动,唯一需要修改的是 bebbebop_driver/launch/bebop_nodelet.launch 下面的 drone_type  设置为  `bebop2` 然后可以使用ros命令操作bebop,发送 takeoff 指令后,bebop会起飞,并保持在一定高度(1m?)。我是到这个时候才知道获取odom的频率是5hz(图片为30hz)且并没有原始传感器数据输出。可能会对某些slam算法有影响(可能的解决方案 1.tx2的载版带imu 2.tx2的载版在外挂一个imu)?然后准备试试 ORB_SLAM2 的cuda版,(tx2在mode 0 下 6核cpu 性能居然比i7低压版差到不能接受的情况)。参考  ORB_SLAM2 cuda enhanced

robotics

xenomai3 (1)

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

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

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

实时闭环控制系统(四)

目的 在实现完了自己的控制器后,然后想通过ControllerManager去load自己的的控制器。发现按照自己取的名字,并不能load控制,于是仔细看了一下ros_control源码中,它去 load controller的流程。 流程 launch文件和命令行 根据官网的文档介绍 load或者其他操作一共有2个方法 1. Command-line tools 2. Creating launch files 然后,我找到了Command-line tools的源码(当然 launch文件的解析程序 也在它同目录下)然后这货在调用controller_manager(这应该是一个python包)里面的controller_manager_interface 的load_controller方法。 def load_controller(name): rospy.wait_for_service('controller_manager/load_controller') s = rospy.ServiceProxy(

trac-ik 的使用

安装 sudo apt install ros-kinetic-trac-ik(因为使用的是ubuntu 16.04) 一 大体上感觉和kdl库的使用方法差不多,所以可以先参考一下kdl库的用法,不过唯一感觉到神奇的是kdl的frame(就是用来描述座标系变换的矩阵),它说的从a到b的变换,实际是b在a座标系中的座标,和我之前学的相反。还有 KDL::JntArray这货虽然表现得像矩阵一样,不过它的colums一直为1,所以还是一个一维数组,求它的长度用rows()。 二 具体的使用见它的例子。大体的流程就是 1. 先读入urdf文件地址 2. 配置chain(即开始link与结束link) 3. 然后就可以进行正逆运动学解了 三 如果想通过trac-ik计算机器人的重心,可以参考这个代码。它程序的原理就是利用segment.pose(jnt_p)这个函数去配置机器人关节位置,然后segment.getInertia().getCOG()。(pose的源码显示,他会乘tip的变换矩阵)。当然为了让代码更简单,你可以使用像153行那样,取获取当前segment的里面关节名字,来给关节赋值。 四

搬砖记录(一)

我大概是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(阿诺尔德的常微分方程看着吃力)。下一步计划看看微分几何。。。 物理

实时闭环控制系统(三)

目的 在理解ros_controller的源码中。发现joint_trajectory_controller 中存在着一个类型为realtime_tools::RealtimeServerGoalHandle<control_msgs::FollowJointTrajectoryAction>的类型。感觉这个名字很神奇,因为从名字上面来说它是一个action的goal,goal是action server的主要管理对象(详细介绍见actionlibDetailedDescription)。然后增加了 Realtime的字样,所以准备详细看看它的实现。 过程 realtime_tools::RealtimeServerGoalHandle 代码地址 在它的代码里面发现一个名为 void runNonRealtime(const ros::TimerEvent &te)的函数,感觉这货在joint_trajectory_controller源码中看见过的。然后在joint_trajectory_controller_impl.h中发现了下列的程序: // Setup goal status checking timer

实时闭环控制系统(二)

目的 在实现自己的闭环ros_control的cotroller的中,我们需要在cotroller获取几个的具体的interface的数据,而在ros_control中controller的默认的init函数中已经变成具体的interface,所以需要去overrideinit的上一层函数initRequest的实现,从而达到自己的目标。 ros_controller中的资源管理 这个问题来源于对controller_interface::Controller的initRequest的观察。在它的120行~128行出现了相关的使用。 hw->clearClaims(); if (!init(hw, controller_nh) || !init(hw, root_nh, controller_nh)) { ROS_ERROR("Failed to initialize the controller"); return false; } hardware_interface::InterfaceResources iface_res(getHardwareInterfaceType(), hw->getClaims()); claimed_

实时闭环控制系统(一)

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这个作为ros_control最核心的部件,它主要的作用就是 1. 管理controller,包括load与switch等等 2. 建立hardware_interfac与controller的联系 3. 为controller的运行提供硬实时的环境 管理controller 主要提供了 controller 的 load unload start stop 。下面主要介绍一下它的流程。 初始化 controller_manager: