carm 0.0.20250815__py3-none-any.whl → 0.0.20250822__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
carm/carm.py CHANGED
@@ -23,7 +23,7 @@ class Carm:
23
23
  self.res_pool = {}
24
24
  self.task_pool = {}
25
25
 
26
- self.reader = threading.Thread(target=self.recv_loop).start()
26
+ self.reader = threading.Thread(target=self.recv_loop, daemon=True).start()
27
27
  self.open_ready = threading.Event()
28
28
  self.open_ready.wait()
29
29
  self.limit = self.get_limits()["params"]
@@ -207,6 +207,20 @@ class Carm:
207
207
  self.wait_task(res["task_key"])
208
208
 
209
209
  return res
210
+
211
+
212
+ def move_line(self, pos, speed=50, sync=True, user=0, tool=0):
213
+ res = self.request({"command":"webRecieveTasks",
214
+ "task_id":"TASK_MOVL",
215
+ "task_level":"Task_General",
216
+ "arm_index":0,
217
+ "point_type":{"space":1},
218
+ "data":{"user":user,"tool":tool, "target_pos": pos, "speed":speed}})
219
+
220
+ if sync and res["recv"]=="Task_Recieve":
221
+ self.wait_task(res["task_key"])
222
+
223
+ return res
210
224
 
211
225
  def wait_task(self, task_key):
212
226
  event = threading.Event()
carm/carm_dds.py ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/python3
2
+ import time
3
+ import os
4
+ import argparse
5
+ import svar
6
+ import numpy as np
7
+ import carm
8
+
9
+ messenger = svar.load("svar_messenger").messenger
10
+
11
+ class ArmDriver:
12
+ def __init__(self,args):
13
+ self.args = args
14
+
15
+ self.arm = carm.Carm(args.addr)
16
+ if args.mit:
17
+ self.arm.set_control_mode(3)
18
+ else:
19
+ self.arm.set_control_mode(1)
20
+
21
+ self.pub_joint = messenger.advertise(args.joint_topic, 0)
22
+ self.pub_end = messenger.advertise(args.end_topic, 0)
23
+
24
+ self.sub_joint = messenger.subscribe(args.joint_cmd_topic, 0, lambda msg:self.joint_callback(msg))
25
+ self.sub_end = messenger.subscribe(args.end_cmd_topic, 0, lambda msg:self.end_callback(msg))
26
+
27
+ def end_callback(self, msg):
28
+ position = np.frombuffer(msg["position"],dtype=np.float64).tolist()
29
+ self.arm.track_pose(position)
30
+
31
+ def joint_callback(self, msg):
32
+ position = np.frombuffer(msg["position"],dtype=np.float64).tolist()
33
+ self.arm.track_joint(position)
34
+
35
+ def loop(self):
36
+ while True:
37
+ stamp = time.time()
38
+ sec = int(stamp )
39
+ nanosec = int((stamp - sec) * 1e9)
40
+ header = {"stamp": {"sec": sec, "nanosec": nanosec},"frame_id": "base_link"}
41
+
42
+ end_msg = {"header": header, "position": self.arm.cart_pose + [self.arm.gripper_state["gripper_pos"],]}
43
+ joints_msg = {"header": header, "position": self.arm.joint_pos + [self.arm.gripper_state["gripper_pos"],]}
44
+
45
+ self.pub_joint.publish(joints_msg)
46
+ self.pub_end.publish(end_msg)
47
+
48
+ time.sleep(0.005)
49
+
50
+ def send_cmd(args):
51
+ arm = carm.Carm(args.addr)
52
+
53
+ cmd = args.cmd
54
+
55
+ if cmd == "disable":
56
+ arm.set_servo_enable(False)
57
+ if cmd == "remote":
58
+ arm.set_control_mode(3)
59
+
60
+ def driver_main(args):
61
+ print("Starting driver mode...")
62
+
63
+ driver = ArmDriver(args)
64
+
65
+ ros2 = svar.load(args.dds)
66
+ transfer = ros2.Transfer({"node": "carm_driver" + args.device,
67
+ "publishers":[[args.joint_topic, "sensor_msgs/msg/JointState",10],
68
+ [args.end_topic, "sensor_msgs/msg/JointState",10],
69
+ ],
70
+ "subscriptions":[[args.joint_cmd_topic, "sensor_msgs/msg/JointState",10],
71
+ [args.end_cmd_topic, "sensor_msgs/msg/JointState",10]]})
72
+
73
+ driver.loop()
74
+
75
+ def main():
76
+ parser = argparse.ArgumentParser()
77
+ parser.add_argument("--addr", type=str, default="ws://localhost:8090", help="Device address, including ip and port")
78
+ parser.add_argument("--cmd", type=str, default="", help="Send command instead of start driver, support enable,disable,remote")
79
+ parser.add_argument("--device", type=str, default="carm", help="device name, used as topic prefix")
80
+ parser.add_argument("--dds", type=str, default="svar_messenger_ros2", help="the dds plugin, default is ros2, options: svar_zbus, svar_lcm")
81
+ parser.add_argument("--mit", action="store_true", help="Enable mit mode")
82
+ parser.add_argument("--joint_topic", type=str, default="", help="the joints status topic")
83
+ parser.add_argument("--end_topic", type=str, default="", help="the joints status topic")
84
+ parser.add_argument("--joint_cmd_topic", type=str, default="", help="the joints cmd topic")
85
+ parser.add_argument("--end_cmd_topic", type=str, default="", help="the end cmd topic")
86
+
87
+ args = parser.parse_args()
88
+
89
+ if args.joint_topic == "":
90
+ args.joint_topic = "/"+args.device + "/joints"
91
+ if args.end_topic == "":
92
+ args.end_topic = "/"+args.device + "/end"
93
+ if args.joint_cmd_topic == "":
94
+ args.joint_cmd_topic = "/"+args.device + "/joints_cmd"
95
+ if args.end_cmd_topic == "":
96
+ args.end_cmd_topic = "/"+args.device + "/end_cmd"
97
+
98
+ if args.cmd == "":
99
+ driver_main(args)
100
+ else:
101
+ send_cmd(args)
102
+
103
+
104
+ # 测试代码
105
+ if __name__ == "__main__":
106
+ main()
107
+
108
+
carm/carm_ros2.py ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/python3
2
+ import rclpy
3
+ from rclpy.node import Node
4
+ import time
5
+ import argparse
6
+
7
+ from std_msgs.msg import String, Bool, Int16MultiArray, MultiArrayLayout, MultiArrayDimension, Int8
8
+ from geometry_msgs.msg import Point, Pose, PoseArray
9
+ from sensor_msgs.msg import JointState
10
+ from example_interfaces.srv import AddTwoInts
11
+ import carm
12
+ import threading
13
+ import numpy as np
14
+
15
+ class ArmDriver(Node):
16
+ def __init__(self,args):
17
+ super().__init__('carm_'+args.device)
18
+ self.args = args
19
+
20
+ self.arm = carm.Carm(args.addr)
21
+ if args.mit:
22
+ self.arm.set_control_mode(2)
23
+ else:
24
+ self.arm.set_control_mode(1)
25
+
26
+
27
+ print("version:",self.arm.version)
28
+ print("limits:", self.arm.limit)
29
+ print("state:", self.arm.state)
30
+
31
+ self.pub_joint = self.create_publisher(JointState, args.joint_topic, 10)
32
+ self.pub_end = self.create_publisher(JointState, args.end_topic, 10)
33
+
34
+ self.sub_joint = self.create_subscription(JointState, args.joint_cmd_topic, self.joint_callback, 10)
35
+ self.sub_end = self.create_subscription(JointState, args.end_cmd_topic, self.end_callback, 10)
36
+
37
+ self.worker = threading.Thread(target=self.loop).start()
38
+
39
+ def end_callback(self, msg):
40
+ self.arm.track_pose(list(msg.position))
41
+
42
+ def joint_callback(self, msg):
43
+ self.arm.track_joint(list(msg.position))
44
+
45
+ def loop(self):
46
+ while True:
47
+ joint_msg = JointState() # list of string
48
+ joint_msg.header.stamp = self.get_clock().now().to_msg()
49
+ joint_msg.position = self.arm.joint_pos
50
+ joint_msg.velocity = self.arm.joint_vel
51
+ joint_msg.effort = self.arm.joint_tau
52
+ joint_msg.position.append(self.arm.gripper_state["gripper_pos"])
53
+ self.pub_joint.publish(joint_msg)
54
+
55
+
56
+ end_msg = JointState() # list of string
57
+ end_msg.header.stamp = self.get_clock().now().to_msg()
58
+ end_msg.position = np.array(self.arm.cart_pose).tolist()
59
+ end_msg.position.append(self.arm.gripper_state["gripper_pos"])
60
+ self.pub_end.publish(end_msg)
61
+
62
+ time.sleep(0.005)
63
+
64
+ def main():
65
+ parser = argparse.ArgumentParser()
66
+ parser.add_argument("--addr", type=str, default="ws://localhost:8090", help="Device address, including ip and port")
67
+ parser.add_argument("--device", type=str, default="carm", help="device name, used as topic prefix")
68
+ parser.add_argument("--dds", type=str, default="svar_messenger_ros2", help="the dds plugin, default is ros2, options: svar_zbus, svar_lcm")
69
+ parser.add_argument("--mit", action="store_true", help="Enable mit mode")
70
+ parser.add_argument("--joint_topic", type=str, default="", help="the joints status topic")
71
+ parser.add_argument("--end_topic", type=str, default="", help="the joints status topic")
72
+ parser.add_argument("--joint_cmd_topic", type=str, default="", help="the joints cmd topic")
73
+ parser.add_argument("--end_cmd_topic", type=str, default="", help="the end cmd topic")
74
+
75
+ args = parser.parse_args()
76
+
77
+ if args.joint_topic == "":
78
+ args.joint_topic = "/"+args.device + "/joints"
79
+ if args.end_topic == "":
80
+ args.end_topic = "/"+args.device + "/end"
81
+ if args.joint_cmd_topic == "":
82
+ args.joint_cmd_topic = "/"+args.device + "/joints_cmd"
83
+ if args.end_cmd_topic == "":
84
+ args.end_cmd_topic = "/"+args.device + "/end_cmd"
85
+
86
+
87
+ rclpy.init(args=None)
88
+ node = ArmDriver(args)
89
+ rclpy.spin(node)
90
+ node.destroy_node()
91
+ rclpy.shutdown()
92
+
93
+ # 测试代码
94
+ if __name__ == "__main__":
95
+ main()
96
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: carm
3
- Version: 0.0.20250815
3
+ Version: 0.0.20250822
4
4
  Summary: Python interface for cvte arm.
5
5
  Author-email: Yong Zhao <zhaoyong11933@cvte.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -0,0 +1,9 @@
1
+ carm/__init__.py,sha256=lfNjXYpO8FjQVunCqiaUzjsNUnyuhcyO8Je0ixh1RJY,24
2
+ carm/carm.py,sha256=8PaBSryLOW9RPzz8o5KUqHiGdPONGiw9HuCJvdWMQgg,10978
3
+ carm/carm_dds.py,sha256=1LTwExF3fuRfjI_Ev8P5TVrv62mxiFRwPdEmeyySbM8,4107
4
+ carm/carm_ros2.py,sha256=IxQD4pglxCH2Vbfj6mm2DlV8KgkqMnS0k1-mIICV8I8,3709
5
+ carm-0.0.20250822.dist-info/METADATA,sha256=RhO7IwJGvpxCOhaOrqDCcSyPYFpnPms2KHqlLqHAJSo,389
6
+ carm-0.0.20250822.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
7
+ carm-0.0.20250822.dist-info/entry_points.txt,sha256=qsJWC39p-s4UO3KZ8BfV2hikeMX693mahkYbR3w67Lk,76
8
+ carm-0.0.20250822.dist-info/top_level.txt,sha256=nZ1bTssUAnAqc2CMka3erGx_2LsdZrSkqtjNf9Ce_d8,5
9
+ carm-0.0.20250822.dist-info/RECORD,,
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ carm = carm.carm_dds:main
3
+ carm_ros2 = carm.carm_ros2:main
@@ -1,7 +0,0 @@
1
- carm/__init__.py,sha256=lfNjXYpO8FjQVunCqiaUzjsNUnyuhcyO8Je0ixh1RJY,24
2
- carm/carm.py,sha256=cx04M6b5XyQpB8Xw-9sycwmoE4fKi3tBqGjmCmtABAc,10404
3
- carm-0.0.20250815.dist-info/METADATA,sha256=wZxNVuffF6HYb3_Qm7giI5qpBFU14luJ1XE0XLMddOw,389
4
- carm-0.0.20250815.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
5
- carm-0.0.20250815.dist-info/entry_points.txt,sha256=N8dt2p7PK_49n8YkzKy8tymcvKS7JEH9Ob6i093vEUg,62
6
- carm-0.0.20250815.dist-info/top_level.txt,sha256=nZ1bTssUAnAqc2CMka3erGx_2LsdZrSkqtjNf9Ce_d8,5
7
- carm-0.0.20250815.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- carm = carm:main
3
- carm_ros2 = carm:ros2_main