جارٍ تحميل الدرس...
في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
معمل الروبوتات - المعمل 04
بناء عقدة (node) مخصصة للتحكم في السرعة
Teleop)؟Teleoperation)ضغطة مفتاح
عقدة ROS
رسالة Twist
/cmd_vel
تحرك الروبوت في Gazebo
nodes في ROSwarehouse_simulation| المفتاح | التأثير |
|---|---|
w | زيادة السرعة الأمامية +0.1 m/s لكل ضغطة |
x | زيادة السرعة الخلفية -0.1 m/s لكل ضغطة |
a | زيادة الدوران يسارا +0.2 rad/s لكل ضغطة |
d | زيادة الدوران يمينا -0.2 rad/s لكل ضغطة |
s | توقف: تصفير كل السرعات |
SPACE | إيقاف طارئ، نفس تأثير s |
q | الخروج من البرنامج |
1.0 m/s، وأقصى سرعة زاوية 2.0 rad/sclass TeleopKeyNode(Node):
def __init__(self):
super().__init__('teleop_key')
self.publisher = self.create_publisher(Twist, '/cmd_vel', 10)
self.linear_velocity = 0.0
self.angular_velocity = 0.0
self.linear_step = 0.1
self.angular_step = 0.2
self.max_linear = 1.0
self.max_angular = 2.0TeleopKeyNode من الصنف Node وتنشئ publisher لرسائل Twist.publisher لرسائل Twist على topic باسم /cmd_vellinear_step وangular_step تحدد مقدار الزيادة لكل ضغطة، وmax_linear/max_angular تحددان الحد الأقصىRaw Mode) لالتقاط ضغطة مفتاح واحدة، دون الحاجة لضغط Enterfinallydef get_key(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return chClamping)def update_velocity(self, linear_change, angular_change):
self.linear_velocity += linear_change
self.angular_velocity += angular_change
self.linear_velocity = max(-self.max_linear,
min(self.max_linear, self.linear_velocity))
self.angular_velocity = max(-self.max_angular,
min(self.max_angular, self.angular_velocity))Clamping) السرعات الخطيرة أو الجامحة الناتجة عن الضغط المتكرر على المفاتيحTwistdef publish_velocity(self):
msg = Twist()
msg.linear.x = self.linear_velocity
msg.angular.z = self.angular_velocity
self.publisher.publish(msg)linear.x (أمام/خلف) وangular.z (الانعطاف)، دون حركة y/z أو roll/pitchs أو SPACE كلا السرعتين فوراfinally الروبوت دائما قبل خروج العقدةelif key == 's' or key == ' ':
self.linear_velocity = 0.0
self.angular_velocity = 0.0
self.publish_velocity()chmod +xsetup.py ضمن entry_pointscolcon build ثم فعل البيئة بـ sourcechmod +x warehouse_simulation/teleop_key.pyentry_points={
'console_scripts': [
'teleop_key = warehouse_simulation.teleop_key:main',
],
},colcon build --packages-select warehouse_simulation
source install/setup.bashteleopros2 launch warehouse_simulation warehouse_simulation.launch.py
ros2 run warehouse_simulation teleop_keyw 3 مرات: تسريع للأمامa مرتين: انعطاف يسارs: توقفx مرتين: رجوع للخلفd 3 مرات: انعطاف يمينSPACE: إيقاف طارئq: خروجros2 topic echo /cmd_vel
ros2 node list
ros2 node info /teleop_key
ros2 run rqt_graph rqt_graph/teleop_key
/cmd_vel
/parameter_bridge
Gazebo
| المشكلة | الحل |
|---|---|
Inappropriate ioctl for device | شغل teleop في طرفية تفاعلية حقيقية، وليس داخل بيئة تطوير (IDE) أو مشغل سكربتات |
| الروبوت يتحرك من تلقاء نفسه | عقدة أخرى تنشر أيضا على /cmd_vel؛ أوقفها |
| المفاتيح لا تستجيب | يجب أن تكون نافذة الطرفية التي تشغل teleop_key هي النافذة النشطة |
ros2 run teleop_twist_keyboard teleop_twist_keyboard (بتخطيط i/j/k/l)Gamepad): joy_node مع teleop_twist_joyOdometry)، تحذيرات تصادم من مسح الليزرTeleop = ضغطة مفتاح ← رسالة Twist ← /cmd_vel ← حركة الروبوتlinear.x وangular.z في رسالة TwistEnterros2 topic echo وros2 node info وrqt_graph قبل الوثوق بالسلوك/cmd_vel هو السبب الأكثر شيوعا لسلوك الروبوت الغريبMahmoud Abas|معمل 04: التحكم عن بعد بلوحة المفاتيح لروبوت المستودع