目前观察到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的,文章也会介绍如何去更改,但是后期小米官方肯定会进行修复,因此本篇文章不是一篇持久性的教程。这里仅做尝鲜使用

一,代码编译

代码编译目前还是在铁蛋本体环境上直接进行编译,在测评中也介绍到了大概编译的过程,这里再次进行简单的介绍

克隆代码,拉取最新代码,这里就不作讲解,项目地址:

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"

保存并退出

重启铁蛋或者重启电脑即可生效

 这里测试手柄接入后,可以完美脱离手机控制,在铁蛋上电后,无需手机直接通过手柄控制站起姿态切换等

测试视频: