diff --git a/robomaster_pi/connection.py b/robomaster_pi/connection.py new file mode 100644 index 0000000000000000000000000000000000000000..8c76cab32dc9cf70604fdba133a0e15e0c803ce9 --- /dev/null +++ b/robomaster_pi/connection.py @@ -0,0 +1,89 @@ +import robomaster +from robomaster import robot +import math +import time +import numpy as np +import rclpy +from rclpy.node import Node +from tf2_ros import TransformBroadcaster +from geometry_msgs.msg import TransformStamped +from geometry_msgs.msg import Twist +from tf2_ros import TransformBroadcaster + + +from rclpy.node import Node + + +from rclpy.node import Node +x, y, z = 0, 0, 0 + + +def quaternion_from_euler(ai, aj, ak): + ai /= 2.0 + aj /= 2.0 + ak /= 2.0 + ci = math.cos(ai) + si = math.sin(ai) + cj = math.cos(aj) + sj = math.sin(aj) + ck = math.cos(ak) + sk = math.sin(ak) + cc = ci*ck + cs = ci*sk + sc = si*ck + ss = si*sk + + q = np.empty((4, )) + q[0] = cj*sc - sj*cs + q[1] = cj*ss + sj*cc + q[2] = cj*cs - sj*sc + q[3] = cj*cc + sj*ss + + return q + +def sub_position_handler(position_info): + tf_broadcaster = TransformBroadcaster() + t = TransformStamped() + t.header.stamp = time.get_clock().now().to_msg() + t.header.frame_id = 'odom' + t.child_frame_id = "base_footprint" + t.transform.translation.x = position_info.x + t.transform.translation.y = -position_info.y + t.transform.translation.z = 0.0 + q = quaternion_from_euler(0, 0, -position_info.z* math.pi/180) + t.transform.rotation.x = q[0] + t.transform.rotation.y = q[1] + t.transform.rotation.z = q[2] + t.transform.rotation.w = q[3] + tf_broadcaster.sendTransform(t) + + +class vel_from_ros_node(Node): + + def __init__(self): + super().__init__("vel_from_ros") + self.get_vel_from_ros_ = self.create_subscription( + Twist, "/cmd_vel", self.pose_callback, 10) + + def pose_callback(self, msg: Twist): + + if(msg.angular.z == 0.0 and msg.linear.x == 0.0 and msg.linear.y == 0.0): + ep_chassis.drive_speed(x = 0, y = 0, z = 0.5) + else: + ep_chassis.drive_speed(x = msg.linear.x, y = msg.linear.y, z = msg.angular.z) + + +if __name__ == '__main__': + ep_robot = robot.Robot() + ep_robot.initialize(conn_type="rndis") + + ep_chassis = ep_robot.chassis + #ep_chassis.sub_position(freq=10, callback=sub_position_handler) + + rclpy.init() + node = vel_from_ros_node() + rclpy.spin(node) + rclpy.shutdown() + + ep_robot.close() + \ No newline at end of file diff --git a/robomaster_pi/robot_ros_odom_wifi.py b/robomaster_pi/robot_ros_odom_wifi.py deleted file mode 100644 index 45db68205ae608adf01f7d313a6f5bc7558fc0c4..0000000000000000000000000000000000000000 --- a/robomaster_pi/robot_ros_odom_wifi.py +++ /dev/null @@ -1,77 +0,0 @@ -import math -import time -import socket -import sys -from geometry_msgs.msg import TransformStamped - -import numpy as np -import rclpy -from rclpy.node import Node -from tf2_ros import TransformBroadcaster - - -from rclpy.node import Node - -host = "192.168.1.128" -port = 40923 -address = (host, int(port)) -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.connect(address) -s.send(("command;").encode('utf-8')) -abfangen = s.recv(1024) - -def quaternion_from_euler(ai, aj, ak): - ai /= 2.0 - aj /= 2.0 - ak /= 2.0 - ci = math.cos(ai) - si = math.sin(ai) - cj = math.cos(aj) - sj = math.sin(aj) - ck = math.cos(ak) - sk = math.sin(ak) - cc = ci*ck - cs = ci*sk - sc = si*ck - ss = si*sk - - q = np.empty((4, )) - q[0] = cj*sc - sj*cs - q[1] = cj*ss + sj*cc - q[2] = cj*cs - sj*sc - q[3] = cj*cc + sj*ss - - return q - -class Robomaster_odom(Node): - def __init__(self): - - while True: - super().__init__("robomaster_odom") - self.tf_broadcaster = TransformBroadcaster(self) - s.send(("chassis position ?;").encode('utf-8')) - buf = s.recv(1024) - xyz = buf.decode('utf-8') - self.get_logger().info(xyz) - xyzlist = xyz.split(" ") - t = TransformStamped() - t.header.stamp = self.get_clock().now().to_msg() - t.header.frame_id = 'odom' - t.child_frame_id = "base_footprint" - t.transform.translation.x = float(xyzlist[0]) - t.transform.translation.y = -float(xyzlist[1]) - t.transform.translation.z = 0.0 - q = quaternion_from_euler(0, 0, -float(xyzlist[2])* math.pi/180) - t.transform.rotation.x = q[0] - t.transform.rotation.y = q[1] - t.transform.rotation.z = q[2] - t.transform.rotation.w = q[3] - self.tf_broadcaster.sendTransform(t) - time.sleep(0.5) - -def main(): - rclpy.init() - node = Robomaster_odom() - - rclpy.spin(node) - rclpy.shutdown() \ No newline at end of file diff --git a/robomaster_pi/robot_ros_vel_wifi.py b/robomaster_pi/robot_ros_vel_wifi.py deleted file mode 100644 index 8ce573d2f141497d42d49c759eefa64057e20b72..0000000000000000000000000000000000000000 --- a/robomaster_pi/robot_ros_vel_wifi.py +++ /dev/null @@ -1,42 +0,0 @@ -import math -import time -import socket -import sys -from geometry_msgs.msg import TransformStamped - -import numpy as np -import rclpy -from rclpy.node import Node -from geometry_msgs.msg import Twist -from tf2_ros import TransformBroadcaster - - -from rclpy.node import Node - -host = "192.168.1.128" -port = 40923 -address = (host, int(port)) -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.connect(address) -s.send(("command;").encode('utf-8')) - - -class vel_from_ros_node(Node): - - def __init__(self): - super().__init__("vel_from_ros") - self.get_vel_from_ros_ = self.create_subscription( - Twist, "/cmd_vel", self.pose_callback, 10) - - def pose_callback(self, msg: Twist): - command = "chassis speed x " + str(msg.linear.x) + " y " + str(msg.linear.y) + " z " + str(msg.angular.z) + ";" - s.send(command.encode('utf-8')) - - - - -def main(): - rclpy.init() - node2 = vel_from_ros_node() - rclpy.spin(node2) - rclpy.shutdown() \ No newline at end of file diff --git a/setup.py b/setup.py index 4b1276618662ceba75cfadfbff31f74011a51428..0cabf1f31b876b558a39643f30368dd87eca8a13 100644 --- a/setup.py +++ b/setup.py @@ -20,10 +20,9 @@ setup( tests_require=['pytest'], entry_points={ 'console_scripts': [ + "connection = robomaster_pi.connection:main" "robot_ros_vel = robomaster_pi.robot_ros_vel:main", "robot_ros_odom = robomaster_pi.robot_ros_odom:main", - "robot_ros_vel_wifi = robomaster_pi.robot_ros_vel_wifi:main", - "robot_ros_odom_wifi = robomaster_pi.robot_ros_odom_wifi:main" ], }, )