小米CyberDog铁蛋二次开发(一) |
您所在的位置:网站首页 › 小米生成bug日志 › 小米CyberDog铁蛋二次开发(一) |
小米CyberDog铁蛋二次开发(一)---接入手柄进行控制
蒋程扬
分类:ROS
个人专栏:小米机器狗Cyberdog二次开发 发布时间 2021.10.18阅读数 6366 评论数 3
目前观察到cyberdog项目的更新进度是每周五合入并上传代码到github,在10月1之前并没有什么大的更新,在本周五(2021/10/15)合入了大改动的commit,其中主要就是cyberdog_remote功能包,这个功能包使得铁蛋可以使用手柄进行控制。 在前面的测评文章中说到小米官方在APP中是提供了手柄接入的功能,但是估计是会出一款官方手柄进行主要支持,其实在铁蛋中就已经存在一个名为joy_node的二进制文件,但是只是没公开代码,当时我也试着运行了该节点,该节点会成功连接到手柄并发布一个joy的话题,监听话题可以查看到手柄响应时的数据变化。熟悉ROS的小伙伴可能知道其实在ROS中是存在手柄驱动功能包: http://wiki.ros.org/joystick_drivers 小米这里应该也是根据ros的joystick_drivers进行更改的,本来是想准备自己基于joystick_driver开发个功能包,但是发现了这个joy_node的二进制文件后,猜测官方应该也会进行个适配,所以就等了一波,这不,就等到了。 本篇文章主要介绍手柄接入以及手柄重映射的教程,并且目前发现开源代码中是有bug的,文章也会介绍如何去更改,但是后期小米官方肯定会进行修复,因此本篇文章不是一篇持久性的教程。这里仅做尝鲜使用 内容列表 一,代码编译 二,运行joy节点 1.合并覆盖~/ros_app/install/share路径与/opt/ros2/cyberdog/share路径 2.合并覆盖~/ros_app/install/include路径与/opt/ros2/cyberdog/include路径 3.合并覆盖~/ros_app/install/lib路径与/opt/ros2/cyberdog/lib路径 4.运行节点 三,连接手柄并测试 四,重映射手柄按键: 五,修改控制话题: 六,配置节点自启动: 一,代码编译代码编译目前还是在铁蛋本体环境上直接进行编译,在测评中也介绍到了大概编译的过程,这里再次进行简单的介绍 克隆代码,拉取最新代码,这里就不作讲解,项目地址: https://github.com/MiRoboticsLab/cyberdog_ros2 这里我将代码放在了~/ros_app目录下,编译项目,并安装到/opt/ros/cyberdog目录下: colcon build --merge-install --install-base /opt/ros2/cyberdog前面讲到需要加sudo,不然会有权限问题,但是加sudo后会导致后面的环境变量失效,因此在colcon build之前需要更改下/opt/ros/cyberdog的权限,我这里是直接修改为777: sudo chmod -R 777 /opt/ros2/cyberdog如果感觉改为777权限不太稳妥,也可以修改所属组为mi sudo chown -R mi:mi /opt/ros2/cyberdog执行成功,重启铁蛋: 编译成功标识: 二,运行joy节点运行节点之前得先知道节点名称,我们查看启动文件,在cyberdog_bringup/lc_bringup_launch.py发现了启动的node: 则运行节点的命令为: ros2 run cyberdog_joy joy_node但是运行后会发现报包名不存在的错误,这是由于虽然在编译时--install-base /opt/ros2/cyberdog但是可能是官方没有将新的节点相关的包的install规则拷贝过去(我猜的/狗头 由于我目前也还没搞清楚这个--install-base 的原理)所以这里我就手动将相关文件拷贝到/opt/ros2/cyberdog目录: 1.合并覆盖~/ros_app/install/share路径与/opt/ros2/cyberdog/share路径这里我们需要将~/ros_app/install/share下编译生成的文件与/opt/ros2/cyberdog/share路径进行合并(不能直接覆盖,保证相同的文件更新为编译后的,编译出来不存在的文件不被删除),这里最好进入远程桌面,进行覆盖粘贴: 2.合并覆盖~/ros_app/install/include路径与/opt/ros2/cyberdog/include路径和上步相同,这里就不进行演示,均需要保证相同的文件更新为编译后的,编译出来不存在的文件不被删除 3.合并覆盖~/ros_app/install/lib路径与/opt/ros2/cyberdog/lib路径和上步相同,这里就不进行演示,均需要保证相同的文件更新为编译后的,编译出来不存在的文件不被删除 4.运行节点新打开终端,运行节点: ros2 run cyberdog_joy joy_node不出意外就成功运行了: 三,连接手柄并测试连接手柄这一步,理论上只要是Ubuntu可以将手柄识别为输入设备的手柄均可进行连接控制,部分手柄在已配对其他设备情况下,电脑不能搜索到手柄的蓝牙,因此需要进行重置,这里我使用的手柄为Xbox One S,重置的方法是长按充电口旁的按钮直至闪烁: 进入铁蛋远程桌面,添加蓝牙设备: 搜索找到自己的手柄点击next: 然后选择作为输入设备: 点击next,提示连接成功即可 测试手柄,如何测试自己的手柄是否有驱动,安装如下软件: sudo apt-get install jstest-gtk安装成功后终端运行: jstest-gtk发现已经识别到手柄了,双击进入: 依次按下手柄的所有按钮,查看软件是否有响应,如果驱动正常,不同的按钮会响应不同的ID: 四,重映射手柄按键:我的配置文件已经上传到github(Xbox One S),有和我手柄一样的就可以直接下载放到/opt/ros2/cyberdog/share/cyberdog_joy/params/joys/使用了,不需要再重映射: https://github.com/chengyangkj/cyberdog_ros2/blob/devel/cyberdog_interaction/cyberdog_remote/cyberdog_joy/params/joys/Xbox_One_S_Controller.toml由于不同手柄对应系统驱动的不同ID,因此这里我们需要进行重映射,在官方README也有说明: https://github.com/MiRoboticsLab/cyberdog_ros2/tree/devel/cyberdog_interaction/cyberdog_remote 运行cyberdog_joy节点,可以发现joy节点已经识别到手柄: 长按XYAB按钮,进入重映射模式: 按照官方README提示,依次进行重映射,但是这里就有问题了,我发现官方的重映射程序有点问题(可能是我手柄的问题),再按完第一个按键后程序检测到手柄某一轴没有归位,导致不能往下进行,所有这里我将这几行代码注释掉就好了: 还有个问题是如果不小心按了一个按钮两下或者推摇杆时,会导致直接跳到下个步骤,这里我加了个10s延迟,当按下一个按钮时10s后在重映射下个按钮: 修改之后编译: colcon build --merge-install --install-base /opt/ros2/cyberdog编译完成后拷贝lib: cp ~/ros_apps/install/lib/libcyberdog_joy.so /opt/ros2/cyberdog/lib/再次启动节点: ros2 run cyberdog_joy joy_node依次重映射每个按键,保证每个按键都执行完成时重映射结束,此时才说明重映射没有问题: 重映射完成后会自动以自己的手柄为名称将配置存放在以下位置: /opt/ros2/cyberdog/share/cyberdog_joy/params/joys其实也没有这么麻烦非要使用重映射模式,其实直接编辑 /opt/ros2/cyberdog/share/cyberdog_joy/params/joys/Default.toml这个文件,将手柄中的一些ID改为自己实际的ID即可,但是小米官方目前并没有说明配置文件的说明,我自己也去看了下配置文件,结合着代码可以大概理解其中的意思,但是没有协议配置起来还是非常麻烦,所以最后还是通过去调用程序实现 我的配置文件已经上传到github(Xbox One S),有和我手柄一样的就可以直接下载放到/opt/ros2/cyberdog/share/cyberdog_joy/params/joys/使用了,不需要再重映射: https://github.com/chengyangkj/cyberdog_ros2/blob/devel/cyberdog_interaction/cyberdog_remote/cyberdog_joy/params/joys/Xbox_One_S_Controller.toml 五,修改控制话题:目前还存在的一个bug就是joy节点发布的话题为“body_cmd”,但是实际上铁蛋所使用的话题都是带命名空间的,如果使用“body_cmd”进行发布,是不会监听到该话题,因此代码中也需要进行修改,我这里直接修改成了我自己的命名空间: 查看命名空间: ros2 topic list我这里命名空间前缀为mi1026487: 修改如下位置的话题: 再次进行编译,复制即可 六,配置节点自启动:上面我们发现手柄节点已经被放到launch_node中了,但是实际发现手柄节点并没有进行自启动,查看自启服务配置文件: vi /etc/systemd/system/cyberdog_ros2.service发现目前铁蛋使用的是athena_bringup的功能包下的bringup: 但是目前git仓库中并不存在此athena_bringup功能包,可能是之前早期的功能包?或者是生产版本和开发版本的bringup文件不一样 ?这里就先不做深究,我们就在node中加上即可: vi /opt/ros2/cyberdog/share/athena_bringup/params/launch_nodes.yaml这里我们就将这两个改为如下: - cyberdog_joy: package: "cyberdog_joy" executable: "joy_node" name: "cyberdog_joy"保存并退出 重启铁蛋或者重启电脑即可生效 这里测试手柄接入后,可以完美脱离手机控制,在铁蛋上电后,无需手机直接通过手柄控制站起姿态切换等 测试视频: cyberdog机器狗原创文章作者:蒋程扬。如若转载,请注明出处:古月居 http://admin.guyuehome.com/35613 打赏 0 点赞 2 收藏 3 分享 微信 微博 QQ 图片 上一篇:小米CyberDog铁蛋测评 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |