Mac M1 conda配置的ROS noetic,使用源码安装的arbotix
使用arbotix_gui命令出现断言错误assert len(args) == 2 + self.expectedIDs,
解决方案:
找到并打开报错位置的arbotix_gui文件(我的是在自己源码安装arbotix所在的工作空间内),
根据上面的警告内容修改相应的代码
一、解决思路
1. 警告:Use :class:`App` instead
这个警告的意思是:正在使用已弃用的类PySimpleApp。改为使用:App类
图中红线标注的是报错的文件和出错行数,使用gedit编辑器打开arbotix_gui文件,根据自己电脑实际报错位置修改下面代码路径
sudo gedit ~/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_gui
使用快捷键ctrl + F (macos系统为command + F)搜索蓝色下划线的 wx.StaticLine 或者根据红线指示的报错行73,找到相应代码,
app = wx.PySimpleApp()
将wx.StaticLine函数中的width/2修改为int(width/2)即可
app = wx.App()
2. 警告:an integer is required
这个警告的意思是:使用了一个浮点数,而该处实际上需要一个整数。隐式地将浮点数转换为整数使用 __int__
在 Python 中已被弃用,并且在将来的 Python 版本中可能会被移除。
也就是width/2是浮点数,需要把它强制转换为int整数类型
图中红线标注的是报错的文件和出错行数,使用gedit编辑器打开arbotix_gui文件,根据自己电脑实际报错位置修改下面代码路径
sudo gedit ~/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_gui
使用快捷键ctrl + F (macos系统为command + F)搜索蓝色下划线的 wx.StaticLine 或者根据红线指示的报错行73,找到相应代码,
wx.StaticLine(self.movebase, -1, (width/2, 0), (1,width), style=wx.LI_VERTICAL)
将wx.StaticLine函数中的width/2修改为int(width/2)即可
wx.StaticLine(self.movebase, -1, (int(width/2), 0), (1,width), style=wx.LI_VERTICAL)
3. 警告:wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead
这个警告的意思是:在代码中使用了 wxPython 中已被弃用的 __call__
方法,建议使用新的方法 EvtHandler.Bind
来替代。
图中红线标注的是报错的文件和出错行数,使用gedit编辑器打开arbotix_gui文件,根据自己电脑实际报错位置修改下面代码路径
sudo gedit ~/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_gui
使用快捷键ctrl + F (macos系统为command + F)搜索蓝色下划线的 wx.EVT_CLOSE(self, self.onClose) 或者根据红线指示的报错行125,找到相应代码,
wx.EVT_CLOSE(self, self.onClose)
将其修改为
self.Bind(wx.EVT_CLOSE, self.onClose)
4. 错误:No module named 'serial'
在当前conda环境下,使用pip安装pyserial库(直接安装serial错误更多)
pip install pyserial
二、解决内容:
图中红线标注的是报错的文件和出错行数,使用gedit编辑器打开出错的arbotix_gui文件,根据自己电脑实际报错位置修改下面代码路径
sudo gedit ~/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_gui
把203行的app = wx.PySimpleApp()修改为app = wx.App()
app = wx.App()
把73、74行的wx.StaticLine函数中的width/2强制转换为int类型(注意缩进)
wx.StaticLine(self.movebase, -1, (int(width/2), 0), (1,width), style=wx.LI_VERTICAL)
wx.StaticLine(self.movebase, -1, (0, int(width/2)), (width,1))
把164、165行的dc.DrawLine函数中的width/2强制转换为int类型(注意缩进)
dc.DrawLine(int(width/2), 0, int(width/2), width)
dc.DrawLine(0, int(width/2), width, int(width/2))
在169行的dc.DrawCircle函数中的(width/2)强制前面添加int(注意缩进)
dc.DrawCircle(int(width/2) + self.X*int(width/2), int(width/2) - self.Y*int(width/2), 5)
修改125 ~ 129行的代码(注意缩进)
#用以参考的原代码,不要复制这几行
wx.EVT_CLOSE(self, self.onClose)
wx.EVT_TIMER(self, self.TIMER_ID, self.onTimer)
# bind the panel to the paint event
wx.EVT_PAINT(self, self.onPaint)
self.Bind(wx.EVT_CLOSE, self.onClose)
self.Bind(wx.EVT_TIMER, self.onTimer, id=self.TIMER_ID)
# bind the panel to the paint event
self.Bind(wx.EVT_PAINT, self.onPaint)
安装 pyserial 库(直接安装 serial 会有很多错误)
pip install pyserial
三、解决效果
保存并退出arbotix_gui文件后,重新输入arbotix_gui指令,发现可以打开Arbotix Controller Gui 窗口,问题解决。
roscore # 使用arbotix前要打开roscore
arbotix_gui