mirror of
https://github.com/elephantrobotics/mycobot_ros.git
synced 2026-07-05 19:47:04 +00:00
fix ros gripper display
This commit is contained in:
parent
8a5b5d55a0
commit
e9f5fb086a
4 changed files with 135 additions and 2 deletions
|
|
@ -32,6 +32,7 @@ catkin_install_python(PROGRAMS
|
||||||
scripts/simple_gui.py
|
scripts/simple_gui.py
|
||||||
scripts/follow_display_gripper.py
|
scripts/follow_display_gripper.py
|
||||||
scripts/slider_control_gripper.py
|
scripts/slider_control_gripper.py
|
||||||
|
scripts/listen_real_gripper.py
|
||||||
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,6 @@
|
||||||
<arg name="port" value="$(arg port)" />
|
<arg name="port" value="$(arg port)" />
|
||||||
<arg name="baud" value="$(arg baud)" />
|
<arg name="baud" value="$(arg baud)" />
|
||||||
</include>
|
</include>
|
||||||
<node name="real_listener" pkg="mycobot_280" type="listen_real.py" />
|
<node name="real_listener_gripper" pkg="mycobot_280" type="listen_real_gripper.py" />
|
||||||
<node name="simple_gui" pkg="mycobot_280" type="simple_gui.py" />
|
<node name="simple_gui" pkg="mycobot_280" type="simple_gui.py" />
|
||||||
</launch>
|
</launch>
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,5 @@
|
||||||
<arg name="baud" value="$(arg baud)" />
|
<arg name="baud" value="$(arg baud)" />
|
||||||
</include>
|
</include>
|
||||||
<!-- listen and pub the real angles ,监听并发布真实角度-->
|
<!-- listen and pub the real angles ,监听并发布真实角度-->
|
||||||
<node name="real_listener" pkg="mycobot_280" type="listen_real.py" />
|
<node name="real_listener_gripper" pkg="mycobot_280" type="listen_real_gripper.py" />
|
||||||
</launch>
|
</launch>
|
||||||
|
|
|
||||||
132
mycobot_280/mycobot_280/scripts/listen_real_gripper.py
Executable file
132
mycobot_280/mycobot_280/scripts/listen_real_gripper.py
Executable file
|
|
@ -0,0 +1,132 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# encoding:utf-8
|
||||||
|
# license removed for brevity
|
||||||
|
from distutils.log import error
|
||||||
|
import time
|
||||||
|
import math
|
||||||
|
import os
|
||||||
|
import fcntl
|
||||||
|
|
||||||
|
import rospy
|
||||||
|
from sensor_msgs.msg import JointState
|
||||||
|
from std_msgs.msg import Header
|
||||||
|
from mycobot_communication.srv import GetAngles
|
||||||
|
from pymycobot.mycobot import MyCobot
|
||||||
|
from rospy import ServiceException
|
||||||
|
|
||||||
|
mc = None
|
||||||
|
|
||||||
|
# Avoid serial port conflicts and need to be locked
|
||||||
|
def acquire(lock_file):
|
||||||
|
open_mode = os.O_RDWR | os.O_CREAT | os.O_TRUNC
|
||||||
|
fd = os.open(lock_file, open_mode)
|
||||||
|
|
||||||
|
pid = os.getpid()
|
||||||
|
lock_file_fd = None
|
||||||
|
|
||||||
|
timeout = 50.0
|
||||||
|
start_time = current_time = time.time()
|
||||||
|
while current_time < start_time + timeout:
|
||||||
|
try:
|
||||||
|
# The LOCK_EX means that only one process can hold the lock
|
||||||
|
# The LOCK_NB means that the fcntl.flock() is not blocking
|
||||||
|
# and we are able to implement termination of while loop,
|
||||||
|
# when timeout is reached.
|
||||||
|
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
||||||
|
except (IOError, OSError):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lock_file_fd = fd
|
||||||
|
break
|
||||||
|
|
||||||
|
# print('pid waiting for lock:%d'% pid)
|
||||||
|
|
||||||
|
|
||||||
|
time.sleep(1.0)
|
||||||
|
current_time = time.time()
|
||||||
|
if lock_file_fd is None:
|
||||||
|
os.close(fd)
|
||||||
|
return lock_file_fd
|
||||||
|
|
||||||
|
|
||||||
|
def release(lock_file_fd):
|
||||||
|
# Do not remove the lockfile:
|
||||||
|
fcntl.flock(lock_file_fd, fcntl.LOCK_UN)
|
||||||
|
os.close(lock_file_fd)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def talker():
|
||||||
|
rospy.loginfo("start ...")
|
||||||
|
|
||||||
|
rospy.init_node("real_listener_gripper", anonymous=True)
|
||||||
|
pub = rospy.Publisher("joint_states", JointState, queue_size=10)
|
||||||
|
port = rospy.get_param("~port", "/dev/ttyUSB0")
|
||||||
|
baud = rospy.get_param("~baud", 115200)
|
||||||
|
mc = MyCobot(port, baud)
|
||||||
|
rate = rospy.Rate(30) # 30hz
|
||||||
|
|
||||||
|
# pub joint state,发布关节状态
|
||||||
|
joint_state_send = JointState()
|
||||||
|
joint_state_send.header = Header()
|
||||||
|
|
||||||
|
joint_state_send.name = [
|
||||||
|
"joint2_to_joint1",
|
||||||
|
"joint3_to_joint2",
|
||||||
|
"joint4_to_joint3",
|
||||||
|
"joint5_to_joint4",
|
||||||
|
"joint6_to_joint5",
|
||||||
|
"joint6output_to_joint6",
|
||||||
|
"gripper_controller",
|
||||||
|
]
|
||||||
|
joint_state_send.velocity = [0]
|
||||||
|
joint_state_send.effort = []
|
||||||
|
|
||||||
|
# waiting util server `get_joint_angles` enable.等待'get_joint_angles'服务启用
|
||||||
|
rospy.loginfo("wait service")
|
||||||
|
rospy.wait_for_service("get_joint_angles")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
func = rospy.ServiceProxy("get_joint_angles", GetAngles)
|
||||||
|
break
|
||||||
|
except ServiceException as e:
|
||||||
|
# pass
|
||||||
|
# print(f'error:{e}')
|
||||||
|
print("--------------error",e)
|
||||||
|
|
||||||
|
rospy.loginfo("start loop ...")
|
||||||
|
while not rospy.is_shutdown():
|
||||||
|
# get real angles from server.从服务器获得真实的角度。
|
||||||
|
res = func()
|
||||||
|
if res.joint_1 == res.joint_2 == res.joint_3 == 0.0:
|
||||||
|
continue
|
||||||
|
if mc:
|
||||||
|
lock = acquire("/tmp/mycobot_lock")
|
||||||
|
gripper_value = mc.get_gripper_value()
|
||||||
|
release(lock)
|
||||||
|
if gripper_value != -1:
|
||||||
|
gripper_value = -0.78 + round(gripper_value / 117.0, 2)
|
||||||
|
# print(gripper_value)
|
||||||
|
radians_list = [
|
||||||
|
res.joint_1 * (math.pi / 180),
|
||||||
|
res.joint_2 * (math.pi / 180),
|
||||||
|
res.joint_3 * (math.pi / 180),
|
||||||
|
res.joint_4 * (math.pi / 180),
|
||||||
|
res.joint_5 * (math.pi / 180),
|
||||||
|
res.joint_6 * (math.pi / 180),
|
||||||
|
]
|
||||||
|
radians_list.append(gripper_value)
|
||||||
|
rospy.loginfo("res: {}".format(radians_list))
|
||||||
|
|
||||||
|
# publish angles.发布角度
|
||||||
|
joint_state_send.header.stamp = rospy.Time.now()
|
||||||
|
joint_state_send.position = radians_list
|
||||||
|
pub.publish(joint_state_send)
|
||||||
|
rate.sleep()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
talker()
|
||||||
|
except rospy.ROSInterruptException:
|
||||||
|
pass
|
||||||
Loading…
Add table
Reference in a new issue